diff options
423 files changed, 7218 insertions, 31556 deletions
diff --git a/common b/common -Subproject 11f0cd5a3fba36f85cf3e434150bfe66b1bf08d +Subproject 0546e5881d1ec7137c71d35247729e28c1a4ab6 diff --git a/configure.ac b/configure.ac index 0a35b0be5..4d179209c 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.60) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, cvs and prerelease does Werror too -AC_INIT(GStreamer Bad Plug-ins, 0.10.22.1, +AC_INIT(GStreamer Bad Plug-ins, 0.11.0.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-plugins-bad) @@ -38,7 +38,7 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])], dnl our libraries and install dirs use major.minor as a version GST_MAJORMINOR=$GST_PLUGINS_BAD_VERSION_MAJOR.$GST_PLUGINS_BAD_VERSION_MINOR dnl we override it here if we need to for the release candidate of new series -GST_MAJORMINOR=0.10 +GST_MAJORMINOR=0.11 AC_SUBST(GST_MAJORMINOR) AG_GST_LIBTOOL_PREPARE @@ -52,8 +52,8 @@ AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** -GST_REQ=0.10.35.1 -GSTPB_REQ=0.10.35.1 +GST_REQ=0.11.0.1 +GSTPB_REQ=0.11.0.1 dnl *** autotools stuff **** @@ -194,9 +194,9 @@ AM_CONDITIONAL(HAVE_GST_CHECK, test "x$HAVE_GST_CHECK" = "xyes") AG_GST_CHECK_GST_PLUGINS_BASE($GST_MAJORMINOR, [$GSTPB_REQ], yes) dnl check for uninstalled plugin directories for unit tests -AG_GST_CHECK_GST_PLUGINS_GOOD($GST_MAJORMINOR, [0.10.25]) -AG_GST_CHECK_GST_PLUGINS_UGLY($GST_MAJORMINOR, [0.10.16]) -AG_GST_CHECK_GST_PLUGINS_FFMPEG($GST_MAJORMINOR, [0.10.11]) +AG_GST_CHECK_GST_PLUGINS_GOOD($GST_MAJORMINOR, [0.11.0]) +AG_GST_CHECK_GST_PLUGINS_UGLY($GST_MAJORMINOR, [0.11.0]) +AG_GST_CHECK_GST_PLUGINS_FFMPEG($GST_MAJORMINOR, [0.11.0]) dnl Check for documentation xrefs GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" @@ -293,6 +293,24 @@ dnl used in examples AG_GST_DEFAULT_ELEMENTS dnl *** plug-ins to include *** +dnl Non ported plugins (non-dependant, then dependant) +dnl Make sure you have a space before and after all plugins +GST_PLUGINS_NONPORTED=" adpcmdec adpcmenc aiff asfmux \ + autoconvert camerabin cdxaparse coloreffects \ + dccp debugutils dtmf faceoverlay festival \ + fieldanalysis freeverb freeze frei0r gaudieffects geometrictransform h264parse \ + hdvparse hls id3tag inter interlace ivfparse jpegformat jp2kdecimator \ + kate liveadder legacyresample librfb mpegdemux mpegtsmux \ + mpegpsmux mpegvideoparse mve mxf mythtv nsf nuvdemux \ + patchdetect pcapparse pnm rawparse real removesilence rtpmux rtpvp8 scaletempo \ + sdi segmentclip siren speed subenc stereo tta videofilters \ + videomaxrate videomeasure videosignal vmnc \ + decklink fbdev linsys shm vcd \ + voaacenc apexsink bz2 cdaudio celt cog curl dc1394 dirac directfb dts resindvd \ + gsettings gsm jp2k ladspa modplug mpeg2enc mplex mimic \ + musepack musicbrainz nas neon ofa openal opencv rsvg schro sdl smooth sndfile soundtouch spandsp timidity \ + wildmidi xvid apple_media " +AC_SUBST(GST_PLUGINS_NONPORTED) dnl these are all the gst plug-ins, compilable without additional libs AG_GST_CHECK_PLUGIN(adpcmdec) @@ -306,7 +324,6 @@ AG_GST_CHECK_PLUGIN(camerabin) AG_GST_CHECK_PLUGIN(camerabin2) AG_GST_CHECK_PLUGIN(cdxaparse) AG_GST_CHECK_PLUGIN(coloreffects) -AG_GST_CHECK_PLUGIN(colorspace) AG_GST_CHECK_PLUGIN(dataurisrc) AG_GST_CHECK_PLUGIN(dccp) AG_GST_CHECK_PLUGIN(debugutils) @@ -1870,6 +1887,7 @@ dnl FIXME: do we want to rename to GST_ALL_* ? dnl prefer internal headers to already installed ones dnl also add builddir include for enumtypes and marshal dnl add GST_OPTION_CFLAGS, but overridable +GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API" GST_CXXFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)" GST_CFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)" AC_SUBST(GST_CFLAGS) @@ -1917,7 +1935,6 @@ gst/bayer/Makefile gst/camerabin/Makefile gst/camerabin2/Makefile gst/cdxaparse/Makefile -gst/colorspace/Makefile gst/coloreffects/Makefile gst/dataurisrc/Makefile gst/dccp/Makefile diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am index 1ab46ff3b..016b843c8 100644 --- a/docs/libs/Makefile.am +++ b/docs/libs/Makefile.am @@ -49,14 +49,14 @@ extra_files = # CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib # contains GtkObjects/GObjects and you want to document signals and properties. -GTKDOC_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +GTKDOC_CFLAGS = -DGST_USE_UNSTABLE_API $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-@GST_MAJORMINOR@.la \ $(top_builddir)/gst-libs/gst/basecamerabinsrc/libgstbasecamerabinsrc-@GST_MAJORMINOR@.la \ $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la \ $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_MAJORMINOR@.la \ $(top_builddir)/gst-libs/gst/video/libgstbasevideo-@GST_MAJORMINOR@.la \ - $(GST_BASE_LIBS) + $(GST_BASE_LIBS) GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC) GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC) diff --git a/docs/libs/gst-plugins-bad-libs-sections.txt b/docs/libs/gst-plugins-bad-libs-sections.txt index b949137df..ca341d3e6 100644 --- a/docs/libs/gst-plugins-bad-libs-sections.txt +++ b/docs/libs/gst-plugins-bad-libs-sections.txt @@ -248,7 +248,7 @@ GST_PHOTOGRAPHY GST_IS_PHOTOGRAPHY GST_TYPE_PHOTOGRAPHY gst_photography_get_type -GST_PHOTOGRAPHY_GET_IFACE +GST_PHOTOGRAPHY_GET_INTERFACE </SECTION> <SECTION> diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt index d7fc96e95..4e9ec0b88 100644 --- a/docs/plugins/gst-plugins-bad-plugins-sections.txt +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -1768,7 +1768,7 @@ gst_photography_get_config <SUBSECTION Standard> GST_PHOTOGRAPHY GST_IS_PHOTOGRAPHY -GST_PHOTOGRAPHY_GET_IFACE +GST_PHOTOGRAPHY_GET_INTERFACE gst_photography_get_type </SECTION> diff --git a/ext/apexsink/gstapexsink.c b/ext/apexsink/gstapexsink.c index 5b3af3db1..9dec7bd6e 100644 --- a/ext/apexsink/gstapexsink.c +++ b/ext/apexsink/gstapexsink.c @@ -172,7 +172,7 @@ static GstStateChangeReturn gst_apexsink_change_state (GstElement * element, static void gst_apexsink_interfaces_init (GType type); static void gst_apexsink_implements_interface_init (GstImplementsInterfaceClass * iface); -static void gst_apexsink_mixer_interface_init (GstMixerClass * iface); +static void gst_apexsink_mixer_interface_init (GstMixerInterface * iface); static gboolean gst_apexsink_interface_supported (GstImplementsInterface * iface, GType iface_type); @@ -208,7 +208,7 @@ gst_apexsink_implements_interface_init (GstImplementsInterfaceClass * iface) } static void -gst_apexsink_mixer_interface_init (GstMixerClass * iface) +gst_apexsink_mixer_interface_init (GstMixerInterface * iface) { GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE; @@ -265,8 +265,8 @@ gst_apexsink_base_init (gpointer g_class) "Apple AirPort Express Audio Sink", "Sink/Audio/Wireless", "Output stream to an AirPort Express", "Jérémie Bernard [GRemi] <gremimail@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_apexsink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_apexsink_sink_factory)); } /* sink class init */ diff --git a/ext/arts/gst_arts.c b/ext/arts/gst_arts.c index 24a0aa348..90742289d 100644 --- a/ext/arts/gst_arts.c +++ b/ext/arts/gst_arts.c @@ -111,8 +111,10 @@ gst_arts_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sink_temp); - gst_element_class_add_static_pad_template (element_class, &src_temp); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_temp)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_temp)); gst_element_class_set_details_simple (element_class, "aRts plugin", "Filter/Audio", "aRts wrapper filter", "Erik Walthinsen <omega@temple-baptist.com, " diff --git a/ext/artsd/gstartsdsink.c b/ext/artsd/gstartsdsink.c index a27b3ebb6..79dd28d85 100644 --- a/ext/artsd/gstartsdsink.c +++ b/ext/artsd/gstartsdsink.c @@ -97,7 +97,8 @@ gst_artsdsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "aRtsd audio sink", "Sink/Audio", "Plays audio to an aRts server", diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c index b71e8e4d1..19016f5f6 100644 --- a/ext/assrender/gstassrender.c +++ b/ext/assrender/gstassrender.c @@ -57,23 +57,19 @@ enum PROP_EMBEDDEDFONTS }; +#define FORMATS "{ RGB, BGR, xRGB, xBGR, RGBx, BGRx, I420 }" + static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" - GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" - GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx ";" - GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (FORMATS)) ); static GstStaticPadTemplate video_sink_factory = - GST_STATIC_PAD_TEMPLATE ("video_sink", +GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" - GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" - GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx ";" - GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (FORMATS)) ); static GstStaticPadTemplate text_sink_factory = @@ -93,42 +89,30 @@ static void gst_ass_render_finalize (GObject * object); static GstStateChangeReturn gst_ass_render_change_state (GstElement * element, GstStateChange transition); -GST_BOILERPLATE (GstAssRender, gst_ass_render, GstElement, GST_TYPE_ELEMENT); +#define gst_ass_render_parent_class parent_class +G_DEFINE_TYPE (GstAssRender, gst_ass_render, GST_TYPE_ELEMENT); -static GstCaps *gst_ass_render_getcaps (GstPad * pad); +static GstCaps *gst_ass_render_getcaps (GstPad * pad, GstCaps * filter); static gboolean gst_ass_render_setcaps_video (GstPad * pad, GstCaps * caps); static gboolean gst_ass_render_setcaps_text (GstPad * pad, GstCaps * caps); -static GstFlowReturn gst_ass_render_chain_video (GstPad * pad, GstBuffer * buf); -static GstFlowReturn gst_ass_render_chain_text (GstPad * pad, GstBuffer * buf); - -static gboolean gst_ass_render_event_video (GstPad * pad, GstEvent * event); -static gboolean gst_ass_render_event_text (GstPad * pad, GstEvent * event); -static gboolean gst_ass_render_event_src (GstPad * pad, GstEvent * event); - -static GstFlowReturn gst_ass_render_bufferalloc_video (GstPad * pad, - guint64 offset, guint size, GstCaps * caps, GstBuffer ** buffer); - -static gboolean gst_ass_render_query_src (GstPad * pad, GstQuery * query); - -static void -gst_ass_render_base_init (gpointer gclass) -{ - GstElementClass *element_class = (GstElementClass *) gclass; +static GstFlowReturn gst_ass_render_chain_video (GstPad * pad, + GstObject * parent, GstBuffer * buf); +static GstFlowReturn gst_ass_render_chain_text (GstPad * pad, + GstObject * parent, GstBuffer * buf); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &text_sink_factory); +static gboolean gst_ass_render_event_video (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_ass_render_event_text (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_ass_render_event_src (GstPad * pad, GstObject * parent, + GstEvent * event); - gst_element_class_set_details_simple (element_class, "ASS/SSA Render", - "Mixer/Video/Overlay/Subtitle", - "Renders ASS/SSA subtitles with libass", - "Benjamin Schmitz <vortex@wolpzone.de>, " - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -} +static gboolean gst_ass_render_query_video (GstPad * pad, GstObject * parent, + GstQuery * query); +static gboolean gst_ass_render_query_src (GstPad * pad, GstObject * parent, + GstQuery * query); /* initialize the plugin's class */ static void @@ -152,6 +136,19 @@ gst_ass_render_class_init (GstAssRenderClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_ass_render_change_state); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&video_sink_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&text_sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, "ASS/SSA Render", + "Mixer/Video/Overlay/Subtitle", + "Renders ASS/SSA subtitles with libass", + "Benjamin Schmitz <vortex@wolpzone.de>, " + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); } #if defined(LIBASS_VERSION) && LIBASS_VERSION >= 0x00907000 @@ -177,7 +174,7 @@ _libass_message_cb (gint level, const gchar * fmt, va_list args, #endif static void -gst_ass_render_init (GstAssRender * render, GstAssRenderClass * gclass) +gst_ass_render_init (GstAssRender * render) { GST_DEBUG_OBJECT (render, "init"); @@ -187,16 +184,6 @@ gst_ass_render_init (GstAssRender * render, GstAssRenderClass * gclass) render->text_sinkpad = gst_pad_new_from_static_template (&text_sink_factory, "text_sink"); - gst_pad_set_setcaps_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_ass_render_setcaps_video)); - gst_pad_set_setcaps_function (render->text_sinkpad, - GST_DEBUG_FUNCPTR (gst_ass_render_setcaps_text)); - - gst_pad_set_getcaps_function (render->srcpad, - GST_DEBUG_FUNCPTR (gst_ass_render_getcaps)); - gst_pad_set_getcaps_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_ass_render_getcaps)); - gst_pad_set_chain_function (render->video_sinkpad, GST_DEBUG_FUNCPTR (gst_ass_render_chain_video)); gst_pad_set_chain_function (render->text_sinkpad, @@ -209,18 +196,16 @@ gst_ass_render_init (GstAssRender * render, GstAssRenderClass * gclass) gst_pad_set_event_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_ass_render_event_src)); - gst_pad_set_bufferalloc_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_ass_render_bufferalloc_video)); - gst_pad_set_query_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_ass_render_query_src)); + gst_pad_set_query_function (render->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_ass_render_query_video)); gst_element_add_pad (GST_ELEMENT (render), render->srcpad); gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad); gst_element_add_pad (GST_ELEMENT (render), render->text_sinkpad); - render->width = 0; - render->height = 0; + gst_video_info_init (&render->info); render->subtitle_mutex = g_mutex_new (); render->subtitle_cond = g_cond_new (); @@ -372,21 +357,34 @@ gst_ass_render_change_state (GstElement * element, GstStateChange transition) } static gboolean -gst_ass_render_query_src (GstPad * pad, GstQuery * query) +gst_ass_render_query_src (GstPad * pad, GstObject * parent, GstQuery * query) { - GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); - gboolean ret; + gboolean res = FALSE; - ret = gst_pad_peer_query (render->video_sinkpad, query); + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; - gst_object_unref (render); - return ret; + gst_query_parse_caps (query, &filter); + caps = gst_ass_render_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; } static gboolean -gst_ass_render_event_src (GstPad * pad, GstEvent * event) +gst_ass_render_event_src (GstPad * pad, GstObject * parent, GstEvent * event) { - GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); + GstAssRender *render = GST_ASS_RENDER (parent); gboolean ret = FALSE; switch (GST_EVENT_TYPE (event)) { @@ -427,13 +425,11 @@ gst_ass_render_event_src (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } static GstCaps * -gst_ass_render_getcaps (GstPad * pad) +gst_ass_render_getcaps (GstPad * pad, GstCaps * filter) { GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); GstPad *otherpad; @@ -445,7 +441,7 @@ gst_ass_render_getcaps (GstPad * pad) otherpad = render->srcpad; /* we can do what the peer can */ - caps = gst_pad_peer_get_caps (otherpad); + caps = gst_pad_peer_query_caps (otherpad, filter); if (caps) { GstCaps *temp; const GstCaps *templ; @@ -468,19 +464,24 @@ gst_ass_render_getcaps (GstPad * pad) #define CREATE_RGB_BLIT_FUNCTION(name,bpp,R,G,B) \ static void \ -blit_##name (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) \ +blit_##name (GstAssRender * render, ASS_Image * ass_image, GstVideoFrame * frame) \ { \ guint counter = 0; \ gint alpha, r, g, b, k; \ const guint8 *src; \ - guint8 *dst; \ + guint8 *dst, *data; \ gint x, y, w, h; \ - gint width = render->width; \ - gint height = render->height; \ - gint dst_stride = GST_ROUND_UP_4 (width * bpp); \ + gint width; \ + gint height; \ + gint dst_stride; \ gint dst_skip; \ gint src_skip; \ \ + width = GST_VIDEO_FRAME_WIDTH (frame); \ + height = GST_VIDEO_FRAME_HEIGHT (frame); \ + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); \ + data = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); \ + \ while (ass_image) { \ if (ass_image->dst_y > height || ass_image->dst_x > width) \ goto next; \ @@ -491,7 +492,7 @@ blit_##name (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) \ g = ((ass_image->color) >> 16) & 0xff; \ b = ((ass_image->color) >> 8) & 0xff; \ src = ass_image->bitmap; \ - dst = buffer->data + ass_image->dst_y * dst_stride + ass_image->dst_x * bpp; \ + dst = data + ass_image->dst_y * dst_stride + ass_image->dst_x * bpp; \ \ w = MIN (ass_image->w, width - ass_image->dst_x); \ h = MIN (ass_image->h, height - ass_image->dst_y); \ @@ -561,7 +562,7 @@ rgb_to_v (gint r, gint g, gint b) } static void -blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) +blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstVideoFrame * frame) { guint counter = 0; gint alpha, r, g, b, k, k2; @@ -574,25 +575,20 @@ blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) gint w2; gint src_stride; #endif - gint width = render->width; - gint height = render->height; - gint y_offset, y_stride; - gint u_offset, u_stride; - gint v_offset, v_stride; - - y_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, width, - height); - u_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 1, width, - height); - v_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 2, width, - height); - - y_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, width); - u_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, width); - v_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 2, width); + gint width, height; + guint8 *y_data, *u_data, *v_data; + gint y_stride, u_stride, v_stride; + + width = GST_VIDEO_FRAME_WIDTH (frame); + height = GST_VIDEO_FRAME_HEIGHT (frame); + + y_data = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + u_data = GST_VIDEO_FRAME_COMP_DATA (frame, 1); + v_data = GST_VIDEO_FRAME_COMP_DATA (frame, 2); + + y_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + u_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 1); + v_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 2); while (ass_image) { if (ass_image->dst_y > height || ass_image->dst_x > width) @@ -618,19 +614,14 @@ blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) #endif src = ass_image->bitmap; - dst_y = - buffer->data + y_offset + ass_image->dst_y * y_stride + - ass_image->dst_x; - dst_u = - buffer->data + u_offset + (ass_image->dst_y / 2) * u_stride + - ass_image->dst_x / 2; - dst_v = - buffer->data + v_offset + (ass_image->dst_y / 2) * v_stride + - ass_image->dst_x / 2; +#if 0 + dst_y = y_data + ass_image->dst_y * y_stride + ass_image->dst_x; + dst_u = u_data + (ass_image->dst_y / 2) * u_stride + ass_image->dst_x / 2; + dst_v = v_data + (ass_image->dst_y / 2) * v_stride + ass_image->dst_x / 2; +#endif for (y = 0; y < h; y++) { - dst_y = buffer->data + y_offset + (ass_image->dst_y + y) * y_stride + - ass_image->dst_x; + dst_y = y_data + (ass_image->dst_y + y) * y_stride + ass_image->dst_x; for (x = 0; x < w; x++) { k = src[y * ass_image->w + x] * alpha / 255; dst_y[x] = (k * Y + (255 - k) * dst_y[x]) / 255; @@ -639,12 +630,8 @@ blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) y = 0; if (ass_image->dst_y & 1) { - dst_u = - buffer->data + u_offset + (ass_image->dst_y / 2) * u_stride + - ass_image->dst_x / 2; - dst_v = - buffer->data + v_offset + (ass_image->dst_y / 2) * v_stride + - ass_image->dst_x / 2; + dst_u = u_data + (ass_image->dst_y / 2) * u_stride + ass_image->dst_x / 2; + dst_v = v_data + (ass_image->dst_y / 2) * v_stride + ass_image->dst_x / 2; x = 0; if (ass_image->dst_x & 1) { k2 = src[y * ass_image->w + x] * alpha / 255; @@ -673,11 +660,9 @@ blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) } for (; y < h - 1; y += 2) { - dst_u = - buffer->data + u_offset + ((ass_image->dst_y + y) / 2) * u_stride + + dst_u = u_data + ((ass_image->dst_y + y) / 2) * u_stride + ass_image->dst_x / 2; - dst_v = - buffer->data + v_offset + ((ass_image->dst_y + y) / 2) * v_stride + + dst_v = v_data + ((ass_image->dst_y + y) / 2) * v_stride + ass_image->dst_x / 2; x = 0; if (ass_image->dst_x & 1) { @@ -711,12 +696,8 @@ blit_i420 (GstAssRender * render, ASS_Image * ass_image, GstBuffer * buffer) } if (y < h) { - dst_u = - buffer->data + u_offset + (ass_image->dst_y / 2) * u_stride + - ass_image->dst_x / 2; - dst_v = - buffer->data + v_offset + (ass_image->dst_y / 2) * v_stride + - ass_image->dst_x / 2; + dst_u = u_data + (ass_image->dst_y / 2) * u_stride + ass_image->dst_x / 2; + dst_v = v_data + (ass_image->dst_y / 2) * v_stride + ass_image->dst_x / 2; x = 0; if (ass_image->dst_x & 1) { k2 = src[y * ass_image->w + x] * alpha / 255; @@ -761,25 +742,18 @@ gst_ass_render_setcaps_video (GstPad * pad, GstCaps * caps) gboolean ret = FALSE; gint par_n = 1, par_d = 1; gdouble dar; + GstVideoInfo info; - render->width = 0; - render->height = 0; + if (!gst_video_info_from_caps (&info, caps)) + goto invalid_caps; - if (!gst_video_format_parse_caps (caps, &render->format, &render->width, - &render->height) || - !gst_video_parse_caps_framerate (caps, &render->fps_n, &render->fps_d)) { - GST_ERROR_OBJECT (render, "Can't parse caps: %" GST_PTR_FORMAT, caps); - ret = FALSE; - goto out; - } - - gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d); + render->info = info; ret = gst_pad_set_caps (render->srcpad, caps); if (!ret) goto out; - switch (render->format) { + switch (GST_VIDEO_INFO_FORMAT (&info)) { case GST_VIDEO_FORMAT_RGB: render->blit = blit_rgb; break; @@ -807,15 +781,15 @@ gst_ass_render_setcaps_video (GstPad * pad, GstCaps * caps) } g_mutex_lock (render->ass_mutex); - ass_set_frame_size (render->ass_renderer, render->width, render->height); + ass_set_frame_size (render->ass_renderer, info.width, info.height); - dar = (((gdouble) par_n) * ((gdouble) render->width)) - / (((gdouble) par_d) * ((gdouble) render->height)); + dar = (((gdouble) par_n) * ((gdouble) info.width)) + / (((gdouble) par_d) * ((gdouble) info.height)); #if !defined(LIBASS_VERSION) || LIBASS_VERSION < 0x00907000 ass_set_aspect_ratio (render->ass_renderer, dar); #else ass_set_aspect_ratio (render->ass_renderer, - dar, ((gdouble) render->width) / ((gdouble) render->height)); + dar, ((gdouble) info.width) / ((gdouble) info.height)); #endif ass_set_font_scale (render->ass_renderer, 1.0); ass_set_hinting (render->ass_renderer, ASS_HINTING_LIGHT); @@ -839,6 +813,14 @@ out: gst_object_unref (render); return ret; + + /* ERRORS */ +invalid_caps: + { + GST_ERROR_OBJECT (render, "Can't parse caps: %" GST_PTR_FORMAT, caps); + ret = FALSE; + goto out; + } } static gboolean @@ -849,7 +831,7 @@ gst_ass_render_setcaps_text (GstPad * pad, GstCaps * caps) const GValue *value; GstBuffer *priv; gchar *codec_private; - guint codec_private_size; + gsize codec_private_size; gboolean ret = FALSE; structure = gst_caps_get_structure (caps, 0); @@ -864,8 +846,8 @@ gst_ass_render_setcaps_text (GstPad * pad, GstCaps * caps) priv = gst_value_get_buffer (value); g_return_val_if_fail (priv != NULL, FALSE); - codec_private = (gchar *) GST_BUFFER_DATA (priv); - codec_private_size = GST_BUFFER_SIZE (priv); + codec_private = + gst_buffer_map (priv, &codec_private_size, NULL, GST_MAP_READ); if (!render->ass_track) render->ass_track = ass_new_track (render->ass_library); @@ -873,6 +855,8 @@ gst_ass_render_setcaps_text (GstPad * pad, GstCaps * caps) ass_process_codec_private (render->ass_track, codec_private, codec_private_size); + gst_buffer_unmap (priv, codec_private, codec_private_size); + GST_DEBUG_OBJECT (render, "ass track created"); render->track_init_ok = TRUE; @@ -897,8 +881,8 @@ static void gst_ass_render_process_text (GstAssRender * render, GstBuffer * buffer, GstClockTime running_time, GstClockTime duration) { - gchar *data = (gchar *) GST_BUFFER_DATA (buffer); - guint size = GST_BUFFER_SIZE (buffer); + gchar *data; + gsize size; gdouble pts_start, pts_end; pts_start = running_time; @@ -910,41 +894,25 @@ gst_ass_render_process_text (GstAssRender * render, GstBuffer * buffer, "Processing subtitles with running time %" GST_TIME_FORMAT " and duration %" GST_TIME_FORMAT, GST_TIME_ARGS (running_time), GST_TIME_ARGS (duration)); + + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + g_mutex_lock (render->ass_mutex); ass_process_chunk (render->ass_track, data, size, pts_start, pts_end); g_mutex_unlock (render->ass_mutex); - gst_buffer_unref (buffer); -} - -static GstFlowReturn -gst_ass_render_bufferalloc_video (GstPad * pad, guint64 offset, guint size, - GstCaps * caps, GstBuffer ** buffer) -{ - GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); - GstFlowReturn ret = GST_FLOW_WRONG_STATE; - GstPad *allocpad; - - GST_OBJECT_LOCK (render); - allocpad = render->srcpad ? gst_object_ref (render->srcpad) : NULL; - GST_OBJECT_UNLOCK (render); - if (allocpad) { - ret = gst_pad_alloc_buffer (allocpad, offset, size, caps, buffer); - gst_object_unref (allocpad); - } - - gst_object_unref (render); - - return ret; + gst_buffer_unmap (buffer, data, size); + gst_buffer_unref (buffer); } static GstFlowReturn -gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer) +gst_ass_render_chain_video (GstPad * pad, GstObject * parent, + GstBuffer * buffer) { - GstAssRender *render = GST_ASS_RENDER (GST_PAD_PARENT (pad)); + GstAssRender *render = GST_ASS_RENDER (parent); GstFlowReturn ret = GST_FLOW_OK; gboolean in_seg = FALSE; - gint64 start, stop, clip_start = 0, clip_stop = 0; + guint64 start, stop, clip_start = 0, clip_stop = 0; ASS_Image *ass_image; if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { @@ -977,14 +945,13 @@ gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer) /* if the buffer is only partially in the segment, fix up stamps */ if (clip_start != start || (stop != -1 && clip_stop != stop)) { GST_DEBUG_OBJECT (render, "clipping buffer timestamp/duration to segment"); - buffer = gst_buffer_make_metadata_writable (buffer); + buffer = gst_buffer_make_writable (buffer); GST_BUFFER_TIMESTAMP (buffer) = clip_start; if (stop != -1) GST_BUFFER_DURATION (buffer) = clip_stop - clip_start; } - gst_segment_set_last_stop (&render->video_segment, GST_FORMAT_TIME, - clip_start); + render->video_segment.position = clip_start; g_mutex_lock (render->subtitle_mutex); if (render->subtitle_pending) { @@ -1054,8 +1021,13 @@ gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer) g_mutex_unlock (render->ass_mutex); if (ass_image != NULL) { + GstVideoFrame frame; + buffer = gst_buffer_make_writable (buffer); - render->blit (render, ass_image, buffer); + + gst_video_frame_map (&frame, &render->info, buffer, GST_MAP_WRITE); + render->blit (render, ass_image, &frame); + gst_video_frame_unmap (&frame); } else { GST_LOG_OBJECT (render, "nothing to render right now"); } @@ -1076,14 +1048,14 @@ out_of_segment: } static GstFlowReturn -gst_ass_render_chain_text (GstPad * pad, GstBuffer * buffer) +gst_ass_render_chain_text (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; - GstAssRender *render = GST_ASS_RENDER (GST_PAD_PARENT (pad)); + GstAssRender *render = GST_ASS_RENDER (parent); GstClockTime timestamp, duration; GstClockTime sub_running_time, vid_running_time; GstClockTime sub_running_time_end; - gint64 cstart, cstop; + guint64 cstart, cstop; gboolean in_seg; if (render->subtitle_flushing) { @@ -1117,8 +1089,7 @@ gst_ass_render_chain_text (GstPad * pad, GstBuffer * buffer) GST_BUFFER_TIMESTAMP (buffer) = timestamp = cstart; GST_BUFFER_DURATION (buffer) = duration = cstop - cstart; - gst_segment_set_last_stop (&render->subtitle_segment, GST_FORMAT_TIME, - GST_BUFFER_TIMESTAMP (buffer)); + render->subtitle_segment.position = GST_BUFFER_TIMESTAMP (buffer); sub_running_time = gst_segment_to_running_time (&render->subtitle_segment, GST_FORMAT_TIME, @@ -1128,11 +1099,12 @@ gst_ass_render_chain_text (GstPad * pad, GstBuffer * buffer) timestamp + duration); vid_running_time = gst_segment_to_running_time (&render->video_segment, GST_FORMAT_TIME, - render->video_segment.last_stop); + render->video_segment.position); - if (render->fps_n && render->fps_d) + if (render->info.fps_n && render->info.fps_d) vid_running_time += - gst_util_uint64_scale (GST_SECOND, render->fps_d, render->fps_n); + gst_util_uint64_scale (GST_SECOND, render->info.fps_d, + render->info.fps_n); if (sub_running_time > vid_running_time + GST_SECOND / 2) { g_assert (render->subtitle_pending == NULL); @@ -1174,6 +1146,7 @@ gst_ass_render_chain_text (GstPad * pad, GstBuffer * buffer) static void gst_ass_render_handle_tags (GstAssRender * render, GstTagList * taglist) { +#if 0 static const gchar *mimetypes[] = { "application/x-font-ttf", "application/x-font-otf", @@ -1183,14 +1156,15 @@ gst_ass_render_handle_tags (GstAssRender * render, GstTagList * taglist) ".otf", ".ttf" }; +#endif guint tag_size; - guint index; if (!taglist) return; tag_size = gst_tag_list_get_tag_size (taglist, GST_TAG_ATTACHMENT); if (tag_size > 0 && render->embeddedfonts) { +#if 0 const GValue *value; GstBuffer *buf; GstCaps *caps; @@ -1198,10 +1172,13 @@ gst_ass_render_handle_tags (GstAssRender * render, GstTagList * taglist) gboolean valid_mimetype, valid_extension; guint j; const gchar *filename; +#endif + guint index; GST_DEBUG_OBJECT (render, "TAG event has attachments"); for (index = 0; index < tag_size; index++) { +#if 0 value = gst_tag_list_get_value_index (taglist, GST_TAG_ATTACHMENT, index); buf = gst_value_get_buffer (value); if (!buf || !GST_BUFFER_CAPS (buf)) @@ -1241,38 +1218,43 @@ gst_ass_render_handle_tags (GstAssRender * render, GstTagList * taglist) GST_DEBUG_OBJECT (render, "registered new font %s", filename); g_mutex_unlock (render->ass_mutex); } +#endif } } } static gboolean -gst_ass_render_event_video (GstPad * pad, GstEvent * event) +gst_ass_render_event_video (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean ret = FALSE; - GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); + GstAssRender *render = GST_ASS_RENDER (parent); GST_DEBUG_OBJECT (pad, "received video event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_ass_render_setcaps_video (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_SEGMENT: { - GstFormat format; - gdouble rate; - gint64 start, stop, time; - gboolean update; + GstSegment segment; GST_DEBUG_OBJECT (render, "received new segment"); - gst_event_parse_new_segment (event, &update, &rate, &format, &start, - &stop, &time); + gst_event_copy_segment (event, &segment); - if (format == GST_FORMAT_TIME) { + if (segment.format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (render, "VIDEO SEGMENT now: %" GST_SEGMENT_FORMAT, &render->video_segment); - gst_segment_set_newsegment (&render->video_segment, update, rate, - format, start, stop, time); + render->video_segment = segment; GST_DEBUG_OBJECT (render, "VIDEO SEGMENT after: %" GST_SEGMENT_FORMAT, &render->video_segment); @@ -1304,39 +1286,66 @@ gst_ass_render_event_video (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } static gboolean -gst_ass_render_event_text (GstPad * pad, GstEvent * event) +gst_ass_render_query_video (GstPad * pad, GstObject * parent, GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_ass_render_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + +static gboolean +gst_ass_render_event_text (GstPad * pad, GstObject * parent, GstEvent * event) { gint i; gboolean ret = FALSE; - GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad)); + GstAssRender *render = GST_ASS_RENDER (parent); GST_DEBUG_OBJECT (pad, "received text event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_CAPS: { - GstFormat format; - gdouble rate; - gint64 start, stop, time; - gboolean update; + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_ass_render_setcaps_text (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_SEGMENT: + { + GstSegment segment; GST_DEBUG_OBJECT (render, "received new segment"); - gst_event_parse_new_segment (event, &update, &rate, &format, &start, - &stop, &time); + gst_event_copy_segment (event, &segment); - if (format == GST_FORMAT_TIME) { + if (segment.format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (render, "SUBTITLE SEGMENT now: %" GST_SEGMENT_FORMAT, &render->subtitle_segment); - gst_segment_set_newsegment (&render->subtitle_segment, update, rate, - format, start, stop, time); + render->subtitle_segment = segment; GST_DEBUG_OBJECT (render, "SUBTITLE SEGMENT after: %" GST_SEGMENT_FORMAT, @@ -1404,8 +1413,6 @@ gst_ass_render_event_text (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } diff --git a/ext/assrender/gstassrender.h b/ext/assrender/gstassrender.h index 4b58e2588..23dd4df24 100644 --- a/ext/assrender/gstassrender.h +++ b/ext/assrender/gstassrender.h @@ -43,7 +43,7 @@ G_BEGIN_DECLS typedef struct _GstAssRender GstAssRender; typedef struct _GstAssRenderClass GstAssRenderClass; -typedef void (*GstAssRenderBlitFunction) (GstAssRender *render, ASS_Image *ass_image, GstBuffer *buffer); +typedef void (*GstAssRenderBlitFunction) (GstAssRender *render, ASS_Image *ass_image, GstVideoFrame *frame); struct _GstAssRender { @@ -57,9 +57,7 @@ struct _GstAssRender /* <private> */ GstSegment video_segment; - GstVideoFormat format; - gint width, height; - gint fps_n, fps_d; + GstVideoInfo info; GstAssRenderBlitFunction blit; GMutex *subtitle_mutex; diff --git a/ext/audiofile/gstafparse.c b/ext/audiofile/gstafparse.c index 634d09abc..27b5a6e8c 100644 --- a/ext/audiofile/gstafparse.c +++ b/ext/audiofile/gstafparse.c @@ -114,10 +114,10 @@ gst_afparse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &afparse_src_factory); - gst_element_class_add_static_pad_template (element_class, - &afparse_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&afparse_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&afparse_sink_factory)); gst_element_class_set_details_simple (element_class, "Audiofile demuxer", "Codec/Demuxer/Audio", diff --git a/ext/audiofile/gstafsink.c b/ext/audiofile/gstafsink.c index b8a25f6ab..79fc7abdb 100644 --- a/ext/audiofile/gstafsink.c +++ b/ext/audiofile/gstafsink.c @@ -138,8 +138,8 @@ gst_afsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &afsink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&afsink_sink_factory)); gst_element_class_set_details_simple (element_class, "Audiofile sink", "Sink/Audio", "Write audio streams to disk using libaudiofile", diff --git a/ext/audiofile/gstafsrc.c b/ext/audiofile/gstafsrc.c index bc7648ad5..2a750a378 100644 --- a/ext/audiofile/gstafsrc.c +++ b/ext/audiofile/gstafsrc.c @@ -135,8 +135,8 @@ gst_afsrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &afsrc_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&afsrc_src_factory)); gst_element_class_set_details_simple (element_class, "Audiofile source", "Source/Audio", "Read audio files from disk using libaudiofile", diff --git a/ext/audioresample/gstaudioresample.c b/ext/audioresample/gstaudioresample.c index 7b81b93cc..5e7fafc31 100644 --- a/ext/audioresample/gstaudioresample.c +++ b/ext/audioresample/gstaudioresample.c @@ -115,10 +115,10 @@ static void gst_audioresample_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_audioresample_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_audioresample_sink_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_audioresample_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_audioresample_sink_template)); gst_element_class_set_details_simple (gstelement_class, "Audio scaler", "Filter/Converter/Audio", diff --git a/ext/bz2/gstbz2dec.c b/ext/bz2/gstbz2dec.c index 48bca484e..ac53f6095 100644 --- a/ext/bz2/gstbz2dec.c +++ b/ext/bz2/gstbz2dec.c @@ -212,8 +212,10 @@ gst_bz2dec_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (ec, &sink_template); - gst_element_class_add_static_pad_template (ec, &src_template); + gst_element_class_add_pad_template (ec, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (ec, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (ec, "BZ2 decoder", "Codec/Decoder", "Decodes compressed streams", "Lutz Mueller <lutz@users.sourceforge.net>"); diff --git a/ext/bz2/gstbz2enc.c b/ext/bz2/gstbz2enc.c index 1b9febad0..83a6b2e09 100644 --- a/ext/bz2/gstbz2enc.c +++ b/ext/bz2/gstbz2enc.c @@ -262,8 +262,10 @@ gst_bz2enc_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (ec, &sink_template); - gst_element_class_add_static_pad_template (ec, &src_template); + gst_element_class_add_pad_template (ec, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (ec, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (ec, "BZ2 encoder", "Codec/Encoder", "Compresses streams", "Lutz Mueller <lutz@users.sourceforge.net>"); diff --git a/ext/celt/gstceltdec.c b/ext/celt/gstceltdec.c index 84b2d203f..7227ab5d6 100644 --- a/ext/celt/gstceltdec.c +++ b/ext/celt/gstceltdec.c @@ -44,6 +44,7 @@ #include "gstceltdec.h" #include <string.h> #include <gst/tag/tag.h> +#include <gst/audio/audio.h> GST_DEBUG_CATEGORY_STATIC (celtdec_debug); #define GST_CAT_DEFAULT celtdec_debug @@ -54,11 +55,9 @@ static GstStaticPadTemplate celt_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 32000, 64000 ], " - "channels = (int) [ 1, 2 ], " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "rate = (int) [ 32000, 64000 ], " "channels = (int) [ 1, 2 ]") ); static GstStaticPadTemplate celt_dec_sink_factory = @@ -68,8 +67,8 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_CAPS ("audio/x-celt") ); -GST_BOILERPLATE (GstCeltDec, gst_celt_dec, GstAudioDecoder, - GST_TYPE_AUDIO_DECODER); +#define gst_celt_dec_parent_class parent_class +G_DEFINE_TYPE (GstCeltDec, gst_celt_dec, GST_TYPE_AUDIO_DECODER); static gboolean gst_celt_dec_start (GstAudioDecoder * dec); static gboolean gst_celt_dec_stop (GstAudioDecoder * dec); @@ -79,21 +78,6 @@ static GstFlowReturn gst_celt_dec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer); static void -gst_celt_dec_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &celt_dec_src_factory); - gst_element_class_add_static_pad_template (element_class, - &celt_dec_sink_factory); - gst_element_class_set_details_simple (element_class, "Celt audio decoder", - "Codec/Decoder/Audio", - "decode celt streams to audio", - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -} - -static void gst_celt_dec_class_init (GstCeltDecClass * klass) { GstAudioDecoderClass *gstbase_class; @@ -105,6 +89,16 @@ gst_celt_dec_class_init (GstCeltDecClass * klass) gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_celt_dec_set_format); gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_celt_dec_handle_frame); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&celt_dec_src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&celt_dec_sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, "Celt audio decoder", + "Codec/Decoder/Audio", + "decode celt streams to audio", + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); + GST_DEBUG_CATEGORY_INIT (celtdec_debug, "celtdec", 0, "celt decoding element"); } @@ -134,7 +128,7 @@ gst_celt_dec_reset (GstCeltDec * dec) } static void -gst_celt_dec_init (GstCeltDec * dec, GstCeltDecClass * g_class) +gst_celt_dec_init (GstCeltDec * dec) { gst_celt_dec_reset (dec); } diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c index befb9ac83..19c8b9ff3 100644 --- a/ext/celt/gstceltenc.c +++ b/ext/celt/gstceltenc.c @@ -150,8 +150,10 @@ gst_celt_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Celt audio encoder", "Codec/Encoder/Audio", "Encodes audio in Celt format", diff --git a/ext/cog/gstcogcolorspace.c b/ext/cog/gstcogcolorspace.c index 3c84c32a5..4a96e5c1f 100644 --- a/ext/cog/gstcogcolorspace.c +++ b/ext/cog/gstcogcolorspace.c @@ -126,10 +126,10 @@ gst_cogcolorspace_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_cogcolorspace_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_cogcolorspace_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cogcolorspace_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cogcolorspace_sink_template)); gst_element_class_set_details_simple (element_class, "YCbCr/RGB format conversion", "Filter/Converter/Video", diff --git a/ext/cog/gstcogdownsample.c b/ext/cog/gstcogdownsample.c index 5122f4a6b..c929c12ec 100644 --- a/ext/cog/gstcogdownsample.c +++ b/ext/cog/gstcogdownsample.c @@ -132,10 +132,10 @@ gst_cogdownsample_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_cogdownsample_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_cogdownsample_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cogdownsample_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cogdownsample_sink_template)); gst_element_class_set_details_simple (element_class, "Scale down video by factor of 2", "Filter/Effect/Video", diff --git a/ext/cog/gstcogmse.c b/ext/cog/gstcogmse.c index 09f1ffc42..8eb63bec3 100644 --- a/ext/cog/gstcogmse.c +++ b/ext/cog/gstcogmse.c @@ -135,12 +135,12 @@ gst_mse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_framestore_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_framestore_sink_ref_template); - gst_element_class_add_static_pad_template (element_class, - &gst_framestore_sink_test_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_framestore_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_framestore_sink_ref_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_framestore_sink_test_template)); gst_element_class_set_details_simple (element_class, "Calculate MSE", "Filter/Effect", diff --git a/ext/cog/gstcogscale.c b/ext/cog/gstcogscale.c index 10587f5b8..52585ac90 100644 --- a/ext/cog/gstcogscale.c +++ b/ext/cog/gstcogscale.c @@ -207,10 +207,10 @@ gst_cog_scale_base_init (gpointer g_class) "Filter/Effect/Video", "Resizes video", "Wim Taymans <wim.taymans@chello.be>"); - gst_element_class_add_static_pad_template (element_class, - &gst_cog_scale_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_cog_scale_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cog_scale_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_cog_scale_sink_template)); } static void diff --git a/ext/cog/gstcolorconvert.c b/ext/cog/gstcolorconvert.c index 4a043cda7..1ed6d91a5 100644 --- a/ext/cog/gstcolorconvert.c +++ b/ext/cog/gstcolorconvert.c @@ -132,10 +132,10 @@ gst_colorconvert_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_colorconvert_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_colorconvert_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_colorconvert_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_colorconvert_sink_template)); gst_element_class_set_details_simple (element_class, "Convert colorspace", "Filter/Effect/Video", diff --git a/ext/cog/gstlogoinsert.c b/ext/cog/gstlogoinsert.c index 99e54470b..5746528e4 100644 --- a/ext/cog/gstlogoinsert.c +++ b/ext/cog/gstlogoinsert.c @@ -130,10 +130,10 @@ gst_logoinsert_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_logoinsert_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_logoinsert_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_logoinsert_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_logoinsert_sink_template)); gst_element_class_set_details_simple (element_class, "Overlay image onto video", "Filter/Effect/Video", diff --git a/ext/curl/gstcurlsink.c b/ext/curl/gstcurlsink.c index 75b459c55..2a448f436 100644 --- a/ext/curl/gstcurlsink.c +++ b/ext/curl/gstcurlsink.c @@ -155,7 +155,8 @@ gst_curl_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Curl sink", "Sink/Network", diff --git a/ext/dc1394/gstdc1394.c b/ext/dc1394/gstdc1394.c index dfb4cadee..09c4fd1f9 100644 --- a/ext/dc1394/gstdc1394.c +++ b/ext/dc1394/gstdc1394.c @@ -104,18 +104,16 @@ static void gst_dc1394_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - GstPadTemplate *pad_template; gst_element_class_set_details_simple (element_class, "1394 IIDC Video Source", "Source/Video", "libdc1394 based source, supports 1394 IIDC cameras", "Antoine Tremblay <hexa00@gmail.com>"); - pad_template = + gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_dc1394_get_all_dc1394_caps ()); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); + gst_dc1394_get_all_dc1394_caps ())); + } static void diff --git a/ext/dirac/gstdiracdec.cc b/ext/dirac/gstdiracdec.cc index 86643ef81..486eab0ab 100644 --- a/ext/dirac/gstdiracdec.cc +++ b/ext/dirac/gstdiracdec.cc @@ -103,10 +103,10 @@ gst_diracdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_diracdec_src_pad_template); - gst_element_class_add_static_pad_template (element_class, - &gst_diracdec_sink_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_diracdec_src_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_diracdec_sink_pad_template)); gst_element_class_set_details_simple (element_class, "Dirac stream decoder", "Codec/Decoder/Video", "Decode DIRAC streams", "David Schleef <ds@schleef.org>, " diff --git a/ext/dirac/gstdiracenc.cc b/ext/dirac/gstdiracenc.cc index f9595e1de..eb19d7807 100644 --- a/ext/dirac/gstdiracenc.cc +++ b/ext/dirac/gstdiracenc.cc @@ -197,10 +197,10 @@ gst_dirac_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_dirac_enc_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_dirac_enc_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dirac_enc_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dirac_enc_sink_template)); gst_element_class_set_details_simple (element_class, "Dirac Encoder", "Codec/Encoder/Video", diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c index c3417a5e1..038e3ee33 100644 --- a/ext/directfb/dfbvideosink.c +++ b/ext/directfb/dfbvideosink.c @@ -132,10 +132,9 @@ static DFBSurfacePixelFormat gst_dfbvideosink_get_format_from_caps (GstCaps * static void gst_dfbvideosink_update_colorbalance (GstDfbVideoSink * dfbvideosink); static void gst_dfbvideosink_surface_destroy (GstDfbVideoSink * dfbvideosink, - GstDfbSurface * surface); + GstBuffer * surface); static GstVideoSinkClass *parent_class = NULL; -static GstBufferClass *surface_parent_class = NULL; #ifndef GST_DISABLE_GST_DEBUG static const char * @@ -188,12 +187,52 @@ gst_dfbvideosink_get_format_name (DFBSurfacePixelFormat format) } #endif /* GST_DISABLE_GST_DEBUG */ +static void +gst_dfbsurface_dispose (GstBuffer * surface) +{ + GstDfbVideoSink *dfbvideosink = NULL; + GstMetaDfbSurface *meta; + + g_return_if_fail (surface != NULL); + + meta = GST_META_DFBSURFACE_GET (surface); + + dfbvideosink = meta->dfbvideosink; + if (!dfbvideosink) { + GST_WARNING_OBJECT (surface, "no sink found"); + goto beach; + } + + /* If our geometry changed we can't reuse that image. */ + if ((meta->width != dfbvideosink->video_width) || + (meta->height != dfbvideosink->video_height) || + (meta->pixel_format != dfbvideosink->pixel_format)) { + GST_DEBUG_OBJECT (dfbvideosink, "destroy surface %p as its size changed " + "%dx%d vs current %dx%d", surface, meta->width, meta->height, + dfbvideosink->video_width, dfbvideosink->video_height); + gst_dfbvideosink_surface_destroy (dfbvideosink, surface); + } else { + /* In that case we can reuse the image and add it to our image pool. */ + GST_DEBUG_OBJECT (dfbvideosink, "recycling surface %p in pool", surface); + /* need to increment the refcount again to recycle */ + gst_buffer_ref (surface); + g_mutex_lock (dfbvideosink->pool_lock); + dfbvideosink->buffer_pool = g_slist_prepend (dfbvideosink->buffer_pool, + surface); + g_mutex_unlock (dfbvideosink->pool_lock); + } + +beach: + return; +} + /* Creates miniobject and our internal surface */ -static GstDfbSurface * +static GstBuffer * gst_dfbvideosink_surface_create (GstDfbVideoSink * dfbvideosink, GstCaps * caps, size_t size) { - GstDfbSurface *surface = NULL; + GstBuffer *surface = NULL; + GstMetaDfbSurface *meta = NULL; GstStructure *structure = NULL; DFBResult ret; DFBSurfaceDescription s_dsc; @@ -203,25 +242,28 @@ gst_dfbvideosink_surface_create (GstDfbVideoSink * dfbvideosink, GstCaps * caps, g_return_val_if_fail (GST_IS_DFBVIDEOSINK (dfbvideosink), NULL); - surface = (GstDfbSurface *) gst_mini_object_new (GST_TYPE_DFBSURFACE); + surface = gst_buffer_new (); + GST_MINI_OBJECT_CAST (surface)->dispose = + (GstMiniObjectDisposeFunction) gst_dfbsurface_dispose; + meta = GST_META_DFBSURFACE_ADD (surface); /* Keep a ref to our sink */ - surface->dfbvideosink = gst_object_ref (dfbvideosink); + meta->dfbvideosink = gst_object_ref (dfbvideosink); /* Surface is not locked yet */ - surface->locked = FALSE; + meta->locked = FALSE; structure = gst_caps_get_structure (caps, 0); - if (!gst_structure_get_int (structure, "width", &surface->width) || - !gst_structure_get_int (structure, "height", &surface->height)) { + if (!gst_structure_get_int (structure, "width", &meta->width) || + !gst_structure_get_int (structure, "height", &meta->height)) { GST_WARNING_OBJECT (dfbvideosink, "failed getting geometry from caps %" GST_PTR_FORMAT, caps); goto fallback; } /* Pixel format from caps */ - surface->pixel_format = gst_dfbvideosink_get_format_from_caps (caps); - if (surface->pixel_format == DSPF_UNKNOWN) { + meta->pixel_format = gst_dfbvideosink_get_format_from_caps (caps); + if (meta->pixel_format == DSPF_UNKNOWN) { goto fallback; } @@ -236,41 +278,41 @@ gst_dfbvideosink_surface_create (GstDfbVideoSink * dfbvideosink, GstCaps * caps, s_dsc.flags = DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_HEIGHT /*| DSDESC_CAPS */ ; - s_dsc.pixelformat = surface->pixel_format; - s_dsc.width = surface->width; - s_dsc.height = surface->height; + s_dsc.pixelformat = meta->pixel_format; + s_dsc.width = meta->width; + s_dsc.height = meta->height; /*s_dsc.caps = DSCAPS_VIDEOONLY; */ ret = dfbvideosink->dfb->CreateSurface (dfbvideosink->dfb, &s_dsc, - &surface->surface); + &meta->surface); if (ret != DFB_OK) { GST_WARNING_OBJECT (dfbvideosink, "failed creating a DirectFB surface"); - surface->surface = NULL; + meta->surface = NULL; goto fallback; } /* Clearing surface */ - surface->surface->Clear (surface->surface, 0x00, 0x00, 0x00, 0xFF); + meta->surface->Clear (meta->surface, 0x00, 0x00, 0x00, 0xFF); /* Locking the surface to acquire the memory pointer */ - surface->surface->Lock (surface->surface, DSLF_WRITE, &data, &pitch); - surface->locked = TRUE; + meta->surface->Lock (meta->surface, DSLF_WRITE, &data, &pitch); + meta->locked = TRUE; GST_BUFFER_DATA (surface) = data; - GST_BUFFER_SIZE (surface) = pitch * surface->height; + GST_BUFFER_SIZE (surface) = pitch * meta->height; /* Be carefull here. If size is different from the surface size (pitch * height), we can't use that surface through buffer alloc system or we are going to run into serious stride issues */ if (GST_BUFFER_SIZE (surface) != size) { GST_WARNING_OBJECT (dfbvideosink, "DirectFB surface size (%dx%d=%d) " - "differs from GStreamer requested size %u", pitch, surface->height, + "differs from GStreamer requested size %u", pitch, meta->height, GST_BUFFER_SIZE (surface), (guint) size); goto fallback; } GST_DEBUG_OBJECT (dfbvideosink, "creating a %dx%d surface (%p) with %s " - "pixel format, line pitch %d", surface->width, surface->height, surface, - gst_dfbvideosink_get_format_name (surface->pixel_format), pitch); + "pixel format, line pitch %d", meta->width, meta->height, surface, + gst_dfbvideosink_get_format_name (meta->pixel_format), pitch); succeeded = TRUE; @@ -280,16 +322,17 @@ fallback: /* We allocate a standard buffer ourselves to store it in our buffer pool, this is an optimisation for memory allocation */ - GST_BUFFER (surface)->malloc_data = g_malloc (size); - GST_BUFFER_DATA (surface) = GST_BUFFER (surface)->malloc_data; + GST_BUFFER_MALLOCDATA (surface) = g_malloc (size); + GST_BUFFER_DATA (surface) = GST_BUFFER_MALLOCDATA (surface); GST_BUFFER_SIZE (surface) = size; - if (surface->surface) { - if (surface->locked) { - surface->surface->Unlock (surface->surface); - surface->locked = FALSE; + + if (meta->surface) { + if (meta->locked) { + meta->surface->Unlock (meta->surface); + meta->locked = FALSE; } - surface->surface->Release (surface->surface); - surface->surface = NULL; + meta->surface->Release (meta->surface); + meta->surface = NULL; } GST_DEBUG_OBJECT (dfbvideosink, "allocating a buffer (%p) of %u bytes", surface, (guint) size); @@ -308,28 +351,29 @@ beach: * destroyed so we just have to clean our internal stuff */ static void gst_dfbvideosink_surface_destroy (GstDfbVideoSink * dfbvideosink, - GstDfbSurface * surface) + GstBuffer * surface) { + GstMetaDfbSurface *meta; + g_return_if_fail (GST_IS_DFBVIDEOSINK (dfbvideosink)); + meta = GST_META_DFBSURFACE_GET (surface); + /* Release our internal surface */ - if (surface->surface) { - if (surface->locked) { - surface->surface->Unlock (surface->surface); - surface->locked = FALSE; + if (meta->surface) { + if (meta->locked) { + meta->surface->Unlock (meta->surface); + meta->locked = FALSE; } - surface->surface->Release (surface->surface); - surface->surface = NULL; + meta->surface->Release (meta->surface); + meta->surface = NULL; } - if (surface->dfbvideosink) { + if (meta->dfbvideosink) { /* Release the ref to our sink */ - surface->dfbvideosink = NULL; + meta->dfbvideosink = NULL; gst_object_unref (dfbvideosink); } - - GST_MINI_OBJECT_CLASS (surface_parent_class)->finalize (GST_MINI_OBJECT - (surface)); } static gpointer @@ -339,8 +383,8 @@ gst_dfbvideosink_event_thread (GstDfbVideoSink * dfbvideosink) while (dfbvideosink->running) { /* Wait for an event with a 50 ms timeout */ - dfbvideosink->event_buffer-> - WaitForEventWithTimeout (dfbvideosink->event_buffer, 0, 50); + dfbvideosink->event_buffer->WaitForEventWithTimeout (dfbvideosink-> + event_buffer, 0, 50); /* Do we have an event ? */ ret = dfbvideosink->event_buffer->HasEvent (dfbvideosink->event_buffer); @@ -1515,6 +1559,7 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) GstVideoRectangle dst, src, result; GstFlowReturn ret = GST_FLOW_OK; gboolean mem_cpy = TRUE; + GstMetaDfbSurface *meta; dfbvideosink = GST_DFBVIDEOSINK (bsink); @@ -1523,12 +1568,12 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) goto beach; } - /* Is that a buffer we allocated ourselves ? */ - if (GST_IS_DFBSURFACE (buf)) { - GstDfbSurface *tmp_surface = GST_DFBSURFACE (buf); + meta = GST_META_DFBSURFACE_GET (buf); + /* Is that a buffer we allocated ourselves ? */ + if (meta != NULL) { /* Does it have a surface ? */ - if (tmp_surface->surface) { + if (meta->surface) { mem_cpy = FALSE; GST_DEBUG_OBJECT (dfbvideosink, "we have a buffer (%p) we allocated " "ourselves and it has a surface, no memcpy then", buf); @@ -1624,8 +1669,6 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) } } else { /* Else we will [Stretch]Blit to our primary */ - GstDfbSurface *surface = GST_DFBSURFACE (buf); - GST_DEBUG_OBJECT (dfbvideosink, "blitting to a primary surface (vsync %d)", dfbvideosink->vsync); @@ -1635,9 +1678,9 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) dfbvideosink->primary->GetSize (dfbvideosink->primary, &dst.w, &dst.h); /* Unlocking surface before blit */ - if (surface->locked) { - surface->surface->Unlock (surface->surface); - surface->locked = FALSE; + if (meta->locked) { + meta->surface->Unlock (meta->surface); + meta->locked = FALSE; } gst_video_sink_center_rect (src, dst, &result, dfbvideosink->hw_scaling); @@ -1649,14 +1692,14 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) if (dfbvideosink->hw_scaling) { dfbvideosink->primary->StretchBlit (dfbvideosink->primary, - surface->surface, NULL, (DFBRectangle *) (void *) &result); + meta->surface, NULL, (DFBRectangle *) (void *) &result); } else { DFBRectangle clip; clip.x = clip.y = 0; clip.w = result.w; clip.h = result.h; - dfbvideosink->primary->Blit (dfbvideosink->primary, surface->surface, + dfbvideosink->primary->Blit (dfbvideosink->primary, meta->surface, &clip, result.x, result.y); } @@ -1679,7 +1722,7 @@ gst_dfbvideosink_bufferpool_clear (GstDfbVideoSink * dfbvideosink) { g_mutex_lock (dfbvideosink->pool_lock); while (dfbvideosink->buffer_pool) { - GstDfbSurface *surface = dfbvideosink->buffer_pool->data; + GstBuffer *surface = dfbvideosink->buffer_pool->data; dfbvideosink->buffer_pool = g_slist_delete_link (dfbvideosink->buffer_pool, dfbvideosink->buffer_pool); @@ -1696,7 +1739,7 @@ gst_dfbvideosink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstDfbVideoSink *dfbvideosink; - GstDfbSurface *surface = NULL; + GstBuffer *surface = NULL; GstFlowReturn ret = GST_FLOW_OK; gboolean rev_nego = FALSE; @@ -1798,7 +1841,9 @@ alloc: /* Inspect our buffer pool */ g_mutex_lock (dfbvideosink->pool_lock); while (dfbvideosink->buffer_pool) { - surface = (GstDfbSurface *) dfbvideosink->buffer_pool->data; + GstMetaDfbSurface *meta; + + surface = (GstBuffer *) dfbvideosink->buffer_pool->data; if (surface) { /* Removing from the pool */ @@ -1806,10 +1851,12 @@ alloc: g_slist_delete_link (dfbvideosink->buffer_pool, dfbvideosink->buffer_pool); + meta = GST_META_DFBSURFACE_GET (surface); + /* If the surface is invalid for our need, destroy */ - if ((surface->width != width) || - (surface->height != height) || - (surface->pixel_format != dfbvideosink->pixel_format)) { + if ((meta->width != width) || + (meta->height != height) || + (meta->pixel_format != dfbvideosink->pixel_format)) { gst_dfbvideosink_surface_destroy (dfbvideosink, surface); surface = NULL; } else { @@ -1832,100 +1879,34 @@ alloc: /* Now we should have a surface, set appropriate caps on it */ if (surface) { if (rev_nego) { - gst_buffer_set_caps (GST_BUFFER (surface), desired_caps); + gst_buffer_set_caps (surface, desired_caps); } else { - gst_buffer_set_caps (GST_BUFFER (surface), caps); + gst_buffer_set_caps (surface, caps); } } - *buf = GST_BUFFER (surface); + *buf = surface; gst_caps_unref (desired_caps); return ret; } -/* Our subclass of GstBuffer */ - -static void -gst_dfbsurface_finalize (GstDfbSurface * surface) -{ - GstDfbVideoSink *dfbvideosink = NULL; - - g_return_if_fail (surface != NULL); - - dfbvideosink = surface->dfbvideosink; - if (!dfbvideosink) { - GST_WARNING_OBJECT (surface, "no sink found"); - goto beach; - } - - /* If our geometry changed we can't reuse that image. */ - if ((surface->width != dfbvideosink->video_width) || - (surface->height != dfbvideosink->video_height) || - (surface->pixel_format != dfbvideosink->pixel_format)) { - GST_DEBUG_OBJECT (dfbvideosink, "destroy surface %p as its size changed " - "%dx%d vs current %dx%d", surface, surface->width, surface->height, - dfbvideosink->video_width, dfbvideosink->video_height); - gst_dfbvideosink_surface_destroy (dfbvideosink, surface); - } else { - /* In that case we can reuse the image and add it to our image pool. */ - GST_DEBUG_OBJECT (dfbvideosink, "recycling surface %p in pool", surface); - /* need to increment the refcount again to recycle */ - gst_buffer_ref (GST_BUFFER (surface)); - g_mutex_lock (dfbvideosink->pool_lock); - dfbvideosink->buffer_pool = g_slist_prepend (dfbvideosink->buffer_pool, - surface); - g_mutex_unlock (dfbvideosink->pool_lock); - } - -beach: - return; -} - -static void -gst_dfbsurface_init (GstDfbSurface * surface, gpointer g_class) +/* our metadata */ +const GstMetaInfo * +gst_meta_dfbsurface_get_info (void) { - surface->surface = NULL; - surface->width = 0; - surface->height = 0; - surface->pixel_format = DSPF_UNKNOWN; - surface->dfbvideosink = NULL; -} + static const GstMetaInfo *meta_info = NULL; -static void -gst_dfbsurface_class_init (gpointer g_class, gpointer class_data) -{ - GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); - - surface_parent_class = g_type_class_peek_parent (g_class); - - mini_object_class->finalize = (GstMiniObjectFinalizeFunction) - gst_dfbsurface_finalize; -} - -GType -gst_dfbsurface_get_type (void) -{ - static GType _gst_dfbsurface_type; - - if (G_UNLIKELY (_gst_dfbsurface_type == 0)) { - static const GTypeInfo dfbsurface_info = { - sizeof (GstBufferClass), - NULL, - NULL, - gst_dfbsurface_class_init, - NULL, - NULL, - sizeof (GstDfbSurface), - 0, - (GInstanceInitFunc) gst_dfbsurface_init, - NULL - }; - _gst_dfbsurface_type = g_type_register_static (GST_TYPE_BUFFER, - "GstDfbSurface", &dfbsurface_info, 0); + if (meta_info == NULL) { + meta_info = gst_meta_register ("GstMetaDfbSurface", "GstMetaDfbSurface", + sizeof (GstMetaDfbSurface), + (GstMetaInitFunction) NULL, + (GstMetaFreeFunction) NULL, + (GstMetaTransformFunction) NULL, + (GstMetaSerializeFunction) NULL, (GstMetaDeserializeFunction) NULL); } - return _gst_dfbsurface_type; + return meta_info; } /* Interfaces stuff */ @@ -2110,7 +2091,7 @@ gst_dfbvideosink_colorbalance_get_value (GstColorBalance * balance, } static void -gst_dfbvideosink_colorbalance_init (GstColorBalanceClass * iface) +gst_dfbvideosink_colorbalance_init (GstColorBalanceInterface * iface) { GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_HARDWARE; iface->list_channels = gst_dfbvideosink_colorbalance_list_channels; @@ -2283,8 +2264,8 @@ gst_dfbvideosink_base_init (gpointer g_class) "Sink/Video", "A DirectFB based videosink", "Julien Moutte <julien@moutte.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_dfbvideosink_sink_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dfbvideosink_sink_template_factory)); } static void diff --git a/ext/directfb/dfbvideosink.h b/ext/directfb/dfbvideosink.h index bbab762d0..4d911416c 100644 --- a/ext/directfb/dfbvideosink.h +++ b/ext/directfb/dfbvideosink.h @@ -35,25 +35,25 @@ G_BEGIN_DECLS typedef struct _GstDfbVideoSink GstDfbVideoSink; typedef struct _GstDfbVideoSinkClass GstDfbVideoSinkClass; -#define GST_TYPE_DFBSURFACE (gst_dfbsurface_get_type()) +typedef struct _GstMetaDfbSurface GstMetaDfbSurface; -#define GST_IS_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DFBSURFACE)) -#define GST_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DFBSURFACE, GstDfbSurface)) +const GstMetaInfo * gst_meta_dfbsurface_get_info (void); + +#define GST_META_DFBSURFACE_GET(buf) ((GstMetaDfbSurface *)gst_buffer_get_meta(buf,gst_meta_dfbsurface_get_info())) +#define GST_META_DFBSURFACE_ADD(buf) ((GstMetaDfbSurface *)gst_buffer_add_meta(buf,gst_meta_dfbsurface_get_info(),NULL)) + +struct _GstMetaDfbSurface { + GstMeta meta; -typedef struct _GstDfbSurface GstDfbSurface; - -struct _GstDfbSurface { - GstBuffer buffer; /* We extend GstBuffer */ - IDirectFBSurface *surface; - + gint width; gint height; - + gboolean locked; - + DFBSurfacePixelFormat pixel_format; - + GstDfbVideoSink *dfbvideosink; }; @@ -123,7 +123,6 @@ struct _GstDfbVideoSinkClass { }; GType gst_dfbvideosink_get_type (void); -GType gst_dfbsurface_get_type (void); G_END_DECLS diff --git a/ext/divx/gstdivxdec.c b/ext/divx/gstdivxdec.c index 9f2feecfd..2b6625616 100644 --- a/ext/divx/gstdivxdec.c +++ b/ext/divx/gstdivxdec.c @@ -130,9 +130,10 @@ gst_divxdec_base_init (GstDivxDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Divx4linux video decoder", "Codec/Decoder/Video", diff --git a/ext/divx/gstdivxenc.c b/ext/divx/gstdivxenc.c index 144d23b12..924f6749d 100644 --- a/ext/divx/gstdivxenc.c +++ b/ext/divx/gstdivxenc.c @@ -141,9 +141,10 @@ gst_divxenc_base_init (GstDivxEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Divx4linux video encoder", "Codec/Encoder/Video", diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c index 4a304f8e8..f71219478 100644 --- a/ext/dts/gstdtsdec.c +++ b/ext/dts/gstdtsdec.c @@ -153,8 +153,10 @@ gst_dtsdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); gst_element_class_set_details_simple (element_class, "DTS audio decoder", "Codec/Decoder/Audio", "Decodes DTS audio streams", diff --git a/ext/faac/gstfaac.c b/ext/faac/gstfaac.c index 68c1e0132..c4b34f544 100644 --- a/ext/faac/gstfaac.c +++ b/ext/faac/gstfaac.c @@ -56,11 +56,8 @@ "88200, " \ "96000" #define SINK_CAPS \ - "audio/x-raw-int, " \ - "endianness = (int) BYTE_ORDER, " \ - "signed = (boolean) true, " \ - "width = (int) 16, " \ - "depth = (int) 16, " \ + "audio/x-raw, " \ + "format = (string) "GST_AUDIO_NE (S16) ", " \ "rate = (int) {" SAMPLE_RATES "}, " \ "channels = (int) [ 1, 6 ] " @@ -125,7 +122,7 @@ static void gst_faac_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_faac_configure_source_pad (GstFaac * faac); -static GstCaps *gst_faac_getcaps (GstAudioEncoder * enc); +static GstCaps *gst_faac_getcaps (GstAudioEncoder * enc, GstCaps * filter); static gboolean gst_faac_start (GstAudioEncoder * enc); static gboolean gst_faac_stop (GstAudioEncoder * enc); @@ -144,24 +141,8 @@ GST_DEBUG_CATEGORY_STATIC (faac_debug); #define FAAC_DEFAULT_MIDSIDE TRUE #define FAAC_DEFAULT_SHORTCTL SHORTCTL_NORMAL -GST_BOILERPLATE (GstFaac, gst_faac, GstAudioEncoder, GST_TYPE_AUDIO_ENCODER); - -static void -gst_faac_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); - - gst_element_class_set_details_simple (element_class, "AAC audio encoder", - "Codec/Encoder/Audio", - "Free MPEG-2/4 AAC encoder", - "Ronald Bultje <rbultje@ronald.bitfreak.net>"); - - GST_DEBUG_CATEGORY_INIT (faac_debug, "faac", 0, "AAC encoding"); -} +#define gst_faac_parent_class parent_class +G_DEFINE_TYPE (GstFaac, gst_faac, GST_TYPE_AUDIO_ENCODER); #define GST_TYPE_FAAC_RATE_CONTROL (gst_faac_brtype_get_type ()) static GType @@ -208,13 +189,22 @@ static void gst_faac_class_init (GstFaacClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass); - parent_class = g_type_class_peek_parent (klass); - gobject_class->set_property = gst_faac_set_property; gobject_class->get_property = gst_faac_get_property; + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_details_simple (gstelement_class, "AAC audio encoder", + "Codec/Encoder/Audio", + "Free MPEG-2/4 AAC encoder", + "Ronald Bultje <rbultje@ronald.bitfreak.net>"); + base_class->start = GST_DEBUG_FUNCPTR (gst_faac_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_faac_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_faac_set_format); @@ -250,10 +240,12 @@ gst_faac_class_init (GstFaacClass * klass) "Block type encorcing", GST_TYPE_FAAC_SHORTCTL, FAAC_DEFAULT_SHORTCTL, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + GST_DEBUG_CATEGORY_INIT (faac_debug, "faac", 0, "AAC encoding"); } static void -gst_faac_init (GstFaac * faac, GstFaacClass * klass) +gst_faac_init (GstFaac * faac) { } @@ -314,7 +306,7 @@ static const GstAudioChannelPosition aac_channel_positions[][8] = { }; static GstCaps * -gst_faac_getcaps (GstAudioEncoder * enc) +gst_faac_getcaps (GstAudioEncoder * enc, GstCaps * filter) { static volatile gsize sinkcaps = 0; @@ -337,10 +329,8 @@ gst_faac_getcaps (GstAudioEncoder * enc) } g_value_unset (&tmp_v); - s = gst_structure_new ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); + s = gst_structure_new ("audio/x-raw", + "format", G_TYPE_STRING, GST_AUDIO_NE (S16), NULL); gst_structure_set_value (s, "rate", &rates_arr); for (i = 1; i <= 6; i++) { @@ -608,7 +598,7 @@ gst_faac_configure_source_pad (GstFaac * faac) /* copy it into a buffer */ codec_data = gst_buffer_new_and_alloc (config_len); - memcpy (GST_BUFFER_DATA (codec_data), config, config_len); + gst_buffer_fill (codec_data, 0, config, config_len); /* add to caps */ gst_caps_set_simple (srccaps, @@ -667,29 +657,34 @@ gst_faac_handle_frame (GstAudioEncoder * enc, GstBuffer * in_buf) GstFaac *faac = GST_FAAC (enc); GstFlowReturn ret = GST_FLOW_OK; GstBuffer *out_buf; - gint size, ret_size; - const guint8 *data; + gsize size, ret_size; + guint8 *data; + guint8 *out_data; + gsize out_size; out_buf = gst_buffer_new_and_alloc (faac->bytes); + out_data = gst_buffer_map (out_buf, &out_size, NULL, GST_MAP_WRITE); if (G_LIKELY (in_buf)) { - data = GST_BUFFER_DATA (in_buf); - size = GST_BUFFER_SIZE (in_buf); + data = gst_buffer_map (in_buf, &size, NULL, GST_MAP_READ); } else { data = NULL; size = 0; } if (G_UNLIKELY ((ret_size = faacEncEncode (faac->handle, (gint32 *) data, - size / faac->bps, GST_BUFFER_DATA (out_buf), - GST_BUFFER_SIZE (out_buf))) < 0)) + size / faac->bps, out_data, out_size)) < 0)) goto encode_failed; - GST_LOG_OBJECT (faac, "encoder return: %d", ret_size); - if (G_LIKELY (ret_size > 0)) { - GST_BUFFER_SIZE (out_buf) = ret_size; + gst_buffer_unmap (in_buf, data, size); + + GST_LOG_OBJECT (faac, "encoder return: %" G_GSIZE_FORMAT, ret_size); + + if (ret_size > 0) { + gst_buffer_unmap (out_buf, out_data, ret_size); ret = gst_audio_encoder_finish_frame (enc, out_buf, faac->samples); } else { + gst_buffer_unmap (out_buf, out_data, 0); gst_buffer_unref (out_buf); /* re-create encoder after final flush */ if (!in_buf) { @@ -707,6 +702,9 @@ encode_failed: { gst_buffer_unref (out_buf); GST_ELEMENT_ERROR (faac, LIBRARY, ENCODE, (NULL), (NULL)); + gst_buffer_unmap (in_buf, data, size); + gst_buffer_unmap (out_buf, out_data, 0); + gst_buffer_unref (out_buf); return GST_FLOW_ERROR; } } diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c index 838df31bc..b6b7f5c98 100644 --- a/ext/faad/gstfaad.c +++ b/ext/faad/gstfaad.c @@ -95,24 +95,12 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) { 2, 4 }") ); -#define STATIC_INT_CAPS(bpp) \ - "audio/x-raw-int, " \ - "endianness = (int) BYTE_ORDER, " \ - "signed = (bool) TRUE, " \ - "width = (int) " G_STRINGIFY (bpp) ", " \ - "depth = (int) " G_STRINGIFY (bpp) ", " \ +#define STATIC_RAW_CAPS(format) \ + "audio/x-raw, " \ + "format = (string) "GST_AUDIO_NE(format)", " \ "rate = (int) [ 8000, 96000 ], " \ "channels = (int) [ 1, 8 ]" -#if 0 -#define STATIC_FLOAT_CAPS(bpp) \ - "audio/x-raw-float, " \ - "endianness = (int) BYTE_ORDER, " \ - "depth = (int) " G_STRINGIFY (bpp) ", " \ - "rate = (int) [ 8000, 96000 ], " \ - "channels = (int) [ 1, 8 ]" -#endif - /* * All except 16-bit integer are disabled until someone fixes FAAD. * FAAD allocates approximately 8*1024*2 bytes bytes, which is enough @@ -122,16 +110,16 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", */ #define STATIC_CAPS \ - STATIC_INT_CAPS (16) + STATIC_RAW_CAPS (S16) #if 0 #define NOTUSED "; " \ -STATIC_INT_CAPS (24) \ +STATIC_RAW_CAPS (S24) \ "; " \ -STATIC_INT_CAPS (32) \ +STATIC_RAW_CAPS (S32) \ "; " \ -STATIC_FLOAT_CAPS (32) \ +STATIC_RAW_CAPS (F32) \ "; " \ -STATIC_FLOAT_CAPS (64) +STATIC_RAW_CAPS (F64) #endif static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", @@ -154,42 +142,37 @@ static void gst_faad_flush (GstAudioDecoder * dec, gboolean hard); static gboolean gst_faad_open_decoder (GstFaad * faad); static void gst_faad_close_decoder (GstFaad * faad); -GST_BOILERPLATE (GstFaad, gst_faad, GstAudioDecoder, GST_TYPE_AUDIO_DECODER); +#define gst_faad_parent_class parent_class +G_DEFINE_TYPE (GstFaad, gst_faad, GST_TYPE_AUDIO_DECODER); static void -gst_faad_base_init (gpointer klass) +gst_faad_class_init (GstFaadClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "AAC audio decoder", "Codec/Decoder/Audio", "Free MPEG-2/4 AAC decoder", "Ronald Bultje <rbultje@ronald.bitfreak.net>"); - GST_DEBUG_CATEGORY_INIT (faad_debug, "faad", 0, "AAC decoding"); -} - -static void -gst_faad_class_init (GstFaadClass * klass) -{ - GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - base_class->start = GST_DEBUG_FUNCPTR (gst_faad_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_faad_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_faad_set_format); base_class->parse = GST_DEBUG_FUNCPTR (gst_faad_parse); base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_faad_handle_frame); base_class->flush = GST_DEBUG_FUNCPTR (gst_faad_flush); + + GST_DEBUG_CATEGORY_INIT (faad_debug, "faad", 0, "AAC decoding"); } static void -gst_faad_init (GstFaad * faad, GstFaadClass * klass) +gst_faad_init (GstFaad * faad) { gst_faad_reset (faad); } @@ -279,6 +262,8 @@ gst_faad_set_format (GstAudioDecoder * dec, GstCaps * caps) GstStructure *str = gst_caps_get_structure (caps, 0); GstBuffer *buf; const GValue *value; + guint8 *cdata; + gsize csize; /* clean up current decoder, rather than trying to reconfigure */ gst_faad_close_decoder (faad); @@ -293,8 +278,6 @@ gst_faad_set_format (GstAudioDecoder * dec, GstCaps * caps) guint32 samplerate; #endif guint8 channels; - guint8 *cdata; - guint csize; /* We have codec data, means packetised stream */ faad->packetised = TRUE; @@ -302,8 +285,7 @@ gst_faad_set_format (GstAudioDecoder * dec, GstCaps * caps) buf = gst_value_get_buffer (value); g_return_val_if_fail (buf != NULL, FALSE); - cdata = GST_BUFFER_DATA (buf); - csize = GST_BUFFER_SIZE (buf); + cdata = gst_buffer_map (buf, &csize, NULL, GST_MAP_READ); if (csize < 2) goto wrong_length; @@ -374,18 +356,21 @@ wrong_length: { GST_DEBUG_OBJECT (faad, "codec_data less than 2 bytes long"); gst_object_unref (faad); + gst_buffer_unmap (buf, cdata, csize); return FALSE; } open_failed: { GST_DEBUG_OBJECT (faad, "failed to create decoder"); gst_object_unref (faad); + gst_buffer_unmap (buf, cdata, csize); return FALSE; } init_failed: { GST_DEBUG_OBJECT (faad, "faacDecInit2() failed"); gst_object_unref (faad); + gst_buffer_unmap (buf, cdata, csize); return FALSE; } } @@ -508,11 +493,8 @@ gst_faad_update_caps (GstFaad * faad, faacDecFrameInfo * info) g_free (faad->channel_positions); faad->channel_positions = g_memdup (info->channel_position, faad->channels); - caps = gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, + caps = gst_caps_new_simple ("audio/x-raw", + "format", G_TYPE_STRING, GST_AUDIO_NE (S16), "rate", G_TYPE_INT, faad->samplerate, "channels", G_TYPE_INT, faad->channels, NULL); @@ -534,7 +516,7 @@ gst_faad_update_caps (GstFaad * faad, faacDecFrameInfo * info) GST_DEBUG_OBJECT (faad, "New output caps: %" GST_PTR_FORMAT, caps); - ret = gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (faad), caps); + ret = gst_audio_decoder_set_outcaps (GST_AUDIO_DECODER (faad), caps); gst_caps_unref (caps); return ret; @@ -661,9 +643,13 @@ gst_faad_parse (GstAudioDecoder * dec, GstAdapter * adapter, *length = size; return GST_FLOW_OK; } else { - data = gst_adapter_peek (adapter, size); - return gst_faad_sync (faad, data, size, !eos, offset, length) ? - GST_FLOW_OK : GST_FLOW_UNEXPECTED; + gboolean ret; + + data = gst_adapter_map (adapter, size); + ret = gst_faad_sync (faad, data, size, !eos, offset, length); + gst_adapter_unmap (adapter); + + return (ret ? GST_FLOW_OK : GST_FLOW_UNEXPECTED); } } @@ -672,7 +658,7 @@ gst_faad_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) { GstFaad *faad; GstFlowReturn ret = GST_FLOW_OK; - guint input_size; + gsize input_size; guchar *input_data; GstBuffer *outbuf; faacDecFrameInfo info; @@ -684,8 +670,7 @@ gst_faad_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) if (G_UNLIKELY (!buffer)) return GST_FLOW_OK; - input_data = GST_BUFFER_DATA (buffer); - input_size = GST_BUFFER_SIZE (buffer); + input_data = gst_buffer_map (buffer, &input_size, NULL, GST_MAP_READ); init: /* init if not already done during capsnego */ @@ -763,20 +748,17 @@ init: goto sample_overflow; /* note: info.samples is total samples, not per channel */ - ret = - gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD - (faad), 0, info.samples * faad->bps, - GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (faad)), &outbuf); - if (ret != GST_FLOW_OK) - goto out; - - memcpy (GST_BUFFER_DATA (outbuf), out, GST_BUFFER_SIZE (outbuf)); + /* FIXME, add bufferpool and allocator support to the base class */ + outbuf = gst_buffer_new_allocate (NULL, info.samples * faad->bps, 0); + gst_buffer_fill (outbuf, 0, out, info.samples * faad->bps); ret = gst_audio_decoder_finish_frame (dec, outbuf, 1); } } while (FALSE); out: + gst_buffer_unmap (buffer, input_data, input_size); + return ret; /* ERRORS */ diff --git a/ext/flite/gstflitetestsrc.c b/ext/flite/gstflitetestsrc.c index a8e595c03..716d73601 100644 --- a/ext/flite/gstflitetestsrc.c +++ b/ext/flite/gstflitetestsrc.c @@ -86,16 +86,13 @@ static GstStaticPadTemplate gst_flite_test_src_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) true, " - "width = (int) 16, " - "depth = (int) 16, " "rate = (int) 48000, " "channels = (int) [1,8]") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (s16) ", " + "rate = (int) 48000, " "channels = (int) [1,8]") ); - -GST_BOILERPLATE (GstFliteTestSrc, gst_flite_test_src, GstBaseSrc, - GST_TYPE_BASE_SRC); +#define gst_flite_test_src_parent_class parent_class +G_DEFINE_TYPE (GstFliteTestSrc, gst_flite_test_src, GST_TYPE_BASE_SRC); static void gst_flite_test_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -109,55 +106,46 @@ static GstFlowReturn gst_flite_test_src_create (GstBaseSrc * basesrc, static gboolean gst_flite_test_src_set_caps (GstBaseSrc * basesrc, GstCaps * caps); - -static void -gst_flite_test_src_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - GST_DEBUG_CATEGORY_INIT (flite_test_src_debug, "flitetestsrc", 0, - "Flite Audio Test Source"); - - gst_element_class_add_static_pad_template (element_class, - &gst_flite_test_src_src_template); - gst_element_class_set_details_simple (element_class, - "Flite speech test source", "Source/Audio", - "Creates audio test signals identifying channels", - "David Schleef <ds@schleef.org>"); -} - static void gst_flite_test_src_class_init (GstFliteTestSrcClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gobject_class->set_property = gst_flite_test_src_set_property; gobject_class->get_property = gst_flite_test_src_get_property; - gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_flite_test_src_start); - gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_flite_test_src_stop); - gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_flite_test_src_create); - gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_flite_test_src_set_caps); - g_object_class_install_property (gobject_class, PROP_SAMPLES_PER_BUFFER, g_param_spec_int ("samplesperbuffer", "Samples per buffer", "Number of samples in each outgoing buffer", 1, G_MAXINT, DEFAULT_SAMPLES_PER_BUFFER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_flite_test_src_src_template)); + + gst_element_class_set_details_simple (gstelement_class, + "Flite speech test source", "Source/Audio", + "Creates audio test signals identifying channels", + "David Schleef <ds@schleef.org>"); + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_flite_test_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_flite_test_src_stop); + gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_flite_test_src_create); + gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_flite_test_src_set_caps); + + GST_DEBUG_CATEGORY_INIT (flite_test_src_debug, "flitetestsrc", 0, + "Flite Audio Test Source"); } static void -gst_flite_test_src_init (GstFliteTestSrc * src, GstFliteTestSrcClass * g_class) +gst_flite_test_src_init (GstFliteTestSrc * src) { -#if 0 - GstPad *pad = GST_BASE_SRC_PAD (src); -#endif - src->samplerate = 48000; src->samples_per_buffer = DEFAULT_SAMPLES_PER_BUFFER; @@ -367,6 +355,7 @@ gst_flite_test_src_create (GstBaseSrc * basesrc, guint64 offset, int i; gint16 *data; cst_wave *wave; + gsize size; text = get_channel_name (src, src->channel); @@ -377,14 +366,15 @@ gst_flite_test_src_create (GstBaseSrc * basesrc, guint64 offset, GST_DEBUG ("type %s, sample_rate %d, num_samples %d, num_channels %d", wave->type, wave->sample_rate, wave->num_samples, wave->num_channels); - buf = gst_buffer_new_and_alloc (src->n_channels * sizeof (gint16) * - wave->num_samples); + size = src->n_channels * sizeof (gint16) * wave->num_samples; + buf = gst_buffer_new_and_alloc (size); - data = (void *) GST_BUFFER_DATA (buf); - memset (data, 0, src->n_channels * sizeof (gint16) * wave->num_samples); + data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE); + memset (data, 0, size); for (i = 0; i < wave->num_samples; i++) { data[i * src->n_channels + src->channel] = wave->samples[i]; } + gst_buffer_unmap (buf, data, size); src->channel++; if (src->channel == src->n_channels) { diff --git a/ext/gme/gstgme.c b/ext/gme/gstgme.c index 14ee7d305..eda7e3f27 100644 --- a/ext/gme/gstgme.c +++ b/ext/gme/gstgme.c @@ -45,12 +45,17 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, "width = (int) 16, " "depth = (int) 16, " "rate = (int) 32000, " "channels = (int) 2")); -GST_BOILERPLATE (GstGmeDec, gst_gme_dec, GstElement, GST_TYPE_ELEMENT); - -static GstFlowReturn gst_gme_dec_chain (GstPad * pad, GstBuffer * buffer); -static gboolean gst_gme_dec_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_gme_dec_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_gme_dec_src_query (GstPad * pad, GstQuery * query); +#define gst_gme_dec_parent_class parent_class +G_DEFINE_TYPE (GstGmeDec, gst_gme_dec, GST_TYPE_ELEMENT); + +static GstFlowReturn gst_gme_dec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static gboolean gst_gme_dec_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_gme_dec_src_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_gme_dec_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstStateChangeReturn gst_gme_dec_change_state (GstElement * element, GstStateChange transition); static void gst_gme_play (GstPad * pad); @@ -104,9 +109,12 @@ gme_negotiate (GstGmeDec * gme) } static void -gst_gme_dec_base_init (gpointer g_class) +gst_gme_dec_class_init (GstGmeDecClass * klass) { - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *element_class = (GstElementClass *) klass; + + gobject_class->dispose = gst_gme_dec_dispose; gst_element_class_set_details_simple (element_class, "Gaming console music file decoder", "Codec/Audio/Decoder", @@ -114,35 +122,17 @@ gst_gme_dec_base_init (gpointer g_class) "Chris Lee <clee@kde.org>, Brian Koropoff <bkoropoff@gmail.com>, " "Michael Pyne <mpyne@kde.org>, Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - 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_gme_dec_class_init (GstGmeDecClass * klass) -{ - GstElementClass *element_class = (GstElementClass *) klass; - GObjectClass *gobject_class = (GObjectClass *) klass; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); element_class->change_state = GST_DEBUG_FUNCPTR (gst_gme_dec_change_state); - gobject_class->dispose = gst_gme_dec_dispose; -} - -static const GstQueryType * -gst_gme_dec_src_query_type (GstPad * pad) -{ - static const GstQueryType query_types[] = { - GST_QUERY_DURATION, - GST_QUERY_POSITION, - (GstQueryType) 0 - }; - - return query_types; } static void -gst_gme_dec_init (GstGmeDec * gme, GstGmeDecClass * klass) +gst_gme_dec_init (GstGmeDec * gme) { gme->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); /* gst_pad_set_query_function (gme->sinkpad, NULL); */ @@ -153,7 +143,6 @@ gst_gme_dec_init (GstGmeDec * gme, GstGmeDecClass * klass) gme->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_set_event_function (gme->srcpad, gst_gme_dec_src_event); gst_pad_set_query_function (gme->srcpad, gst_gme_dec_src_query); - gst_pad_set_query_type_function (gme->srcpad, gst_gme_dec_src_query_type); gst_pad_use_fixed_caps (gme->srcpad); gst_element_add_pad (GST_ELEMENT (gme), gme->srcpad); @@ -175,22 +164,20 @@ gst_gme_dec_dispose (GObject * object) } static GstFlowReturn -gst_gme_dec_chain (GstPad * pad, GstBuffer * buffer) +gst_gme_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) { - GstGmeDec *gme = GST_GME_DEC (gst_pad_get_parent (pad)); + GstGmeDec *gme = GST_GME_DEC (parent); /* Accumulate GME data until end-of-stream, then commence playback. */ gst_adapter_push (gme->adapter, buffer); - gst_object_unref (gme); - return GST_FLOW_OK; } static gboolean -gst_gme_dec_sink_event (GstPad * pad, GstEvent * event) +gst_gme_dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { - GstGmeDec *gme = GST_GME_DEC (gst_pad_get_parent (pad)); + GstGmeDec *gme = GST_GME_DEC (parent); gboolean result = TRUE; gboolean forward = FALSE; @@ -213,15 +200,13 @@ gst_gme_dec_sink_event (GstPad * pad, GstEvent * event) else gst_event_unref (event); - gst_object_unref (gme); - return result; } static gboolean -gst_gme_dec_src_event (GstPad * pad, GstEvent * event) +gst_gme_dec_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { - GstGmeDec *gme = GST_GME_DEC (gst_pad_get_parent (pad)); + GstGmeDec *gme = GST_GME_DEC (parent); gboolean result = FALSE; switch (GST_EVENT_TYPE (event)) { @@ -253,6 +238,7 @@ gst_gme_dec_src_event (GstPad * pad, GstEvent * event) stop = GST_CLOCK_TIME_NONE; if (start_type == GST_SEEK_TYPE_SET) { + GstSegment seg; guint64 cur = gme_tell (gme->player) * GST_MSECOND; guint64 dest = (guint64) start; @@ -280,15 +266,19 @@ gst_gme_dec_src_event (GstPad * pad, GstEvent * event) } if (flush) { - gst_pad_push_event (gme->srcpad, gst_event_new_flush_stop ()); + gst_pad_push_event (gme->srcpad, gst_event_new_flush_stop (TRUE)); } if (stop == GST_CLOCK_TIME_NONE && gme->total_duration != GST_CLOCK_TIME_NONE) stop = gme->total_duration; - gst_pad_push_event (gme->srcpad, gst_event_new_new_segment (FALSE, rate, - GST_FORMAT_TIME, dest, stop, dest)); + gst_segment_init (&seg, GST_FORMAT_TIME); + seg.rate = rate; + seg.start = dest; + seg.stop = stop; + seg.time = dest; + gst_pad_push_event (gme->srcpad, gst_event_new_segment (&seg)); gme->seekpoint = dest / GST_MSECOND; /* nsecs to msecs */ gme->seeking = TRUE; @@ -306,15 +296,13 @@ gst_gme_dec_src_event (GstPad * pad, GstEvent * event) break; } - gst_object_unref (gme); - return result; } static gboolean -gst_gme_dec_src_query (GstPad * pad, GstQuery * query) +gst_gme_dec_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { - GstGmeDec *gme = GST_GME_DEC (gst_pad_get_parent (pad)); + GstGmeDec *gme = GST_GME_DEC (parent); gboolean result = TRUE; switch (GST_QUERY_TYPE (query)) { @@ -345,12 +333,10 @@ gst_gme_dec_src_query (GstPad * pad, GstQuery * query) break; } default: - result = gst_pad_query_default (pad, query); + result = gst_pad_query_default (pad, parent, query); break; } - gst_object_unref (gme); - return result; } @@ -365,13 +351,15 @@ gst_gme_play (GstPad * pad) const int NUM_SAMPLES = 1600; /* 4 bytes (stereo 16-bit) per sample */ if (!seeking) { + short *data; + out = gst_buffer_new_and_alloc (NUM_SAMPLES * 4); - gst_buffer_set_caps (out, GST_PAD_CAPS (pad)); GST_BUFFER_TIMESTAMP (out) = gme_tell (gme->player) * GST_MSECOND; - gme_err = - gme_play (gme->player, NUM_SAMPLES * 2, - (short *) GST_BUFFER_DATA (out)); + data = gst_buffer_map (out, NULL, NULL, GST_MAP_WRITE); + gme_err = gme_play (gme->player, NUM_SAMPLES * 2, data); + gst_buffer_unmap (out, data, -1); + if (gme_err) { GST_ELEMENT_ERROR (gme, STREAM, DEMUX, (NULL), (gme_err)); gst_pad_pause_task (pad); @@ -384,7 +372,6 @@ gst_gme_play (GstPad * pad) gme->seeking = FALSE; out = gst_buffer_new (); - gst_buffer_set_caps (out, GST_PAD_CAPS (pad)); } if ((flow_return = gst_pad_push (gme->srcpad, out)) != GST_FLOW_OK) { @@ -423,6 +410,9 @@ gme_setup (GstGmeDec * gme) guint64 total_duration; guint64 fade_time; GstBuffer *buffer; + GstSegment seg; + guint8 *data; + gsize size; if (!gst_adapter_available (gme->adapter) || !gme_negotiate (gme)) { return FALSE; @@ -432,9 +422,9 @@ gme_setup (GstGmeDec * gme) gst_adapter_take_buffer (gme->adapter, gst_adapter_available (gme->adapter)); - gme_err = - gme_open_data (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), - &gme->player, 32000); + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + gme_err = gme_open_data (data, size, &gme->player, 32000); + gst_buffer_unmap (buffer, data, size); gst_buffer_unref (buffer); if (gme_err || !gme->player) { @@ -450,7 +440,7 @@ gme_setup (GstGmeDec * gme) gme_err = gme_track_info (gme->player, &info, 0); - taglist = gst_tag_list_new (); + taglist = gst_tag_list_new_empty (); if (info->song && *info->song) gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, @@ -486,7 +476,7 @@ gme_setup (GstGmeDec * gme) gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_DURATION, total_duration, NULL); - gst_element_found_tags_for_pad (GST_ELEMENT (gme), gme->srcpad, taglist); + gst_pad_push_event (gme->srcpad, gst_event_new_tag (taglist)); g_free (info); @@ -498,8 +488,8 @@ gme_setup (GstGmeDec * gme) if (fade_time) gme_set_fade (gme->player, fade_time); - gst_pad_push_event (gme->srcpad, gst_event_new_new_segment (FALSE, 1.0, - GST_FORMAT_TIME, 0, -1, 0)); + gst_segment_init (&seg, GST_FORMAT_TIME); + gst_pad_push_event (gme->srcpad, gst_event_new_segment (&seg)); gst_pad_start_task (gme->srcpad, (GstTaskFunction) gst_gme_play, gme->srcpad); diff --git a/ext/gsettings/gstswitchsink.c b/ext/gsettings/gstswitchsink.c index da31df2b0..1fccf683f 100644 --- a/ext/gsettings/gstswitchsink.c +++ b/ext/gsettings/gstswitchsink.c @@ -64,7 +64,8 @@ gst_switch_sink_class_init (GstSwitchSinkClass * klass) /* Provide a default pad template if the child didn't */ child_pad_templ = gst_element_class_get_pad_template (eklass, "sink"); if (child_pad_templ == NULL) { - gst_element_class_add_static_pad_template (eklass, &sink_template); + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&sink_template)); } } diff --git a/ext/gsettings/gstswitchsrc.c b/ext/gsettings/gstswitchsrc.c index 664e0bd8a..0136e4a86 100644 --- a/ext/gsettings/gstswitchsrc.c +++ b/ext/gsettings/gstswitchsrc.c @@ -60,7 +60,8 @@ gst_switch_src_class_init (GstSwitchSrcClass * klass) /* Provide a default pad template if the child didn't */ child_pad_templ = gst_element_class_get_pad_template (eklass, "src"); if (child_pad_templ == NULL) { - gst_element_class_add_static_pad_template (eklass, &src_template); + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&src_template)); } } diff --git a/ext/gsm/gstgsmdec.c b/ext/gsm/gstgsmdec.c index 65d3275e5..3318bdc77 100644 --- a/ext/gsm/gstgsmdec.c +++ b/ext/gsm/gstgsmdec.c @@ -106,10 +106,10 @@ gst_gsmdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gsmdec_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gsmdec_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gsmdec_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gsmdec_src_template)); gst_element_class_set_details_simple (element_class, "GSM audio decoder", "Codec/Decoder/Audio", "Decodes GSM encoded audio", "Philippe Khalaf <burger@speedy.org>"); diff --git a/ext/gsm/gstgsmenc.c b/ext/gsm/gstgsmenc.c index 52d0b55b2..434c4b1fa 100644 --- a/ext/gsm/gstgsmenc.c +++ b/ext/gsm/gstgsmenc.c @@ -100,10 +100,10 @@ gst_gsmenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gsmenc_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gsmenc_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gsmenc_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gsmenc_src_template)); gst_element_class_set_details_simple (element_class, "GSM audio encoder", "Codec/Encoder/Audio", "Encodes GSM audio", "Philippe Khalaf <burger@speedy.org>"); diff --git a/ext/hermes/gsthermescolorspace.c b/ext/hermes/gsthermescolorspace.c index 477a43f36..c46572c77 100644 --- a/ext/hermes/gsthermescolorspace.c +++ b/ext/hermes/gsthermescolorspace.c @@ -501,10 +501,10 @@ gst_hermes_colorspace_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_hermes_colorspace_src_pad_template); - gst_element_class_add_static_pad_template (element_class, - &gst_hermes_colorspace_sink_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_hermes_colorspace_src_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_hermes_colorspace_sink_pad_template)); gst_element_class_set_details_simple (element_class, "Colorspace converter", "Filter/Converter/Video", diff --git a/ext/jp2k/gstjasperdec.c b/ext/jp2k/gstjasperdec.c index 7cde2fd13..e896142bd 100644 --- a/ext/jp2k/gstjasperdec.c +++ b/ext/jp2k/gstjasperdec.c @@ -95,10 +95,10 @@ gst_jasper_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_jasper_dec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_jasper_dec_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_jasper_dec_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_jasper_dec_sink_template)); gst_element_class_set_details_simple (element_class, "Jasper JPEG2000 image decoder", "Codec/Decoder/Image", "Decodes JPEG2000 encoded images using jasper", diff --git a/ext/jp2k/gstjasperenc.c b/ext/jp2k/gstjasperenc.c index a43bb36ec..ae7b92567 100644 --- a/ext/jp2k/gstjasperenc.c +++ b/ext/jp2k/gstjasperenc.c @@ -99,10 +99,10 @@ gst_jasper_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_jasper_enc_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_jasper_enc_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_jasper_enc_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_jasper_enc_sink_template)); gst_element_class_set_details_simple (element_class, "Jasper JPEG2000 image encoder", "Codec/Encoder/Image", "Encodes video to JPEG2000 using jasper", diff --git a/ext/kate/gstkatedec.c b/ext/kate/gstkatedec.c index 76c918ebc..6b1ee73d4 100644 --- a/ext/kate/gstkatedec.c +++ b/ext/kate/gstkatedec.c @@ -117,7 +117,8 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("text/plain; text/x-pango-markup; " GST_KATE_SPU_MIME_TYPE) ); -GST_BOILERPLATE (GstKateDec, gst_kate_dec, GstElement, GST_TYPE_ELEMENT); +#define gst_kate_dec_parent_class parent_class +G_DEFINE_TYPE (GstKateDec, gst_kate_dec, GST_TYPE_ELEMENT); static void gst_kate_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -130,21 +131,7 @@ static GstStateChangeReturn gst_kate_dec_change_state (GstElement * element, static gboolean gst_kate_dec_sink_query (GstPad * pad, GstQuery * query); static gboolean gst_kate_dec_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_kate_dec_sink_handle_event (GstPad * pad, GstEvent * event); -static GstCaps *gst_kate_dec_src_get_caps (GstPad * pad); - -static void -gst_kate_dec_base_init (gpointer gclass) -{ - - GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_set_details_simple (element_class, - "Kate stream text decoder", "Codec/Decoder/Subtitle", - "Decodes Kate text streams", - "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); -} +static GstCaps *gst_kate_dec_src_get_caps (GstPad * pad, GstCaps * filter); /* initialize the plugin's class */ static void @@ -168,6 +155,16 @@ gst_kate_dec_class_init (GstKateDecClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_kate_dec_change_state); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, + "Kate stream text decoder", "Codec/Decoder/Subtitle", + "Decodes Kate text streams", + "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); } /* initialize the new element @@ -176,7 +173,7 @@ gst_kate_dec_class_init (GstKateDecClass * klass) * initialize structure */ static void -gst_kate_dec_init (GstKateDec * dec, GstKateDecClass * gclass) +gst_kate_dec_init (GstKateDec * dec) { GST_DEBUG_OBJECT (dec, "gst_kate_dec_init"); @@ -292,12 +289,11 @@ gst_kate_dec_chain (GstPad * pad, GstBuffer * buf) buffer = gst_buffer_new_and_alloc (len + 1); if (G_LIKELY (buffer)) { const char *mime = plain ? "text/plain" : "text/x-pango-markup"; - GstCaps *caps = gst_caps_new_simple (mime, NULL); - gst_buffer_set_caps (buffer, caps); + GstCaps *caps = gst_caps_new_empty_simple (mime); gst_caps_unref (caps); /* allocate and copy the NULs, but don't include them in passed size */ - memcpy (GST_BUFFER_DATA (buffer), escaped, len + 1); - GST_BUFFER_SIZE (buffer) = len; + gst_buffer_fill (buffer, 0, escaped, len + 1); + gst_buffer_resize (buffer, 0, len); GST_BUFFER_TIMESTAMP (buffer) = ev->start_time * GST_SECOND; GST_BUFFER_DURATION (buffer) = (ev->end_time - ev->start_time) * GST_SECOND; @@ -328,9 +324,6 @@ gst_kate_dec_chain (GstPad * pad, GstBuffer * buf) if (ev->bitmap && ev->palette) { GstBuffer *buffer = gst_kate_spu_encode_spu (kd, ev); if (buffer) { - GstCaps *caps = gst_caps_new_simple (GST_KATE_SPU_MIME_TYPE, NULL); - gst_buffer_set_caps (buffer, caps); - gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (buffer) = ev->start_time * GST_SECOND; GST_BUFFER_DURATION (buffer) = (ev->end_time - ev->start_time) * GST_SECOND; @@ -414,8 +407,8 @@ gst_kate_dec_sink_handle_event (GstPad * pad, GstEvent * event) GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: - gst_kate_util_decoder_base_new_segment_event (&kd->decoder, event); + case GST_EVENT_SEGMENT: + gst_kate_util_decoder_base_segment_event (&kd->decoder, event); res = gst_pad_event_default (pad, event); break; @@ -440,7 +433,7 @@ gst_kate_dec_sink_handle_event (GstPad * pad, GstEvent * event) } static GstCaps * -gst_kate_dec_src_get_caps (GstPad * pad) +gst_kate_dec_src_get_caps (GstPad * pad, GstCaps * filter) { GstKateDec *kd = (GstKateDec *) (gst_object_get_parent (GST_OBJECT (pad))); GstCaps *caps; diff --git a/ext/kate/gstkateenc.c b/ext/kate/gstkateenc.c index e378a5cf3..8ee8b69df 100644 --- a/ext/kate/gstkateenc.c +++ b/ext/kate/gstkateenc.c @@ -142,24 +142,10 @@ static GstStateChangeReturn gst_kate_enc_change_state (GstElement * element, static gboolean gst_kate_enc_sink_event (GstPad * pad, GstEvent * event); static const GstQueryType *gst_kate_enc_source_query_type (GstPad * pad); static gboolean gst_kate_enc_source_query (GstPad * pad, GstQuery * query); -static void gst_kate_enc_add_interfaces (GType kateenc_type); -GST_BOILERPLATE_FULL (GstKateEnc, gst_kate_enc, GstElement, - GST_TYPE_ELEMENT, gst_kate_enc_add_interfaces); - -static void -gst_kate_enc_base_init (gpointer gclass) -{ - - GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_set_details_simple (element_class, "Kate stream encoder", - "Codec/Encoder/Subtitle", - "Encodes Kate streams from text or subpictures", - "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); -} +#define gst_kate_enc_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstKateEnc, gst_kate_enc, GST_TYPE_ELEMENT, + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL)); /* initialize the plugin's class */ static void @@ -171,8 +157,6 @@ gst_kate_enc_class_init (GstKateEncClass * klass) gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_peek_parent (klass); - gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_enc_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_kate_enc_get_property); gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_kate_enc_dispose); @@ -226,15 +210,16 @@ gst_kate_enc_class_init (GstKateEncClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_kate_enc_change_state); -} -static void -gst_kate_enc_add_interfaces (GType kateenc_type) -{ - static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_factory)); - g_type_add_interface_static (kateenc_type, GST_TYPE_TAG_SETTER, - &tag_setter_info); + gst_element_class_set_details_simple (gstelement_class, "Kate stream encoder", + "Codec/Encoder/Subtitle", + "Encodes Kate streams from text or subpictures", + "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); } /* initialize the new element @@ -243,7 +228,7 @@ gst_kate_enc_add_interfaces (GType kateenc_type) * initialize structure */ static void -gst_kate_enc_init (GstKateEnc * ke, GstKateEncClass * gclass) +gst_kate_enc_init (GstKateEnc * ke) { GST_DEBUG_OBJECT (ke, "gst_kate_enc_init"); @@ -252,8 +237,6 @@ gst_kate_enc_init (GstKateEnc * ke, GstKateEncClass * gclass) GST_DEBUG_FUNCPTR (gst_kate_enc_chain)); gst_pad_set_event_function (ke->sinkpad, GST_DEBUG_FUNCPTR (gst_kate_enc_sink_event)); - gst_pad_set_setcaps_function (ke->sinkpad, - GST_DEBUG_FUNCPTR (gst_kate_enc_setcaps)); gst_element_add_pad (GST_ELEMENT (ke), ke->sinkpad); ke->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); @@ -408,14 +391,14 @@ gst_kate_enc_create_buffer (GstKateEnc * ke, kate_packet * kp, g_return_val_if_fail (kp != NULL, NULL); g_return_val_if_fail (kp->data != NULL, NULL); - buffer = gst_buffer_try_new_and_alloc (kp->nbytes); + buffer = gst_buffer_new_allocate (NULL, kp->nbytes, 0); if (G_UNLIKELY (!buffer)) { GST_WARNING_OBJECT (ke, "Failed to allocate buffer for %u bytes", (guint) kp->nbytes); return NULL; } - memcpy (GST_BUFFER_DATA (buffer), kp->data, kp->nbytes); + gst_buffer_fill (buffer, 0, kp->data, kp->nbytes); /* same system as other Ogg codecs, as per ext/ogg/README: OFFSET_END is the granulepos @@ -642,16 +625,6 @@ gst_kate_enc_send_headers (GstKateEnc * ke) if (caps) { GST_DEBUG_OBJECT (ke, "here are the caps: %" GST_PTR_FORMAT, caps); gst_pad_set_caps (ke->srcpad, caps); - - GST_LOG_OBJECT (ke, "setting caps on headers"); - item = headers; - while (item) { - GstBuffer *buffer = item->data; - GST_LOG_OBJECT (ke, "settings caps on header %p", buffer); - gst_buffer_set_caps (buffer, caps); - item = item->next; - } - gst_caps_unref (caps); GST_LOG_OBJECT (ke, "pushing headers"); @@ -867,7 +840,7 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf) #endif GST_DEBUG_OBJECT (ke, "Encoding %ux%u SPU: (%u bytes) from %f to %f", (guint) kbitmap->width, (guint) kbitmap->height, - GST_BUFFER_SIZE (buf), t0, t1); + gst_buffer_get_size (buf), t0, t1); ret = kate_encode_set_region (&ke->k, kregion); if (G_UNLIKELY (ret < 0)) { @@ -951,15 +924,18 @@ gst_kate_enc_chain_text (GstKateEnc * ke, GstBuffer * buf, ("kate_encode_set_markup_type: %d", ret)); rflow = GST_FLOW_ERROR; } else { - const char *text = (const char *) GST_BUFFER_DATA (buf); + char *text; + gsize text_len; + + text = gst_buffer_map (buf, &text_len, NULL, GST_MAP_READ); if (text) { - size_t text_len = GST_BUFFER_SIZE (buf); kate_float t0 = start / (double) GST_SECOND; kate_float t1 = stop / (double) GST_SECOND; GST_LOG_OBJECT (ke, "Encoding text: %*.*s (%u bytes) from %f to %f", - (int) text_len, (int) text_len, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf), t0, t1); + (int) text_len, (int) text_len, text, text_len, t0, t1); + ret = kate_encode_text (&ke->k, t0, t1, text, text_len, &kp); + if (G_UNLIKELY (ret < 0)) { GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL), ("Failed to encode text: %d", ret)); @@ -974,6 +950,7 @@ gst_kate_enc_chain_text (GstKateEnc * ke, GstBuffer * buf, ("no text in text packet")); rflow = GST_FLOW_ERROR; } + gst_buffer_unmap (buf, text, text_len); } return rflow; @@ -990,10 +967,10 @@ gst_kate_enc_chain (GstPad * pad, GstBuffer * buf) GstCaps *caps; const gchar *mime_type = NULL; - GST_DEBUG_OBJECT (ke, "got packet, %u bytes", GST_BUFFER_SIZE (buf)); + GST_DEBUG_OBJECT (ke, "got packet, %u bytes", gst_buffer_get_size (buf)); /* get the type of the data we're being sent */ - caps = GST_PAD_CAPS (pad); + caps = gst_pad_get_current_caps (pad); if (G_UNLIKELY (caps == NULL)) { GST_WARNING_OBJECT (ke, "No input caps set"); rflow = GST_FLOW_NOT_NEGOTIATED; @@ -1025,6 +1002,7 @@ gst_kate_enc_chain (GstPad * pad, GstBuffer * buf) } else { GST_WARNING_OBJECT (ke, "Packet has no MIME type, ignored"); } + gst_caps_unref (caps); } gst_buffer_unref (buf); @@ -1047,7 +1025,7 @@ gst_kate_enc_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: - ke->tags = gst_tag_list_new (); + ke->tags = gst_tag_list_new_empty (); break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_DEBUG_OBJECT (ke, "READY -> PAUSED, initializing kate state"); @@ -1259,38 +1237,46 @@ static gboolean gst_kate_enc_sink_event (GstPad * pad, GstEvent * event) { GstKateEnc *ke = GST_KATE_ENC (gst_pad_get_parent (pad)); - GstStructure *structure; + const GstStructure *structure; gboolean ret; switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_kate_enc_setcaps (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_SEGMENT: GST_LOG_OBJECT (ke, "Got newsegment event"); if (ke->initialized) { GST_LOG_OBJECT (ke, "ensuring all headers are in"); if (gst_kate_enc_flush_headers (ke) != GST_FLOW_OK) { GST_WARNING_OBJECT (ke, "Failed to flush headers"); } else { - GstFormat format; - gint64 timestamp; + GstSegment seg; - gst_event_parse_new_segment (event, NULL, NULL, &format, ×tamp, - NULL, NULL); - if (format != GST_FORMAT_TIME || !GST_CLOCK_TIME_IS_VALID (timestamp)) { + gst_event_copy_segment (event, &seg); + if (seg.format != GST_FORMAT_TIME + || !GST_CLOCK_TIME_IS_VALID (seg.start)) { GST_WARNING_OBJECT (ke, "No time in newsegment event %p, format %d, timestamp %" - G_GINT64_FORMAT, event, (int) format, timestamp); + G_GINT64_FORMAT, event, (int) seg.format, seg.start); /* to be safe, we'd need to generate a keepalive anyway, but we'd have to guess at the timestamp to use; a good guess would be the last known timestamp plus the keepalive time, but if we then get a packet with a timestamp less than this, it would fail to encode, which would be Bad. If we don't encode a keepalive, we run the risk of stalling the pipeline and hanging, which is Very Bad. Oh dear. We can't exit(-1), can we ? */ } else { - float t = timestamp / (double) GST_SECOND; + float t = seg.start / (double) GST_SECOND; if (ke->delayed_spu && t - ke->delayed_start / (double) GST_SECOND >= ke->default_spu_duration) { if (G_UNLIKELY (gst_kate_enc_flush_waiting (ke, - timestamp) != GST_FLOW_OK)) { + seg.start) != GST_FLOW_OK)) { GST_WARNING_OBJECT (ke, "Failed to encode delayed packet"); /* continue with new segment handling anyway */ } @@ -1305,7 +1291,7 @@ gst_kate_enc_sink_event (GstPad * pad, GstEvent * event) /* we only generate a keepalive if there is no SPU waiting, as it would mean out of sequence start times - and granulepos */ if (!ke->delayed_spu) { - gst_kate_enc_generate_keepalive (ke, timestamp); + gst_kate_enc_generate_keepalive (ke, seg.start); } } } @@ -1317,7 +1303,7 @@ gst_kate_enc_sink_event (GstPad * pad, GstEvent * event) case GST_EVENT_CUSTOM_DOWNSTREAM: GST_LOG_OBJECT (ke, "Got custom downstream event"); /* adapted from the dvdsubdec element */ - structure = event->structure; + structure = gst_event_get_structure (event); if (structure != NULL && gst_structure_has_name (structure, "application/x-gst-dvd")) { if (ke->initialized) { diff --git a/ext/kate/gstkateparse.c b/ext/kate/gstkateparse.c index fff1208b3..80c7ca41b 100644 --- a/ext/kate/gstkateparse.c +++ b/ext/kate/gstkateparse.c @@ -83,7 +83,8 @@ static GstStaticPadTemplate gst_kate_parse_src_factory = GST_STATIC_CAPS ("subtitle/x-kate; application/x-kate") ); -GST_BOILERPLATE (GstKateParse, gst_kate_parse, GstElement, GST_TYPE_ELEMENT); +#define gst_kate_parse_parent_class parent_class +G_DEFINE_TYPE (GstKateParse, gst_kate_parse, GST_TYPE_ELEMENT); static GstFlowReturn gst_kate_parse_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_kate_parse_change_state (GstElement * element, @@ -99,32 +100,27 @@ static GstFlowReturn gst_kate_parse_parse_packet (GstKateParse * parse, GstBuffer * buf); static void -gst_kate_parse_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_kate_parse_src_factory); - gst_element_class_add_static_pad_template (element_class, - &gst_kate_parse_sink_factory); - gst_element_class_set_details_simple (element_class, "Kate stream parser", - "Codec/Parser/Subtitle", - "parse raw kate streams", - "Vincent Penquerc'h <ogg.k.ogg.k at googlemail dot com>"); -} - -static void gst_kate_parse_class_init (GstKateParseClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gstelement_class->change_state = gst_kate_parse_change_state; + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_kate_parse_src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_kate_parse_sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, "Kate stream parser", + "Codec/Parser/Subtitle", + "parse raw kate streams", + "Vincent Penquerc'h <ogg.k.ogg.k at googlemail dot com>"); + klass->parse_packet = GST_DEBUG_FUNCPTR (gst_kate_parse_parse_packet); } static void -gst_kate_parse_init (GstKateParse * parse, GstKateParseClass * g_class) +gst_kate_parse_init (GstKateParse * parse) { parse->sinkpad = gst_pad_new_from_static_template (&gst_kate_parse_sink_factory, "sink"); @@ -166,7 +162,7 @@ gst_kate_parse_push_headers (GstKateParse * parse) /* get the headers into the caps, passing them to kate as we go */ caps = gst_kate_util_set_header_on_caps (&parse->element, - gst_pad_get_negotiated_caps (parse->sinkpad), parse->streamheader); + gst_pad_get_current_caps (parse->sinkpad), parse->streamheader); if (G_UNLIKELY (!caps)) { GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), @@ -184,13 +180,18 @@ gst_kate_parse_push_headers (GstKateParse * parse) headers = parse->streamheader; while (headers) { + guint8 *data; + gsize size; + outbuf = GST_BUFFER_CAST (headers->data); - kate_packet_wrap (&packet, GST_BUFFER_SIZE (outbuf), - GST_BUFFER_DATA (outbuf)); + + data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READ); + kate_packet_wrap (&packet, size, data); ret = kate_decode_headerin (&parse->ki, &parse->kc, &packet); if (G_UNLIKELY (ret < 0)) { GST_WARNING_OBJECT (parse, "kate_decode_headerin returned %d", ret); } + gst_buffer_unmap (outbuf, data, size); /* takes ownership of outbuf, which was previously in parse->streamheader */ outbuf_list = g_list_append (outbuf_list, outbuf); headers = headers->next; @@ -203,7 +204,6 @@ gst_kate_parse_push_headers (GstKateParse * parse) headers = outbuf_list; while (headers) { outbuf = GST_BUFFER_CAST (headers->data); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (parse->srcpad)); gst_pad_push (parse->srcpad, outbuf); headers = headers->next; } @@ -255,8 +255,6 @@ gst_kate_parse_push_buffer (GstKateParse * parse, GstBuffer * buf, GST_BUFFER_OFFSET_END (buf) = granulepos; GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_OFFSET (buf); - gst_buffer_set_caps (buf, GST_PAD_CAPS (parse->srcpad)); - return gst_pad_push (parse->srcpad, buf); } @@ -318,7 +316,7 @@ gst_kate_parse_queue_buffer (GstKateParse * parse, GstBuffer * buf) GstFlowReturn ret = GST_FLOW_OK; gint64 granpos; - buf = gst_buffer_make_metadata_writable (buf); + buf = gst_buffer_make_writable (buf); /* oggdemux stores the granule pos in the offset end */ granpos = GST_BUFFER_OFFSET_END (buf); @@ -347,17 +345,20 @@ static GstFlowReturn gst_kate_parse_parse_packet (GstKateParse * parse, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; + guint8 header[1]; + gsize size; g_assert (parse); parse->packetno++; + size = gst_buffer_extract (buf, 0, header, 1); + GST_LOG_OBJECT (parse, "Got packet %02x, %u bytes", - GST_BUFFER_SIZE (buf) ? GST_BUFFER_DATA (buf)[0] : -1, - GST_BUFFER_SIZE (buf)); + size ? header[0] : -1, gst_buffer_get_size (buf)); - if (GST_BUFFER_SIZE (buf) > 0 && GST_BUFFER_DATA (buf)[0] & 0x80) { - GST_DEBUG_OBJECT (parse, "Found header %02x", GST_BUFFER_DATA (buf)[0]); + if (size > 0 && header[0] & 0x80) { + GST_DEBUG_OBJECT (parse, "Found header %02x", header[0]); /* if 0x80 is set, it's streamheader, * so put it on the streamheader list and return */ parse->streamheader = g_list_append (parse->streamheader, buf); @@ -387,7 +388,7 @@ gst_kate_parse_chain (GstPad * pad, GstBuffer * buffer) g_assert (klass->parse_packet != NULL); - if (G_UNLIKELY (GST_PAD_CAPS (pad) == NULL)) + if (G_UNLIKELY (!gst_pad_has_current_caps (pad))) return GST_FLOW_NOT_NEGOTIATED; return klass->parse_packet (parse, buffer); @@ -602,7 +603,7 @@ gst_kate_parse_change_state (GstElement * element, GstStateChange transition) break; } - ret = parent_class->change_state (element, transition); + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: diff --git a/ext/kate/gstkatespu.c b/ext/kate/gstkatespu.c index 439291634..85606495e 100644 --- a/ext/kate/gstkatespu.c +++ b/ext/kate/gstkatespu.c @@ -276,17 +276,17 @@ gst_kate_spu_decode_command_sequence (GstKateEnc * ke, GstBuffer * buf, guint16 date; guint16 next_command_sequence; const guint8 *ptr; + guint8 *data; guint16 sz; + gsize size; - if (command_sequence_offset >= GST_BUFFER_SIZE (buf)) { - GST_ELEMENT_ERROR (ke, STREAM, DECODE, (NULL), - ("Command sequence offset %u is out of range %u", - command_sequence_offset, GST_BUFFER_SIZE (buf))); - return GST_FLOW_ERROR; - } + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); - ptr = GST_BUFFER_DATA (buf) + command_sequence_offset; - sz = GST_BUFFER_SIZE (buf) - command_sequence_offset; + if (command_sequence_offset >= size) + goto out_of_range; + + ptr = data + command_sequence_offset; + sz = size - command_sequence_offset; GST_DEBUG_OBJECT (ke, "Decoding command sequence at %u (%u bytes)", command_sequence_offset, sz); @@ -353,21 +353,35 @@ gst_kate_spu_decode_command_sequence (GstKateEnc * ke, GstBuffer * buf, if (next_command_sequence != command_sequence_offset) { GST_DEBUG_OBJECT (ke, "Jumping to next sequence at offset %u", next_command_sequence); + gst_buffer_unmap (buf, data, size); return gst_kate_spu_decode_command_sequence (ke, buf, next_command_sequence); } else { + gst_buffer_unmap (buf, data, size); GST_DEBUG_OBJECT (ke, "No more sequences to decode"); return GST_FLOW_OK; } break; default: + gst_buffer_unmap (buf, data, size); GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL), ("Invalid SPU command: %u", cmd)); return GST_FLOW_ERROR; } } + gst_buffer_unmap (buf, data, size); GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL), ("Error parsing SPU")); return GST_FLOW_ERROR; + + /* ERRORS */ +out_of_range: + { + gst_buffer_unmap (buf, data, size); + GST_ELEMENT_ERROR (ke, STREAM, DECODE, (NULL), + ("Command sequence offset %u is out of range %u", + command_sequence_offset, size)); + return GST_FLOW_ERROR; + } } static inline int @@ -451,8 +465,10 @@ GstFlowReturn gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, kate_bitmap * kb, kate_palette * kp) { - const guint8 *ptr = GST_BUFFER_DATA (buf); - size_t sz = GST_BUFFER_SIZE (buf); + guint8 *data; + gsize size; + const guint8 *ptr; + size_t sz; guint16 packet_size; guint16 x, y; size_t n; @@ -463,6 +479,11 @@ gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, guint16 next_command_sequence; guint16 code; + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + + ptr = data; + sz = size; + /* before decoding anything, initialize to sensible defaults */ memset (ke->spu_colormap, 0, sizeof (ke->spu_colormap)); memset (ke->spu_alpha, 0, sizeof (ke->spu_alpha)); @@ -476,19 +497,21 @@ gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, packet_size = GST_KATE_UINT16_BE (ptr); ADVANCE (2); GST_DEBUG_OBJECT (ke, "packet size %u (GstBuffer size %u)", packet_size, - GST_BUFFER_SIZE (buf)); + size); CHECK (2); next_command_sequence = GST_KATE_UINT16_BE (ptr); ADVANCE (2); - ptr = GST_BUFFER_DATA (buf) + next_command_sequence; - sz = GST_BUFFER_SIZE (buf) - next_command_sequence; + ptr = data + next_command_sequence; + sz = size - next_command_sequence; GST_DEBUG_OBJECT (ke, "next command sequence at %u for %u", next_command_sequence, (guint) sz); rflow = gst_kate_spu_decode_command_sequence (ke, buf, next_command_sequence); - if (G_UNLIKELY (rflow != GST_FLOW_OK)) + if (G_UNLIKELY (rflow != GST_FLOW_OK)) { + gst_buffer_unmap (buf, data, size); return rflow; + } /* if no addresses or sizes were given, or if they define an empty SPU, nothing more to do */ if (G_UNLIKELY (ke->spu_right - ke->spu_left < 0 @@ -501,13 +524,16 @@ gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, GST_WARNING_OBJECT (ke, "SPU area is empty, nothing to encode"); kate_bitmap_init (kb); kb->width = kb->height = 0; + gst_buffer_unmap (buf, data, size); return GST_FLOW_OK; } /* create the palette */ rflow = gst_kate_spu_create_spu_palette (ke, kp); - if (G_UNLIKELY (rflow != GST_FLOW_OK)) + if (G_UNLIKELY (rflow != GST_FLOW_OK)) { + gst_buffer_unmap (buf, data, size); return rflow; + } /* create the bitmap */ kate_bitmap_init (kb); @@ -517,14 +543,15 @@ gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, kb->type = kate_bitmap_type_paletted; kb->pixels = (unsigned char *) g_malloc (kb->width * kb->height); if (G_UNLIKELY (!kb->pixels)) { + gst_buffer_unmap (buf, data, size); GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL), ("Failed to allocate memory for pixel data")); return GST_FLOW_ERROR; } n = 0; - pixptr[0] = GST_BUFFER_DATA (buf) + ke->spu_pix_data[0]; - pixptr[1] = GST_BUFFER_DATA (buf) + ke->spu_pix_data[1]; + pixptr[0] = data + ke->spu_pix_data[0]; + pixptr[1] = data + ke->spu_pix_data[1]; nybble_offset[0] = 0; nybble_offset[1] = 0; max_nybbles[0] = 2 * (packet_size - ke->spu_pix_data[0]); @@ -591,6 +618,7 @@ gst_kate_spu_decode_spu (GstKateEnc * ke, GstBuffer * buf, kate_region * kr, probably going to end before the next one while being readable */ //ke->hide_time = ke->show_time + (1000 * 90 / 1024); } + gst_buffer_unmap (buf, data, size); return GST_FLOW_OK; } @@ -856,15 +884,12 @@ gst_kate_spu_encode_spu (GstKateDec * kd, const kate_event * ev) bytes[3] = first_commands_offset & 0xff; /* Create a buffer with those values */ - buffer = gst_buffer_new (); + buffer = gst_buffer_new_wrapped (bytes, nbytes); if (G_UNLIKELY (!buffer)) { GST_WARNING_OBJECT (kd, "Failed to allocate %" G_GSIZE_FORMAT " byte buffer", nbytes); goto error; } - GST_BUFFER_DATA (buffer) = bytes; - GST_BUFFER_MALLOCDATA (buffer) = bytes; - GST_BUFFER_SIZE (buffer) = nbytes; GST_BUFFER_OFFSET_END (buffer) = GST_SECOND * (ev->end_time); GST_BUFFER_OFFSET (buffer) = GST_SECOND * (ev->start_time); GST_BUFFER_TIMESTAMP (buffer) = GST_SECOND * (ev->start_time); diff --git a/ext/kate/gstkatetag.c b/ext/kate/gstkatetag.c index 34d8cf26d..38e2a3c35 100644 --- a/ext/kate/gstkatetag.c +++ b/ext/kate/gstkatetag.c @@ -97,38 +97,19 @@ static void gst_kate_tag_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_kate_tag_dispose (GObject * object); - -#define _do_init(type) \ - G_STMT_START{ \ - static const GInterfaceInfo tag_setter_info = { \ - NULL, \ - NULL, \ - NULL \ - }; \ - g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, \ - &tag_setter_info); \ - }G_STMT_END - -GST_BOILERPLATE_FULL (GstKateTag, gst_kate_tag, GstKateParse, - GST_TYPE_KATE_PARSE, _do_init); - -static void -gst_kate_tag_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, "Kate stream tagger", - "Formatter/Metadata", - "Retags kate streams", "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); -} +#define gst_kate_tag_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstKateTag, gst_kate_tag, GST_TYPE_KATE_PARSE, + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL)); static void gst_kate_tag_class_init (GstKateTagClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstKateParseClass *gstkateparse_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; gstkateparse_class = GST_KATE_PARSE_CLASS (klass); gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_kate_tag_set_property); @@ -155,12 +136,16 @@ gst_kate_tag_class_init (GstKateTagClass * klass) "Set the height of the canvas this stream was authored for (0 is unspecified)", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_set_details_simple (gstelement_class, "Kate stream tagger", + "Formatter/Metadata", + "Retags kate streams", "Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>"); + gstkateparse_class->parse_packet = GST_DEBUG_FUNCPTR (gst_kate_tag_parse_packet); } static void -gst_kate_tag_init (GstKateTag * kt, GstKateTagClass * g_class) +gst_kate_tag_init (GstKateTag * kt) { kt->language = NULL; kt->category = NULL; @@ -281,44 +266,52 @@ gst_kate_tag_parse_packet (GstKateParse * parse, GstBuffer * buffer) GstKateTag *kt; gchar *encoder = NULL; GstBuffer *new_buf; + guint8 *data; + gsize size; kt = GST_KATE_TAG (parse); + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + /* rewrite the language and category */ - if (GST_BUFFER_SIZE (buffer) >= 64 && GST_BUFFER_DATA (buffer)[0] == 0x80) { - GstBuffer *new_buffer = gst_buffer_copy (buffer); + if (size >= 64 && data[0] == 0x80) { + GstBuffer *new_buffer; + gst_buffer_unmap (buffer, data, size); + new_buffer = gst_buffer_copy (buffer); gst_buffer_unref (buffer); buffer = new_buffer; + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READWRITE); /* language is at offset 32, 16 bytes, zero terminated */ if (kt->language) { - strncpy ((char *) GST_BUFFER_DATA (buffer) + 32, kt->language, 15); - GST_BUFFER_DATA (buffer)[47] = 0; + strncpy ((char *) data + 32, kt->language, 15); + data[47] = 0; } /* category is at offset 48, 16 bytes, zero terminated */ if (kt->category) { - strncpy ((char *) GST_BUFFER_DATA (buffer) + 48, kt->category, 15); - GST_BUFFER_DATA (buffer)[63] = 0; + strncpy ((char *) data + 48, kt->category, 15); + data[63] = 0; } if (kt->original_canvas_width >= 0) { guint16 v = encode_canvas_size (kt->original_canvas_width); - GST_BUFFER_DATA (buffer)[16] = v & 0xff; - GST_BUFFER_DATA (buffer)[17] = (v >> 8) & 0xff; + data[16] = v & 0xff; + data[17] = (v >> 8) & 0xff; } if (kt->original_canvas_height >= 0) { guint16 v = encode_canvas_size (kt->original_canvas_height); - GST_BUFFER_DATA (buffer)[18] = v & 0xff; - GST_BUFFER_DATA (buffer)[19] = (v >> 8) & 0xff; + data[18] = v & 0xff; + data[19] = (v >> 8) & 0xff; } } /* rewrite the comments packet */ - if (GST_BUFFER_SIZE (buffer) >= 9 && GST_BUFFER_DATA (buffer)[0] == 0x81) { + if (size >= 9 && data[0] == 0x81) { old_tags = - gst_tag_list_from_vorbiscomment_buffer (buffer, + gst_tag_list_from_vorbiscomment (data, size, (const guint8 *) "\201kate\0\0\0\0", 9, &encoder); user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (kt)); + gst_buffer_unmap (buffer, data, size); /* build new tag list */ new_tags = gst_tag_list_merge (user_tags, old_tags, @@ -328,16 +321,18 @@ gst_kate_tag_parse_packet (GstKateParse * parse, GstBuffer * buffer) new_buf = gst_tag_list_to_vorbiscomment_buffer (new_tags, (const guint8 *) "\201kate\0\0\0\0", 9, encoder); - gst_buffer_copy_metadata (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS); + gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS, 0, -1); gst_tag_list_free (new_tags); g_free (encoder); gst_buffer_unref (buffer); /* the buffer will have the framing bit used by Vorbis, but we don't use it */ - --GST_BUFFER_SIZE (new_buf); + gst_buffer_resize (new_buf, 0, gst_buffer_get_size (new_buf) - 1); buffer = new_buf; + } else { + gst_buffer_unmap (buffer, data, size); } return GST_KATE_PARSE_CLASS (parent_class)->parse_packet (parse, buffer); diff --git a/ext/kate/gstkatetiger.c b/ext/kate/gstkatetiger.c index c82be32a0..1504e112b 100644 --- a/ext/kate/gstkatetiger.c +++ b/ext/kate/gstkatetiger.c @@ -218,10 +218,12 @@ gst_kate_tiger_base_init (gpointer gclass) GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &kate_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&kate_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_factory)); gst_element_class_set_details_simple (element_class, "Kate stream renderer", "Mixer/Video/Overlay/Subtitle", "Decodes and renders Kate streams on top of a video", diff --git a/ext/kate/gstkateutil.c b/ext/kate/gstkateutil.c index 3062d5cd8..787bc3e10 100644 --- a/ext/kate/gstkateutil.c +++ b/ext/kate/gstkateutil.c @@ -247,12 +247,16 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, int ret; GstFlowReturn rflow = GST_FLOW_OK; gboolean is_header; + guint8 *data; + gsize size; + guint8 header[1]; + + size = gst_buffer_extract (buf, 0, header, 1); GST_DEBUG_OBJECT (element, "got kate packet, %u bytes, type %02x", - GST_BUFFER_SIZE (buf), - GST_BUFFER_SIZE (buf) == 0 ? -1 : GST_BUFFER_DATA (buf)[0]); + gst_buffer_get_size (buf), size == 0 ? -1 : header[0]); - is_header = GST_BUFFER_SIZE (buf) > 0 && (GST_BUFFER_DATA (buf)[0] & 0x80); + is_header = size > 0 && (header[0] & 0x80); if (!is_header && decoder->tags) { /* after we've processed headers, send any tags before processing the data packet */ @@ -262,8 +266,11 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, decoder->tags = NULL; } - kate_packet_wrap (&kp, GST_BUFFER_SIZE (buf), GST_BUFFER_DATA (buf)); + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + kate_packet_wrap (&kp, size, data); ret = kate_high_decode_packetin (&decoder->k, &kp, ev); + gst_buffer_unmap (buf, data, size); + if (G_UNLIKELY (ret < 0)) { GST_ELEMENT_ERROR (element, STREAM, DECODE, (NULL), ("Failed to decode Kate packet: %d", ret)); @@ -277,7 +284,7 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, /* headers may be interesting to retrieve information from */ if (G_UNLIKELY (is_header)) { - switch (GST_BUFFER_DATA (buf)[0]) { + switch (header[0]) { case 0x80: /* ID header */ GST_INFO_OBJECT (element, "Parsed ID header: language %s, category %s", decoder->k.ki->language, decoder->k.ki->category); @@ -288,11 +295,11 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, } if (strcmp (decoder->k.ki->category, "K-SPU") == 0 || strcmp (decoder->k.ki->category, "spu-subtitles") == 0) { - *src_caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); + *src_caps = gst_caps_new_empty_simple ("video/x-dvd-subpicture"); } else if (decoder->k.ki->text_markup_type == kate_markup_none) { - *src_caps = gst_caps_new_simple ("text/plain", NULL); + *src_caps = gst_caps_new_empty_simple ("text/plain"); } else { - *src_caps = gst_caps_new_simple ("text/x-pango-markup", NULL); + *src_caps = gst_caps_new_empty_simple ("text/x-pango-markup"); } GST_INFO_OBJECT (srcpad, "Setting caps: %" GST_PTR_FORMAT, *src_caps); if (!gst_pad_set_caps (srcpad, *src_caps)) { @@ -301,7 +308,7 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, } } if (decoder->k.ki->language && *decoder->k.ki->language) { - GstTagList *old = decoder->tags, *tags = gst_tag_list_new (); + GstTagList *old = decoder->tags, *tags = gst_tag_list_new_empty (); if (tags) { gchar *lang_code; @@ -350,7 +357,7 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, if (!decoder->tags) { GST_ERROR_OBJECT (element, "failed to decode comment header"); - decoder->tags = gst_tag_list_new (); + decoder->tags = gst_tag_list_new_empty (); } if (encoder) { gst_tag_list_add (decoder->tags, GST_TAG_MERGE_REPLACE, @@ -387,7 +394,7 @@ gst_kate_util_decoder_base_chain_kate_packet (GstKateDecoderBase * decoder, else if (*ev && (*ev)->meta) { int count = kate_meta_query_count ((*ev)->meta); if (count > 0) { - GstTagList *evtags = gst_tag_list_new (); + GstTagList *evtags = gst_tag_list_new_empty (); int idx; GST_DEBUG_OBJECT (decoder, "Kate event has %d attached metadata", count); for (idx = 0; idx < count; ++idx) { @@ -484,37 +491,23 @@ gst_kate_util_decoder_base_set_flushing (GstKateDecoderBase * decoder, } void -gst_kate_util_decoder_base_new_segment_event (GstKateDecoderBase * decoder, +gst_kate_util_decoder_base_segment_event (GstKateDecoderBase * decoder, GstEvent * event) { - gboolean update; - gdouble rate; - GstFormat format; - gint64 start, stop, time; - gdouble arate; - - gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, - &start, &stop, &time); - GST_DEBUG_OBJECT (decoder, "kate pad segment:" - " Update %d, rate %g arate %g format %d start %" GST_TIME_FORMAT - " %" GST_TIME_FORMAT " position %" GST_TIME_FORMAT, - update, rate, arate, format, GST_TIME_ARGS (start), - GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); - if (!update) { - /* Tiger uses this segment is used to remap the video running time to the - Kate running time. The sending of segment updates to keep streams in sync - does kinda rain on our parade though, and since we don't need these, - we just ignore those here */ - gst_segment_set_newsegment_full (&decoder->kate_segment, update, rate, - arate, format, start, stop, time); - } + GstSegment seg; + + gst_event_copy_segment (event, &seg); + + GST_DEBUG_OBJECT (decoder, "kate pad segment: %" GST_SEGMENT_FORMAT, &seg); + + decoder->kate_segment = seg; } gboolean gst_kate_util_decoder_base_update_segment (GstKateDecoderBase * decoder, GstElement * element, GstBuffer * buf) { - gint64 clip_start = 0, clip_stop = 0; + guint64 clip_start = 0, clip_stop = 0; gboolean in_seg; if (decoder->kate_flushing) { @@ -538,8 +531,7 @@ gst_kate_util_decoder_base_update_segment (GstKateDecoderBase * decoder, if (in_seg) { if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - gst_segment_set_last_stop (&decoder->kate_segment, GST_FORMAT_TIME, - clip_start); + decoder->kate_segment.position = clip_start; } } else { GST_INFO_OBJECT (element, "Kate buffer not in segment, ignored"); diff --git a/ext/kate/gstkateutil.h b/ext/kate/gstkateutil.h index 27b6f70f3..a837369db 100644 --- a/ext/kate/gstkateutil.h +++ b/ext/kate/gstkateutil.h @@ -82,7 +82,7 @@ extern void gst_kate_util_decoder_base_set_flushing (GstKateDecoderBase * decoder, gboolean flushing); extern void -gst_kate_util_decoder_base_new_segment_event (GstKateDecoderBase * decoder, +gst_kate_util_decoder_base_segment_event (GstKateDecoderBase * decoder, GstEvent * event); extern gboolean gst_kate_util_decoder_base_update_segment (GstKateDecoderBase * decoder, diff --git a/ext/ladspa/Makefile.am b/ext/ladspa/Makefile.am index 353ec5ebb..3d9695338 100644 --- a/ext/ladspa/Makefile.am +++ b/ext/ladspa/Makefile.am @@ -4,11 +4,11 @@ libgstladspa_la_SOURCES = gstladspa.c libgstladspa_la_CFLAGS = \ -I$(top_srcdir)/gst-libs \ $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(LRDF_CFLAGS) + $(GST_CFLAGS) $(LRDF_CFLAGS) libgstladspa_la_LIBADD = \ $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_MAJORMINOR@.la \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ - $(GST_CONTROLLER_LIBS) $(LIBM) $(LRDF_LIBS) + $(LIBM) $(LRDF_LIBS) libgstladspa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstladspa_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c index 52a8d5b2d..da03e6feb 100644 --- a/ext/ladspa/gstladspa.c +++ b/ext/ladspa/gstladspa.c @@ -34,7 +34,6 @@ #include <string.h> #include <math.h> #include <gst/audio/audio.h> -#include <gst/controller/gstcontroller.h> #include "gstladspa.h" #include <ladspa.h> /* main ladspa sdk include file */ @@ -864,9 +863,6 @@ plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (ladspa_debug, "ladspa", GST_DEBUG_FG_GREEN | GST_DEBUG_BG_BLACK | GST_DEBUG_BOLD, "LADSPA"); - /* initialize gst controller library */ - gst_controller_init (NULL, NULL); - gst_plugin_add_dependency_simple (plugin, "LADSPA_PATH", GST_LADSPA_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE); diff --git a/ext/lcs/gstcolorspace.c b/ext/lcs/gstcolorspace.c index f56d844da..5b4479c14 100644 --- a/ext/lcs/gstcolorspace.c +++ b/ext/lcs/gstcolorspace.c @@ -334,10 +334,10 @@ gst_colorspace_base_init (GstColorspaceClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_colorspace_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_colorspace_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_colorspace_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_colorspace_sink_template)); gst_element_class_set_details_simple (element_class, "Colorspace converter", "Filter/Effect", "Converts video from one colorspace to another", diff --git a/ext/libfame/gstlibfame.c b/ext/libfame/gstlibfame.c index 4765796d2..fefbd685a 100644 --- a/ext/libfame/gstlibfame.c +++ b/ext/libfame/gstlibfame.c @@ -172,9 +172,10 @@ gst_fameenc_base_init (GstFameEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "MPEG-1 and MPEG-4 video encoder", "Codec/Encoder/Video", diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c index 28a82da3c..2acf19459 100644 --- a/ext/libmms/gstmms.c +++ b/ext/libmms/gstmms.c @@ -68,43 +68,18 @@ static gboolean gst_mms_do_seek (GstBaseSrc * src, GstSegment * segment); static GstFlowReturn gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf); static gboolean gst_mms_uri_set_uri (GstURIHandler * handler, - const gchar * uri); + const gchar * uri, GError ** error); -static void -gst_mms_urihandler_init (GType mms_type) -{ - static const GInterfaceInfo urihandler_info = { - gst_mms_uri_handler_init, - NULL, - NULL - }; - - g_type_add_interface_static (mms_type, GST_TYPE_URI_HANDLER, - &urihandler_info); -} - -GST_BOILERPLATE_FULL (GstMMS, gst_mms, GstPushSrc, GST_TYPE_PUSH_SRC, - gst_mms_urihandler_init); - -static void -gst_mms_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_set_details_simple (element_class, "MMS streaming source", - "Source/Network", - "Receive data streamed via MSFT Multi Media Server protocol", - "Maciej Katafiasz <mathrick@users.sourceforge.net>"); - - GST_DEBUG_CATEGORY_INIT (mmssrc_debug, "mmssrc", 0, "MMS Source Element"); -} +#define gst_mms_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstMMS, gst_mms, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_mms_uri_handler_init)); /* initialize the plugin's class */ static void gst_mms_class_init (GstMMSClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass; GstPushSrcClass *gstpushsrc_class = (GstPushSrcClass *) klass; @@ -117,12 +92,23 @@ gst_mms_class_init (GstMMSClass * klass) "Host URL to connect to. Accepted are mms://, mmsu://, mmst:// URL types", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /* Note: connection-speed is intentionaly limited to G_MAXINT as libmms + * uses int for it */ g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED, - g_param_spec_uint ("connection-speed", "Connection Speed", + g_param_spec_uint64 ("connection-speed", "Connection Speed", "Network connection speed in kbps (0 = unknown)", 0, G_MAXINT / 1000, DEFAULT_CONNECTION_SPEED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /* Note: connection-speed is intentionaly limited to G_MAXINT as libmms use int for it */ + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + + gst_element_class_set_details_simple (gstelement_class, + "MMS streaming source", "Source/Network", + "Receive data streamed via MSFT Multi Media Server protocol", + "Maciej Katafiasz <mathrick@users.sourceforge.net>"); + + GST_DEBUG_CATEGORY_INIT (mmssrc_debug, "mmssrc", 0, "MMS Source Element"); gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_mms_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_mms_stop); @@ -143,7 +129,7 @@ gst_mms_class_init (GstMMSClass * klass) * initialize structure */ static void -gst_mms_init (GstMMS * mmssrc, GstMMSClass * g_class) +gst_mms_init (GstMMS * mmssrc) { mmssrc->uri_name = NULL; mmssrc->current_connection_uri_name = NULL; @@ -263,7 +249,7 @@ gst_mms_prepare_seek_segment (GstBaseSrc * src, GstEvent * event, of the segment. */ gst_segment_init (segment, seek_format); - gst_segment_set_seek (segment, rate, seek_format, flags, cur_type, cur, + gst_segment_do_seek (segment, rate, seek_format, flags, cur_type, cur, stop_type, stop, NULL); return TRUE; @@ -300,7 +286,7 @@ gst_mms_do_seek (GstBaseSrc * src, GstSegment * segment) return FALSE; } gst_segment_init (segment, GST_FORMAT_BYTES); - gst_segment_set_seek (segment, segment->rate, GST_FORMAT_BYTES, + gst_segment_do_seek (segment, segment->rate, GST_FORMAT_BYTES, segment->flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_NONE, segment->stop, NULL); return TRUE; @@ -338,35 +324,30 @@ gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf) else blocksize = mmsx_get_asf_packet_len (mmssrc->connection); - *buf = gst_buffer_try_new_and_alloc (blocksize); - if (!*buf) { + data = g_try_malloc (blocksize); + if (!data) { GST_ERROR_OBJECT (mmssrc, "Failed to allocate %u bytes", blocksize); return GST_FLOW_ERROR; } - data = GST_BUFFER_DATA (*buf); - GST_BUFFER_SIZE (*buf) = 0; GST_LOG_OBJECT (mmssrc, "reading %d bytes", blocksize); result = mmsx_read (NULL, mmssrc->connection, (char *) data, blocksize); - /* EOS? */ if (result == 0) goto eos; + *buf = gst_buffer_new_wrapped (data, result); GST_BUFFER_OFFSET (*buf) = offset; - GST_BUFFER_SIZE (*buf) = result; GST_LOG_OBJECT (mmssrc, "Returning buffer with offset %" G_GINT64_FORMAT - " and size %u", GST_BUFFER_OFFSET (*buf), GST_BUFFER_SIZE (*buf)); - - gst_buffer_set_caps (*buf, GST_PAD_CAPS (GST_BASE_SRC_PAD (mmssrc))); + " and size %u", offset, result); return GST_FLOW_OK; eos: { GST_DEBUG_OBJECT (mmssrc, "EOS"); - gst_buffer_unref (*buf); + g_free (data); *buf = NULL; return GST_FLOW_UNEXPECTED; } @@ -496,11 +477,11 @@ gst_mms_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: gst_mms_uri_set_uri (GST_URI_HANDLER (mmssrc), - g_value_get_string (value)); + g_value_get_string (value), NULL); break; case PROP_CONNECTION_SPEED: GST_OBJECT_LOCK (mmssrc); - mmssrc->connection_speed = g_value_get_uint (value) * 1000; + mmssrc->connection_speed = g_value_get_uint64 (value) * 1000; GST_OBJECT_UNLOCK (mmssrc); break; default: @@ -522,7 +503,7 @@ gst_mms_get_property (GObject * object, guint prop_id, g_value_set_string (value, mmssrc->uri_name); break; case PROP_CONNECTION_SPEED: - g_value_set_uint (value, mmssrc->connection_speed / 1000); + g_value_set_uint64 (value, mmssrc->connection_speed / 1000); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -543,25 +524,26 @@ plugin_init (GstPlugin * plugin) } static GstURIType -gst_mms_uri_get_type (void) +gst_mms_uri_get_type (GType type) { return GST_URI_SRC; } -static gchar ** -gst_mms_uri_get_protocols (void) +static const gchar *const * +gst_mms_uri_get_protocols (GType type) { static const gchar *protocols[] = { "mms", "mmsh", "mmst", "mmsu", NULL }; - return (gchar **) protocols; + return protocols; } -static const gchar * +static gchar * gst_mms_uri_get_uri (GstURIHandler * handler) { GstMMS *src = GST_MMS (handler); - return src->uri_name; + /* FIXME: make thread-safe */ + return g_strdup (src->uri_name); } static gchar * @@ -613,14 +595,18 @@ gst_mms_src_make_valid_uri (const gchar * uri) } static gboolean -gst_mms_uri_set_uri (GstURIHandler * handler, const gchar * uri) +gst_mms_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) { GstMMS *src = GST_MMS (handler); gchar *fixed_uri; fixed_uri = gst_mms_src_make_valid_uri (uri); - if (!fixed_uri && uri) + if (!fixed_uri && uri) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Invalid MMS URI"); return FALSE; + } GST_OBJECT_LOCK (src); if (src->uri_name) diff --git a/ext/libmms/gstmms.h b/ext/libmms/gstmms.h index 5410cc158..bd988f11e 100644 --- a/ext/libmms/gstmms.h +++ b/ext/libmms/gstmms.h @@ -32,7 +32,7 @@ struct _GstMMS gchar *uri_name; gchar *current_connection_uri_name; - guint connection_speed; + guint64 connection_speed; mmsx_t *connection; }; diff --git a/ext/lv2/Makefile.am b/ext/lv2/Makefile.am index 7b6ac4e52..76333e79e 100644 --- a/ext/lv2/Makefile.am +++ b/ext/lv2/Makefile.am @@ -4,11 +4,11 @@ libgstlv2_la_SOURCES = gstlv2.c libgstlv2_la_CFLAGS = \ -I$(top_srcdir)/gst-libs \ $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(SLV2_CFLAGS) + $(GST_CFLAGS) $(SLV2_CFLAGS) libgstlv2_la_LIBADD = \ $(top_builddir)/gst-libs/gst/signalprocessor/libgstsignalprocessor-@GST_MAJORMINOR@.la \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ - $(GST_CONTROLLER_LIBS) $(LIBM) $(SLV2_LIBS) + $(LIBM) $(SLV2_LIBS) libgstlv2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstlv2_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/ext/lv2/gstlv2.c b/ext/lv2/gstlv2.c index f31050fc6..6a4fcb1a2 100644 --- a/ext/lv2/gstlv2.c +++ b/ext/lv2/gstlv2.c @@ -39,7 +39,6 @@ #include <math.h> #include <glib.h> #include <gst/audio/audio.h> -#include <gst/controller/gstcontroller.h> #include <gst/audio/multichannel.h> #include "gstlv2.h" @@ -894,9 +893,6 @@ plugin_init (GstPlugin * plugin) side_left_role = slv2_value_new_uri (world, NS_PG "sideLeftChannel"); side_right_role = slv2_value_new_uri (world, NS_PG "sideRightChannel"); - /* initialize gst controller library */ - gst_controller_init (NULL, NULL); - gst_plugin_add_dependency_simple (plugin, "LV2_PATH", GST_LV2_DEFAULT_PATH, NULL, GST_PLUGIN_DEPENDENCY_FLAG_NONE); diff --git a/ext/mimic/gstmimdec.c b/ext/mimic/gstmimdec.c index a712c214b..623f7496c 100644 --- a/ext/mimic/gstmimdec.c +++ b/ext/mimic/gstmimdec.c @@ -87,8 +87,10 @@ gst_mim_dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Mimic Decoder", diff --git a/ext/mimic/gstmimenc.c b/ext/mimic/gstmimenc.c index a867787a6..f4957ccb1 100644 --- a/ext/mimic/gstmimenc.c +++ b/ext/mimic/gstmimenc.c @@ -125,8 +125,10 @@ gst_mim_enc_base_init (gpointer klass) " when no data is received", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Mimic Encoder", "Codec/Encoder/Video", diff --git a/ext/modplug/gstmodplug.cc b/ext/modplug/gstmodplug.cc index 09dc5104c..75988fd75 100644 --- a/ext/modplug/gstmodplug.cc +++ b/ext/modplug/gstmodplug.cc @@ -149,10 +149,10 @@ gst_modplug_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &modplug_sink_template_factory); - gst_element_class_add_static_pad_template (element_class, - &modplug_src_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&modplug_sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&modplug_src_template_factory)); gst_element_class_set_details_simple (element_class, "ModPlug", "Codec/Decoder/Audio", "Module decoder based on modplug engine", @@ -379,6 +379,7 @@ gst_modplug_src_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (modplug, "no song loaded yet"); break; } + #if 0 timestamp = gst_util_uint64_scale_int (modplug->offset, GST_SECOND, modplug->frequency); diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc index 1987103e2..5c0b426e9 100644 --- a/ext/mpeg2enc/gstmpeg2enc.cc +++ b/ext/mpeg2enc/gstmpeg2enc.cc @@ -126,9 +126,10 @@ gst_mpeg2enc_base_init (gpointer klass) "Andrew Stevens <andrew.stevens@nexgo.de>\n" "Ronald Bultje <rbultje@ronald.bitfreak.net>"); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } static void diff --git a/ext/mplex/gstmplex.cc b/ext/mplex/gstmplex.cc index ac94e7c29..e4ad09bc8 100644 --- a/ext/mplex/gstmplex.cc +++ b/ext/mplex/gstmplex.cc @@ -67,7 +67,7 @@ static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", ); static GstStaticPadTemplate video_sink_templ = -GST_STATIC_PAD_TEMPLATE ("video_%d", +GST_STATIC_PAD_TEMPLATE ("video_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpeg, " @@ -82,7 +82,7 @@ GST_STATIC_PAD_TEMPLATE ("video_%d", "rate = (int) [ 8000, 96000 ]" static GstStaticPadTemplate audio_sink_templ = - GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_STATIC_PAD_TEMPLATE ("audio_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/mpeg, " @@ -131,11 +131,12 @@ gst_mplex_base_init (gpointer klass) "Ronald Bultje <rbultje@ronald.bitfreak.net>\n" "Mark Nauwelaerts <mnauw@users.sourceforge.net>"); - gst_element_class_add_static_pad_template (element_class, &src_templ); - gst_element_class_add_static_pad_template (element_class, - &video_sink_templ); - gst_element_class_add_static_pad_template (element_class, - &audio_sink_templ); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_templ)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_sink_templ)); } static void @@ -608,12 +609,12 @@ gst_mplex_request_new_pad (GstElement * element, GstPad *newpad; GstMplexPad *mpad; - if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { + if (templ == gst_element_class_get_pad_template (klass, "audio_%u")) { GST_DEBUG_OBJECT (mplex, "request pad audio %d", mplex->num_apads); - padname = g_strdup_printf ("audio_%d", mplex->num_apads++); - } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + padname = g_strdup_printf ("audio_%u", mplex->num_apads++); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%u")) { GST_DEBUG_OBJECT (mplex, "request pad video %d", mplex->num_vpads); - padname = g_strdup_printf ("video_%d", mplex->num_vpads++); + padname = g_strdup_printf ("video_%u", mplex->num_vpads++); } else { GST_WARNING_OBJECT (mplex, "This is not our template!"); return NULL; diff --git a/ext/musepack/gstmusepackdec.c b/ext/musepack/gstmusepackdec.c index 1d6380c75..30a34bff3 100644 --- a/ext/musepack/gstmusepackdec.c +++ b/ext/musepack/gstmusepackdec.c @@ -79,9 +79,10 @@ gst_musepackdec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "Musepack decoder", "Codec/Decoder/Audio", diff --git a/ext/musicbrainz/gsttrm.c b/ext/musicbrainz/gsttrm.c index 173c1f1a4..7e53cc078 100644 --- a/ext/musicbrainz/gsttrm.c +++ b/ext/musicbrainz/gsttrm.c @@ -112,9 +112,10 @@ gst_trm_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "MusicBrainz TRM generator", "Filter/Analyzer/Audio", diff --git a/ext/mythtv/gstmythtvsrc.c b/ext/mythtv/gstmythtvsrc.c index 71c909287..ca9865ebd 100644 --- a/ext/mythtv/gstmythtvsrc.c +++ b/ext/mythtv/gstmythtvsrc.c @@ -156,7 +156,8 @@ GST_BOILERPLATE_FULL (GstMythtvSrc, gst_mythtv_src, GstPushSrc, { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); gst_element_class_set_details_simple (element_class, "MythTV client source", "Source/Network", diff --git a/ext/nas/nassink.c b/ext/nas/nassink.c index dac158d2a..4b535951b 100644 --- a/ext/nas/nassink.c +++ b/ext/nas/nassink.c @@ -95,7 +95,8 @@ gst_nas_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "NAS audio sink", "Sink/Audio", "Plays audio to a Network Audio Server", diff --git a/ext/neon/gstneonhttpsrc.c b/ext/neon/gstneonhttpsrc.c index 20adf057c..7d46ce41e 100644 --- a/ext/neon/gstneonhttpsrc.c +++ b/ext/neon/gstneonhttpsrc.c @@ -52,10 +52,6 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", #define DEFAULT_LOCATION "http://"HTTP_DEFAULT_HOST":"G_STRINGIFY(HTTP_DEFAULT_PORT) #define DEFAULT_PROXY "" #define DEFAULT_USER_AGENT "GStreamer neonhttpsrc" -#define DEFAULT_IRADIO_MODE FALSE -#define DEFAULT_IRADIO_NAME NULL -#define DEFAULT_IRADIO_GENRE NULL -#define DEFAULT_IRADIO_URL NULL #define DEFAULT_AUTOMATIC_REDIRECT TRUE #define DEFAULT_ACCEPT_SELF_SIGNED FALSE #define DEFAULT_NEON_HTTP_DEBUG FALSE @@ -69,10 +65,6 @@ enum PROP_PROXY, PROP_USER_AGENT, PROP_COOKIES, - PROP_IRADIO_MODE, - PROP_IRADIO_NAME, - PROP_IRADIO_GENRE, - PROP_IRADIO_URL, PROP_AUTOMATIC_REDIRECT, PROP_ACCEPT_SELF_SIGNED, PROP_CONNECT_TIMEOUT, @@ -135,7 +127,8 @@ gst_neonhttp_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); gst_element_class_set_details_simple (element_class, "HTTP client source", "Source/Network", @@ -191,31 +184,6 @@ gst_neonhttp_src_class_init (GstNeonhttpSrcClass * klass) G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property - (gobject_class, PROP_IRADIO_MODE, - g_param_spec_boolean ("iradio-mode", "iradio-mode", - "Enable internet radio mode (extraction of shoutcast/icecast metadata)", - FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_IRADIO_NAME, - g_param_spec_string ("iradio-name", - "iradio-name", "Name of the stream", NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_IRADIO_GENRE, - g_param_spec_string ("iradio-genre", - "iradio-genre", "Genre of the stream", NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_IRADIO_URL, - g_param_spec_string ("iradio-url", - "iradio-url", - "Homepage URL for radio stream", NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_AUTOMATIC_REDIRECT, g_param_spec_boolean ("automatic-redirect", "automatic-redirect", "Automatically follow HTTP redirects (HTTP Status Code 3xx)", @@ -282,10 +250,9 @@ gst_neonhttp_src_init (GstNeonhttpSrc * src, GstNeonhttpSrcClass * g_class) const gchar *str; src->neon_http_debug = DEFAULT_NEON_HTTP_DEBUG; - src->iradio_mode = DEFAULT_IRADIO_MODE; - src->iradio_name = DEFAULT_IRADIO_NAME; - src->iradio_genre = DEFAULT_IRADIO_GENRE; - src->iradio_url = DEFAULT_IRADIO_URL; + src->iradio_name = NULL; + src->iradio_genre = NULL; + src->iradio_url = NULL; src->user_agent = g_strdup (DEFAULT_USER_AGENT); src->automatic_redirect = DEFAULT_AUTOMATIC_REDIRECT; src->accept_self_signed = DEFAULT_ACCEPT_SELF_SIGNED; @@ -405,9 +372,6 @@ gst_neonhttp_src_set_property (GObject * object, guint prop_id, g_strfreev (src->cookies); src->cookies = (gchar **) g_value_dup_boxed (value); break; - case PROP_IRADIO_MODE: - src->iradio_mode = g_value_get_boolean (value); - break; case PROP_AUTOMATIC_REDIRECT: src->automatic_redirect = g_value_get_boolean (value); break; @@ -476,18 +440,6 @@ gst_neonhttp_src_get_property (GObject * object, guint prop_id, case PROP_COOKIES: g_value_set_boxed (value, neonhttpsrc->cookies); break; - case PROP_IRADIO_MODE: - g_value_set_boolean (value, neonhttpsrc->iradio_mode); - break; - case PROP_IRADIO_NAME: - g_value_set_string (value, neonhttpsrc->iradio_name); - break; - case PROP_IRADIO_GENRE: - g_value_set_string (value, neonhttpsrc->iradio_genre); - break; - case PROP_IRADIO_URL: - g_value_set_string (value, neonhttpsrc->iradio_url); - break; case PROP_AUTOMATIC_REDIRECT: g_value_set_boolean (value, neonhttpsrc->automatic_redirect); break; @@ -607,7 +559,7 @@ gst_neonhttp_src_start (GstBaseSrc * bsrc) else src->content_size = -1; - if (src->iradio_mode) { + if (TRUE) { /* Icecast stuff */ const gchar *str_value; gint gint_value; @@ -625,6 +577,7 @@ gst_neonhttp_src_start (GstBaseSrc * bsrc) } } + /* FIXME: send tags with name, genre, url */ str_value = ne_get_response_header (src->request, "icy-name"); if (str_value) { if (src->iradio_name) { @@ -961,9 +914,7 @@ gst_neonhttp_src_send_request_and_redirect (GstNeonhttpSrc * src, ne_add_request_header (request, "Cookies", *c); } - if (src->iradio_mode) { - ne_add_request_header (request, "icy-metadata", "1"); - } + ne_add_request_header (request, "icy-metadata", "1"); if (offset > 0) { ne_print_request_header (request, "Range", @@ -1135,11 +1086,12 @@ gst_neonhttp_src_uri_get_type (void) return GST_URI_SRC; } -static gchar ** +static const gchar *const * gst_neonhttp_src_uri_get_protocols (void) { static const gchar *protocols[] = { "http", "https", NULL }; - return (gchar **) protocols; + + return protocols; } static const gchar * diff --git a/ext/neon/gstneonhttpsrc.h b/ext/neon/gstneonhttpsrc.h index e3207691a..4d2b1c075 100644 --- a/ext/neon/gstneonhttpsrc.h +++ b/ext/neon/gstneonhttpsrc.h @@ -59,7 +59,6 @@ struct _GstNeonhttpSrc { gboolean eos; /* icecast/audiocast metadata extraction handling */ - gboolean iradio_mode; gchar *iradio_name; gchar *iradio_genre; gchar *iradio_url; diff --git a/ext/openal/gstopenalsink.c b/ext/openal/gstopenalsink.c index a169d9e57..ece590531 100644 --- a/ext/openal/gstopenalsink.c +++ b/ext/openal/gstopenalsink.c @@ -162,14 +162,15 @@ static void gst_openal_sink_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + GstPadTemplate *pad_template; gst_element_class_set_details_simple (element_class, "Audio sink (OpenAL)", "Sink/Audio", "Output to a sound device via OpenAL", "Chris Robinson <chris.kcat@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &openalsink_sink_factory); + pad_template = gst_static_pad_template_get (&openalsink_sink_factory); + gst_element_class_add_pad_template (element_class, pad_template); } /* initialize the plugin's class */ diff --git a/ext/openal/gstopenalsrc.c b/ext/openal/gstopenalsrc.c index 18379137b..350071956 100644 --- a/ext/openal/gstopenalsrc.c +++ b/ext/openal/gstopenalsrc.c @@ -142,7 +142,9 @@ gst_openal_src_base_init (gpointer gclass) "OpenAL source capture audio from device", "Victor Lin <bornstub@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory) + ); } static void diff --git a/ext/opencv/gstcvequalizehist.c b/ext/opencv/gstcvequalizehist.c index 4d0521f57..3a086bed2 100644 --- a/ext/opencv/gstcvequalizehist.c +++ b/ext/opencv/gstcvequalizehist.c @@ -77,8 +77,10 @@ gst_cv_equalize_hist_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "cvequalizehist", diff --git a/ext/opencv/gstcvlaplace.c b/ext/opencv/gstcvlaplace.c index 39453e63b..de8649cd1 100644 --- a/ext/opencv/gstcvlaplace.c +++ b/ext/opencv/gstcvlaplace.c @@ -122,8 +122,10 @@ gst_cv_laplace_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "cvlaplace", diff --git a/ext/opencv/gstcvsobel.c b/ext/opencv/gstcvsobel.c index 1e7b63ec2..8aaeedd45 100644 --- a/ext/opencv/gstcvsobel.c +++ b/ext/opencv/gstcvsobel.c @@ -110,8 +110,10 @@ gst_cv_sobel_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "cvsobel", diff --git a/ext/opencv/gstedgedetect.c b/ext/opencv/gstedgedetect.c index 199435db6..427289981 100644 --- a/ext/opencv/gstedgedetect.c +++ b/ext/opencv/gstedgedetect.c @@ -138,8 +138,10 @@ gst_edge_detect_base_init (gpointer gclass) "Performs canny edge detection on videos and images.", "Michael Sheldon <mike@mikeasoft.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the edgedetect's class */ diff --git a/ext/opencv/gstfaceblur.c b/ext/opencv/gstfaceblur.c index 2f9dcf544..b4b6711b8 100644 --- a/ext/opencv/gstfaceblur.c +++ b/ext/opencv/gstfaceblur.c @@ -138,8 +138,10 @@ gst_face_blur_base_init (gpointer gclass) "Blurs faces in images and videos", "Michael Sheldon <mike@mikeasoft.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the faceblur's class */ diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 01126710e..7f2121626 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -220,8 +220,10 @@ gst_face_detect_base_init (gpointer gclass) "Performs face detection on videos and images, providing detected positions via bus messages", "Michael Sheldon <mike@mikeasoft.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the facedetect's class */ diff --git a/ext/opencv/gstmotioncells.c b/ext/opencv/gstmotioncells.c index 67aa3392d..d300f9d31 100644 --- a/ext/opencv/gstmotioncells.c +++ b/ext/opencv/gstmotioncells.c @@ -209,8 +209,10 @@ gst_motion_cells_base_init (gpointer gclass) "Performs motion detection on videos and images, providing detected motion cells index via bus messages", "Robert Jobbagy <jobbagy dot robert at gmail dot com>, Nicola Murino <nicola dot murino at gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the motioncells's class */ diff --git a/ext/opencv/gstopencvutils.c b/ext/opencv/gstopencvutils.c index dc42f90d5..554b38be9 100644 --- a/ext/opencv/gstopencvutils.c +++ b/ext/opencv/gstopencvutils.c @@ -96,31 +96,31 @@ gst_opencv_parse_iplimage_params_from_caps (GstCaps * caps, gint * width, GstCaps * gst_opencv_caps_from_cv_image_type (int cv_type) { - GstCaps *caps = gst_caps_new_empty (); + GstCaps *c = gst_caps_new_empty (); switch (cv_type) { case CV_8UC1: - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_GRAY8)); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY8"))); break; case CV_8UC3: - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_RGB)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_BGR)); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGB"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR"))); break; case CV_8UC4: - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_RGBx)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_xRGB)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_BGRx)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_xBGR)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_RGBA)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_ARGB)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_BGRA)); - gst_caps_append (caps, gst_caps_from_string (GST_VIDEO_CAPS_ABGR)); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGBx"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("xRGB"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("xBGR"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("RGBA"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("ARGB"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRA"))); + gst_caps_append (c, gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("ABGR"))); break; case CV_16UC1: - gst_caps_append (caps, - gst_caps_from_string (GST_VIDEO_CAPS_GRAY16 ("1234"))); - gst_caps_append (caps, - gst_caps_from_string (GST_VIDEO_CAPS_GRAY16 ("4321"))); + gst_caps_append (c, + gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY16_LE"))); + gst_caps_append (c, + gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY16_BE"))); break; } - return caps; + return c; } diff --git a/ext/opencv/gstopencvvideofilter.c b/ext/opencv/gstopencvvideofilter.c index 7c42b1956..2d6cb6d84 100644 --- a/ext/opencv/gstopencvvideofilter.c +++ b/ext/opencv/gstopencvvideofilter.c @@ -167,6 +167,7 @@ gst_opencv_video_filter_transform (GstBaseTransform * trans, { GstOpencvVideoFilter *transform; GstOpencvVideoFilterClass *fclass; + GstFlowReturn ret; transform = GST_OPENCV_VIDEO_FILTER (trans); fclass = GST_OPENCV_VIDEO_FILTER_GET_CLASS (transform); @@ -175,10 +176,18 @@ gst_opencv_video_filter_transform (GstBaseTransform * trans, g_return_val_if_fail (transform->cvImage != NULL, GST_FLOW_ERROR); g_return_val_if_fail (transform->out_cvImage != NULL, GST_FLOW_ERROR); - transform->cvImage->imageData = (char *) GST_BUFFER_DATA (inbuf); - transform->out_cvImage->imageData = (char *) GST_BUFFER_DATA (outbuf); - return fclass->cv_trans_func (transform, inbuf, transform->cvImage, outbuf, + transform->cvImage->imageData = (char *) gst_buffer_map (inbuf, + NULL, NULL, GST_MAP_READ); + transform->out_cvImage->imageData = (char *) gst_buffer_map (outbuf, + NULL, NULL, GST_MAP_WRITE); + + ret = fclass->cv_trans_func (transform, inbuf, transform->cvImage, outbuf, transform->out_cvImage); + + gst_buffer_unmap (inbuf, transform->cvImage->imageData, -1); + gst_buffer_unmap (outbuf, transform->out_cvImage->imageData, -1); + + return ret; } static GstFlowReturn @@ -187,6 +196,7 @@ gst_opencv_video_filter_transform_ip (GstBaseTransform * trans, { GstOpencvVideoFilter *transform; GstOpencvVideoFilterClass *fclass; + GstFlowReturn ret; transform = GST_OPENCV_VIDEO_FILTER (trans); fclass = GST_OPENCV_VIDEO_FILTER_GET_CLASS (transform); @@ -198,10 +208,15 @@ gst_opencv_video_filter_transform_ip (GstBaseTransform * trans, * level */ buffer = gst_buffer_make_writable (buffer); - transform->cvImage->imageData = (char *) GST_BUFFER_DATA (buffer); + transform->cvImage->imageData = (char *) gst_buffer_map (buffer, + NULL, NULL, GST_MAP_READWRITE); /* FIXME how to release buffer? */ - return fclass->cv_trans_ip_func (transform, buffer, transform->cvImage); + ret = fclass->cv_trans_ip_func (transform, buffer, transform->cvImage); + + gst_buffer_unmap (buffer, transform->cvImage->imageData, -1); + + return ret; } static gboolean diff --git a/ext/opencv/gstpyramidsegment.c b/ext/opencv/gstpyramidsegment.c index 21ea253c1..33b1eb0ba 100644 --- a/ext/opencv/gstpyramidsegment.c +++ b/ext/opencv/gstpyramidsegment.c @@ -139,8 +139,10 @@ gst_pyramid_segment_base_init (gpointer gclass) "Applies pyramid segmentation to a video or image.", "Michael Sheldon <mike@mikeasoft.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the pyramidsegment's class */ diff --git a/ext/opencv/gsttemplatematch.c b/ext/opencv/gsttemplatematch.c index 569978270..4f26121db 100644 --- a/ext/opencv/gsttemplatematch.c +++ b/ext/opencv/gsttemplatematch.c @@ -129,8 +129,10 @@ gst_template_match_base_init (gpointer gclass) "Performs template matching on videos and images, providing detected positions via bus messages.", "Noam Lewis <jones.noamle@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the templatematch's class */ diff --git a/ext/opencv/gsttextoverlay.c b/ext/opencv/gsttextoverlay.c index db28352d3..92169440f 100644 --- a/ext/opencv/gsttextoverlay.c +++ b/ext/opencv/gsttextoverlay.c @@ -156,8 +156,10 @@ gst_opencv_text_overlay_base_init (gpointer gclass) "Filter/Effect/Video", "Write text on the top of video", "sreerenj<bsreerenj@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the opencvtextoverlay's class */ diff --git a/ext/opus/gstopusdec.c b/ext/opus/gstopusdec.c index 7776f5812..67662456e 100644 --- a/ext/opus/gstopusdec.c +++ b/ext/opus/gstopusdec.c @@ -54,11 +54,10 @@ static GstStaticPadTemplate opus_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) { " GST_AUDIO_NE (S16) " }, " "rate = (int) { 48000, 24000, 16000, 12000, 8000 }, " - "channels = (int) [ 1, 8 ], " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16") + "channels = (int) [ 1, 8 ] ") ); static GstStaticPadTemplate opus_dec_sink_factory = @@ -68,6 +67,8 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_CAPS ("audio/x-opus") ); +G_DEFINE_TYPE (GstOpusDec, gst_opus_dec, GST_TYPE_AUDIO_DECODER); + #define DB_TO_LINEAR(x) pow (10., (x) / 20.) #define DEFAULT_USE_INBAND_FEC FALSE @@ -80,8 +81,6 @@ enum PROP_APPLY_GAIN }; -GST_BOILERPLATE (GstOpusDec, gst_opus_dec, GstAudioDecoder, - GST_TYPE_AUDIO_DECODER); static GstFlowReturn gst_opus_dec_parse_header (GstOpusDec * dec, GstBuffer * buf); @@ -98,28 +97,15 @@ static void gst_opus_dec_set_property (GObject * object, guint prop_id, static void -gst_opus_dec_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &opus_dec_src_factory); - gst_element_class_add_static_pad_template (element_class, - &opus_dec_sink_factory); - gst_element_class_set_details_simple (element_class, "Opus audio decoder", - "Codec/Decoder/Audio", - "decode opus streams to audio", - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -} - -static void gst_opus_dec_class_init (GstOpusDecClass * klass) { GObjectClass *gobject_class; GstAudioDecoderClass *adclass; + GstElementClass *element_class; gobject_class = (GObjectClass *) klass; adclass = (GstAudioDecoderClass *) klass; + element_class = (GstElementClass *) klass; gobject_class->set_property = gst_opus_dec_set_property; gobject_class->get_property = gst_opus_dec_get_property; @@ -129,6 +115,14 @@ gst_opus_dec_class_init (GstOpusDecClass * klass) adclass->handle_frame = GST_DEBUG_FUNCPTR (gst_opus_dec_handle_frame); adclass->set_format = GST_DEBUG_FUNCPTR (gst_opus_dec_set_format); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&opus_dec_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&opus_dec_sink_factory)); + gst_element_class_set_details_simple (element_class, "Opus audio decoder", + "Codec/Decoder/Audio", + "decode opus streams to audio", + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); g_object_class_install_property (gobject_class, PROP_USE_INBAND_FEC, g_param_spec_boolean ("use-inband-fec", "Use in-band FEC", "Use forward error correction if available", DEFAULT_USE_INBAND_FEC, @@ -162,7 +156,7 @@ gst_opus_dec_reset (GstOpusDec * dec) } static void -gst_opus_dec_init (GstOpusDec * dec, GstOpusDecClass * g_class) +gst_opus_dec_init (GstOpusDec * dec) { dec->sample_rate = 0; dec->n_channels = 0; @@ -236,11 +230,14 @@ gst_opus_dec_negotiate (GstOpusDec * dec) static GstFlowReturn gst_opus_dec_parse_header (GstOpusDec * dec, GstBuffer * buf) { - const guint8 *data = GST_BUFFER_DATA (buf); + const guint8 *data; GstCaps *caps; const GstAudioChannelPosition *pos = NULL; g_return_val_if_fail (gst_opus_header_is_id_header (buf), GST_FLOW_ERROR); + + data = gst_buffer_map (buf, NULL, NULL, GST_MAP_READ); + g_return_val_if_fail (dec->n_channels == 0 || dec->n_channels == data[9], GST_FLOW_ERROR); @@ -314,9 +311,12 @@ gst_opus_dec_parse_header (GstOpusDec * dec, GstBuffer * buf) gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), caps); gst_caps_unref (caps); + gst_buffer_unmap (buf, (guint8 *) data, -1); + return GST_FLOW_OK; } + static GstFlowReturn gst_opus_dec_parse_comments (GstOpusDec * dec, GstBuffer * buf) { @@ -327,7 +327,7 @@ static GstFlowReturn opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) { GstFlowReturn res = GST_FLOW_OK; - gint size; + gsize size, out_size; guint8 *data; GstBuffer *outbuf; gint16 *out_data; @@ -373,7 +373,7 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) if (buffer) { GST_DEBUG_OBJECT (dec, "Received buffer of size %u", - GST_BUFFER_SIZE (buffer)); + gst_buffer_get_size (buffer)); } else { GST_DEBUG_OBJECT (dec, "Received missing buffer"); } @@ -389,8 +389,8 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) buf = dec->use_inband_fec && dec->last_buffer ? dec->last_buffer : buffer; if (buf) { - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + GST_DEBUG_OBJECT (dec, "Using buffer of size %u", size); } else { /* concealment data, pass NULL as the bits parameters */ @@ -404,16 +404,12 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) samples = 120 * dec->sample_rate / 1000; packet_size = samples * dec->n_channels * 2; - res = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), - GST_BUFFER_OFFSET_NONE, packet_size, - GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)), &outbuf); - - if (res != GST_FLOW_OK) { - GST_DEBUG_OBJECT (dec, "buf alloc flow: %s", gst_flow_get_name (res)); - return res; + outbuf = gst_buffer_new_and_alloc (packet_size); + if (!outbuf) { + goto buffer_failed; } - out_data = (gint16 *) GST_BUFFER_DATA (outbuf); + out_data = (gint16 *) gst_buffer_map (outbuf, &out_size, NULL, GST_MAP_WRITE); if (dec->use_inband_fec) { if (dec->last_buffer) { @@ -429,28 +425,30 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) /* normal decode */ n = opus_multistream_decode (dec->state, data, size, out_data, samples, 0); } + gst_buffer_unmap (buf, data, size); + gst_buffer_unmap (outbuf, out_data, out_size); if (n < 0) { GST_ELEMENT_ERROR (dec, STREAM, DECODE, ("Decoding error: %d", n), (NULL)); return GST_FLOW_ERROR; } GST_DEBUG_OBJECT (dec, "decoded %d samples", n); - GST_BUFFER_SIZE (outbuf) = n * 2 * dec->n_channels; + gst_buffer_set_size (outbuf, n * 2 * dec->n_channels); /* Skip any samples that need skipping */ if (dec->pre_skip > 0) { guint scaled_pre_skip = dec->pre_skip * dec->sample_rate / 48000; guint skip = scaled_pre_skip > n ? n : scaled_pre_skip; guint scaled_skip = skip * 48000 / dec->sample_rate; - GST_BUFFER_SIZE (outbuf) -= skip * 2 * dec->n_channels; - GST_BUFFER_DATA (outbuf) += skip * 2 * dec->n_channels; + + gst_buffer_resize (outbuf, skip * 2 * dec->n_channels, -1); dec->pre_skip -= scaled_skip; GST_INFO_OBJECT (dec, "Skipping %u samples (%u at 48000 Hz, %u left to skip)", skip, scaled_skip, dec->pre_skip); } - if (GST_BUFFER_SIZE (outbuf) == 0) { + if (gst_buffer_get_size (outbuf) == 0) { gst_buffer_unref (outbuf); outbuf = NULL; } @@ -462,14 +460,19 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer) So make it optional if the user program wants to use a volume, but do it by default so the correct volume goes out by default */ if (dec->apply_gain && outbuf && dec->r128_gain) { - unsigned int i, nsamples = GST_BUFFER_SIZE (outbuf) / 2; + gsize rsize; + unsigned int i, nsamples; double volume = dec->r128_gain_volume; - gint16 *samples = (gint16 *) GST_BUFFER_DATA (outbuf); + gint16 *samples = + (gint16 *) gst_buffer_map (outbuf, &rsize, NULL, GST_MAP_READWRITE); + GST_DEBUG_OBJECT (dec, "Applying gain: volume %f", volume); + nsamples = rsize / 2; for (i = 0; i < nsamples; ++i) { int sample = (int) (samples[i] * volume + 0.5); samples[i] = sample < -32768 ? -32768 : sample > 32767 ? 32767 : sample; } + gst_buffer_unmap (outbuf, samples, rsize); } res = gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), outbuf, 1); @@ -488,6 +491,10 @@ done: creation_failed: GST_ERROR_OBJECT (dec, "Failed to create Opus decoder: %d", err); return GST_FLOW_ERROR; + +buffer_failed: + GST_ERROR_OBJECT (dec, "Failed to create %u byte buffer", packet_size); + return GST_FLOW_ERROR; } static gboolean @@ -535,14 +542,20 @@ static gboolean memcmp_buffers (GstBuffer * buf1, GstBuffer * buf2) { gsize size1, size2; + gpointer data1; + gboolean res; - size1 = GST_BUFFER_SIZE (buf1); - size2 = GST_BUFFER_SIZE (buf2); + size1 = gst_buffer_get_size (buf1); + size2 = gst_buffer_get_size (buf2); if (size1 != size2) return FALSE; - return !memcmp (GST_BUFFER_DATA (buf1), GST_BUFFER_DATA (buf2), size1); + data1 = gst_buffer_map (buf1, NULL, NULL, GST_MAP_READ); + res = gst_buffer_memcmp (buf2, 0, data1, size1) == 0; + gst_buffer_unmap (buf1, data1, size1); + + return res; } static GstFlowReturn diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c index 0ccbbebc5..999c0f39f 100644 --- a/ext/opus/gstopusenc.c +++ b/ext/opus/gstopusenc.c @@ -113,14 +113,14 @@ gst_opus_enc_frame_size_get_type (void) return id; } +#define FORMAT_STR GST_AUDIO_NE(S16) static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) { 48000, 24000, 16000, 12000, 8000 }, " - "channels = (int) [ 1, 8 ], " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " FORMAT_STR ", " + "rate = (int) { 8000, 12000, 16000, 24000, 48000 }, " + "channels = (int) [ 1, 2 ] ") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", @@ -161,7 +161,8 @@ static void gst_opus_enc_finalize (GObject * object); static gboolean gst_opus_enc_sink_event (GstAudioEncoder * benc, GstEvent * event); -static GstCaps *gst_opus_enc_sink_getcaps (GstAudioEncoder * benc); +static GstCaps *gst_opus_enc_sink_getcaps (GstAudioEncoder * benc, + GstCaps * filter); static gboolean gst_opus_enc_setup (GstOpusEnc * enc); static void gst_opus_enc_get_property (GObject * object, guint prop_id, @@ -179,52 +180,34 @@ static gint64 gst_opus_enc_get_latency (GstOpusEnc * enc); static GstFlowReturn gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buffer); -static void -gst_opus_enc_setup_interfaces (GType opusenc_type) -{ - static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; - const GInterfaceInfo preset_interface_info = { - NULL, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - g_type_add_interface_static (opusenc_type, GST_TYPE_TAG_SETTER, - &tag_setter_info); - g_type_add_interface_static (opusenc_type, GST_TYPE_PRESET, - &preset_interface_info); - - GST_DEBUG_CATEGORY_INIT (opusenc_debug, "opusenc", 0, "Opus encoder"); -} - -GST_BOILERPLATE_FULL (GstOpusEnc, gst_opus_enc, GstAudioEncoder, - GST_TYPE_AUDIO_ENCODER, gst_opus_enc_setup_interfaces); - -static void -gst_opus_enc_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_set_details_simple (element_class, "Opus audio encoder", - "Codec/Encoder/Audio", - "Encodes audio in Opus format", - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -} +#define gst_opus_enc_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstOpusEnc, gst_opus_enc, GST_TYPE_AUDIO_ENCODER, + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL); + G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, NULL)); static void gst_opus_enc_class_init (GstOpusEncClass * klass) { GObjectClass *gobject_class; GstAudioEncoderClass *base_class; + GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; base_class = (GstAudioEncoderClass *) klass; + gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_opus_enc_set_property; gobject_class->get_property = gst_opus_enc_get_property; + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_set_details_simple (gstelement_class, "Opus audio encoder", + "Codec/Encoder/Audio", + "Encodes audio in Opus format", + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); + base_class->start = GST_DEBUG_FUNCPTR (gst_opus_enc_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_opus_enc_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_opus_enc_set_format); @@ -291,6 +274,8 @@ gst_opus_enc_class_init (GstOpusEncClass * klass) GST_PARAM_MUTABLE_PLAYING)); gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_opus_enc_finalize); + + GST_DEBUG_CATEGORY_INIT (opusenc_debug, "opusenc", 0, "Opus encoder"); } static void @@ -306,7 +291,7 @@ gst_opus_enc_finalize (GObject * object) } static void -gst_opus_enc_init (GstOpusEnc * enc, GstOpusEncClass * klass) +gst_opus_enc_init (GstOpusEnc * enc) { GstAudioEncoder *benc = GST_AUDIO_ENCODER (enc); @@ -340,7 +325,7 @@ gst_opus_enc_start (GstAudioEncoder * benc) GstOpusEnc *enc = GST_OPUS_ENC (benc); GST_DEBUG_OBJECT (enc, "start"); - enc->tags = gst_tag_list_new (); + enc->tags = gst_tag_list_new_empty (); enc->header_sent = FALSE; return TRUE; @@ -716,6 +701,7 @@ gst_opus_enc_sink_event (GstAudioEncoder * benc, GstEvent * event) gst_tag_setter_merge_tags (setter, list, mode); break; } + default: break; } @@ -724,7 +710,7 @@ gst_opus_enc_sink_event (GstAudioEncoder * benc, GstEvent * event) } static GstCaps * -gst_opus_enc_sink_getcaps (GstAudioEncoder * benc) +gst_opus_enc_sink_getcaps (GstAudioEncoder * benc, GstCaps * filter) { GstOpusEnc *enc; GstCaps *caps; @@ -737,7 +723,7 @@ gst_opus_enc_sink_getcaps (GstAudioEncoder * benc) GST_DEBUG_OBJECT (enc, "sink getcaps"); - peercaps = gst_pad_peer_get_caps (GST_AUDIO_ENCODER_SRC_PAD (benc)); + peercaps = gst_pad_peer_query_caps (GST_AUDIO_ENCODER_SRC_PAD (benc), filter); if (!peercaps) { GST_DEBUG_OBJECT (benc, "No peercaps, returning template sink caps"); return @@ -781,6 +767,13 @@ gst_opus_enc_sink_getcaps (GstAudioEncoder * benc) g_value_unset (&range); } + if (filter) { + GstCaps *tmp = gst_caps_intersect_full (caps, filter, + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = tmp; + } + GST_DEBUG_OBJECT (enc, "Returning caps: %" GST_PTR_FORMAT, caps); return caps; } @@ -788,23 +781,23 @@ gst_opus_enc_sink_getcaps (GstAudioEncoder * benc) static GstFlowReturn gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf) { - guint8 *bdata, *data, *mdata = NULL; + guint8 *bdata = NULL, *data, *mdata = NULL; gsize bsize, size; - gsize bytes; + gsize bytes = enc->frame_samples * enc->n_channels * 2; gint ret = GST_FLOW_OK; g_mutex_lock (enc->property_lock); - bytes = enc->frame_samples * enc->n_channels * 2; if (G_LIKELY (buf)) { - bdata = GST_BUFFER_DATA (buf); - bsize = GST_BUFFER_SIZE (buf); + bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ); + if (G_UNLIKELY (bsize % bytes)) { GST_DEBUG_OBJECT (enc, "draining; adding silence samples"); size = ((bsize / bytes) + 1) * bytes; mdata = g_malloc0 (size); memcpy (mdata, bdata, bsize); + gst_buffer_unmap (buf, bdata, bsize); bdata = NULL; data = mdata; } else { @@ -816,40 +809,39 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf) goto done; } - while (size) { - gint outsize; + gint encoded_size; + unsigned char *out_data; + gsize out_size; GstBuffer *outbuf; - ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), - GST_BUFFER_OFFSET_NONE, enc->max_payload_size * enc->n_channels, - GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf); - - if (GST_FLOW_OK != ret) + outbuf = gst_buffer_new_and_alloc (enc->max_payload_size * enc->n_channels); + if (!outbuf) goto done; GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", enc->frame_samples, (int) bytes); - outsize = + out_data = gst_buffer_map (outbuf, &out_size, NULL, GST_MAP_WRITE); + encoded_size = opus_multistream_encode (enc->state, (const gint16 *) data, - enc->frame_samples, GST_BUFFER_DATA (outbuf), - enc->max_payload_size * enc->n_channels); + enc->frame_samples, out_data, enc->max_payload_size * enc->n_channels); + gst_buffer_unmap (outbuf, out_data, out_size); - if (outsize < 0) { - GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize); + if (encoded_size < 0) { + GST_ERROR_OBJECT (enc, "Encoding failed: %d", encoded_size); ret = GST_FLOW_ERROR; goto done; - } else if (outsize > enc->max_payload_size) { + } else if (encoded_size > enc->max_payload_size) { GST_WARNING_OBJECT (enc, "Encoded size %d is higher than max payload size (%d bytes)", - outsize, enc->max_payload_size); + out_size, enc->max_payload_size); ret = GST_FLOW_ERROR; goto done; } - GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize); - GST_BUFFER_SIZE (outbuf) = outsize; + GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", encoded_size); + gst_buffer_set_size (outbuf, encoded_size); ret = gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf, @@ -864,6 +856,8 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf) done: + if (bdata) + gst_buffer_unmap (buf, bdata, bsize); g_mutex_unlock (enc->property_lock); if (mdata) @@ -902,7 +896,7 @@ gst_opus_enc_handle_frame (GstAudioEncoder * benc, GstBuffer * buf) } GST_DEBUG_OBJECT (enc, "received buffer %p of %u bytes", buf, - buf ? GST_BUFFER_SIZE (buf) : 0); + buf ? gst_buffer_get_size (buf) : 0); ret = gst_opus_enc_encode (enc, buf); diff --git a/ext/opus/gstopusheader.c b/ext/opus/gstopusheader.c index d3d631fe7..68826a56b 100644 --- a/ext/opus/gstopusheader.c +++ b/ext/opus/gstopusheader.c @@ -73,7 +73,7 @@ gst_opus_enc_create_metadata_buffer (const GstTagList * tags) if (tags == NULL) { /* FIXME: better fix chain of callers to not write metadata at all, * if there is none */ - empty_tags = gst_tag_list_new (); + empty_tags = gst_tag_list_new_empty (); tags = empty_tags; } comments = @@ -152,21 +152,32 @@ gst_opus_header_create_caps_from_headers (GstCaps ** caps, GSList ** headers, { int n_streams, family; gboolean multistream; + guint8 *data; + gsize size; g_return_if_fail (caps); g_return_if_fail (headers && !*headers); - g_return_if_fail (GST_BUFFER_SIZE (buf1) >= 19); + g_return_if_fail (gst_buffer_get_size (buf1) >= 19); + + data = gst_buffer_map (buf1, &size, NULL, GST_MAP_READ); /* work out the number of streams */ - family = GST_BUFFER_DATA (buf1)[18]; + family = data[18]; if (family == 0) { n_streams = 1; } else { /* only included in the header for family > 0 */ - g_return_if_fail (GST_BUFFER_SIZE (buf1) >= 20); - n_streams = GST_BUFFER_DATA (buf1)[19]; + if (size >= 20) + n_streams = data[19]; + else { + g_warning ("family > 0 but header buffer size < 20"); + gst_buffer_unmap (buf1, data, size); + return; + } } + gst_buffer_unmap (buf1, data, size); + /* mark and put on caps */ multistream = n_streams > 1; *caps = gst_caps_new_simple ("audio/x-opus", @@ -206,42 +217,54 @@ gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers, gint nchannels, gboolean gst_opus_header_is_header (GstBuffer * buf, const char *magic, guint magic_size) { - return (GST_BUFFER_SIZE (buf) >= magic_size - && !memcmp (magic, GST_BUFFER_DATA (buf), magic_size)); + return (gst_buffer_get_size (buf) >= magic_size + && !gst_buffer_memcmp (buf, 0, magic, magic_size)); } gboolean gst_opus_header_is_id_header (GstBuffer * buf) { - gsize size = GST_BUFFER_SIZE (buf); - const guint8 *data = GST_BUFFER_DATA (buf); + gsize size = gst_buffer_get_size (buf); + guint8 *data = NULL; guint8 channels, channel_mapping_family, n_streams, n_stereo_streams; + gboolean ret = FALSE; if (size < 19) - return FALSE; + goto beach; if (!gst_opus_header_is_header (buf, "OpusHead", 8)) - return FALSE; + goto beach; + + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + channels = data[9]; + if (channels == 0) - return FALSE; + goto beach; + channel_mapping_family = data[18]; + if (channel_mapping_family == 0) { if (channels > 2) - return FALSE; + goto beach; } else { channels = data[9]; if (size < 21 + channels) - return FALSE; + goto beach; n_streams = data[19]; n_stereo_streams = data[20]; if (n_streams == 0) - return FALSE; + goto beach; if (n_stereo_streams > n_streams) - return FALSE; + goto beach; if (n_streams + n_stereo_streams > 255) - return FALSE; + goto beach; } - return TRUE; + ret = TRUE; + +beach: + if (data) + gst_buffer_unmap (buf, data, size); + return ret; } gboolean diff --git a/ext/opus/gstopusparse.c b/ext/opus/gstopusparse.c index f3706cb72..05963ca79 100644 --- a/ext/opus/gstopusparse.c +++ b/ext/opus/gstopusparse.c @@ -108,6 +108,11 @@ static gboolean gst_opus_parse_start (GstBaseParse * base) { GstOpusParse *parse = GST_OPUS_PARSE (base); + GstCaps *caps; + + caps = gst_caps_new_empty_simple ("audio/x-opus"); + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (parse)), caps); + gst_caps_unref (caps); parse->header_sent = FALSE; parse->next_ts = 0; @@ -147,8 +152,7 @@ gst_opus_parse_check_valid_frame (GstBaseParse * base, parse = GST_OPUS_PARSE (base); - data = GST_BUFFER_DATA (frame->buffer); - size = GST_BUFFER_SIZE (frame->buffer); + data = gst_buffer_map (frame->buffer, &size, NULL, GST_MAP_READ); GST_DEBUG_OBJECT (parse, "Checking for frame, %u bytes in buffer", size); /* check for headers */ @@ -206,6 +210,7 @@ gst_opus_parse_check_valid_frame (GstBaseParse * base, ret = TRUE; beach: + gst_buffer_unmap (frame->buffer, data, size); return ret; } @@ -271,6 +276,8 @@ gst_opus_parse_parse_frame (GstBaseParse * base, GstBaseParseFrame * frame) guint64 duration; GstOpusParse *parse; gboolean is_idheader, is_commentheader; + guint8 *data; + gsize size; parse = GST_OPUS_PARSE (base); @@ -320,9 +327,9 @@ gst_opus_parse_parse_frame (GstBaseParse * base, GstBaseParseFrame * frame) GST_BUFFER_TIMESTAMP (frame->buffer) = parse->next_ts; - duration = - packet_duration_opus (GST_BUFFER_DATA (frame->buffer), - GST_BUFFER_SIZE (frame->buffer)); + data = gst_buffer_map (frame->buffer, &size, NULL, GST_MAP_READ); + duration = packet_duration_opus (data, size); + gst_buffer_unmap (frame->buffer, data, size); parse->next_ts += duration; GST_BUFFER_DURATION (frame->buffer) = duration; diff --git a/ext/opus/gstrtpopusdepay.c b/ext/opus/gstrtpopusdepay.c index 0f1869ed5..f8effbb6c 100644 --- a/ext/opus/gstrtpopusdepay.c +++ b/ext/opus/gstrtpopusdepay.c @@ -31,8 +31,6 @@ GST_DEBUG_CATEGORY_STATIC (rtpopusdepay_debug); #define GST_CAT_DEFAULT (rtpopusdepay_debug) - - static GstStaticPadTemplate gst_rtp_opus_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -51,18 +49,22 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("audio/x-opus") ); -static GstBuffer *gst_rtp_opus_depay_process (GstBaseRTPDepayload * depayload, +static GstBuffer *gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf); -static gboolean gst_rtp_opus_depay_setcaps (GstBaseRTPDepayload * depayload, +static gboolean gst_rtp_opus_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps); -GST_BOILERPLATE (GstRTPOpusDepay, gst_rtp_opus_depay, GstBaseRTPDepayload, - GST_TYPE_BASE_RTP_DEPAYLOAD); +G_DEFINE_TYPE (GstRTPOpusDepay, gst_rtp_opus_depay, + GST_TYPE_RTP_BASE_DEPAYLOAD); static void -gst_rtp_opus_depay_base_init (gpointer klass) +gst_rtp_opus_depay_class_init (GstRTPOpusDepayClass * klass) { - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstRTPBaseDepayloadClass *gstbasertpdepayload_class; + GstElementClass *element_class; + + element_class = GST_ELEMENT_CLASS (klass); + gstbasertpdepayload_class = (GstRTPBaseDepayloadClass *) klass; gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_opus_depay_src_template)); @@ -72,14 +74,6 @@ gst_rtp_opus_depay_base_init (gpointer klass) "RTP Opus packet depayloader", "Codec/Depayloader/Network/RTP", "Extracts Opus audio from RTP packets", "Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>"); -} - -static void -gst_rtp_opus_depay_class_init (GstRTPOpusDepayClass * klass) -{ - GstBaseRTPDepayloadClass *gstbasertpdepayload_class; - - gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_opus_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_opus_depay_setcaps; @@ -89,20 +83,19 @@ gst_rtp_opus_depay_class_init (GstRTPOpusDepayClass * klass) } static void -gst_rtp_opus_depay_init (GstRTPOpusDepay * rtpopusdepay, - GstRTPOpusDepayClass * klass) +gst_rtp_opus_depay_init (GstRTPOpusDepay * rtpopusdepay) { } static gboolean -gst_rtp_opus_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) +gst_rtp_opus_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; gboolean ret; - srccaps = gst_caps_new_simple ("audio/x-opus", NULL); - ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + srccaps = gst_caps_new_empty_simple ("audio/x-opus"); + ret = gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG_OBJECT (depayload, "set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); @@ -114,10 +107,14 @@ gst_rtp_opus_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) } static GstBuffer * -gst_rtp_opus_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) +gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf; - outbuf = gst_rtp_buffer_get_payload_buffer (buf); + GstRTPBuffer rtpbuf = { NULL, }; + + gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf); + outbuf = gst_rtp_buffer_get_payload_buffer (&rtpbuf); + gst_rtp_buffer_unmap (&rtpbuf); return outbuf; } diff --git a/ext/opus/gstrtpopusdepay.h b/ext/opus/gstrtpopusdepay.h index ba217e0e8..968ae52ae 100644 --- a/ext/opus/gstrtpopusdepay.h +++ b/ext/opus/gstrtpopusdepay.h @@ -23,7 +23,7 @@ #define __GST_RTP_OPUS_DEPAY_H__ #include <gst/gst.h> -#include <gst/rtp/gstbasertpdepayload.h> +#include <gst/rtp/gstrtpbasedepayload.h> G_BEGIN_DECLS typedef struct _GstRTPOpusDepay GstRTPOpusDepay; typedef struct _GstRTPOpusDepayClass GstRTPOpusDepayClass; @@ -42,13 +42,13 @@ typedef struct _GstRTPOpusDepayClass GstRTPOpusDepayClass; struct _GstRTPOpusDepay { - GstBaseRTPDepayload depayload; + GstRTPBaseDepayload depayload; }; struct _GstRTPOpusDepayClass { - GstBaseRTPDepayloadClass parent_class; + GstRTPBaseDepayloadClass parent_class; }; GType gst_rtp_opus_depay_get_type (void); diff --git a/ext/opus/gstrtpopuspay.c b/ext/opus/gstrtpopuspay.c index cdd7ee00c..5003c739f 100644 --- a/ext/opus/gstrtpopuspay.c +++ b/ext/opus/gstrtpopuspay.c @@ -51,18 +51,24 @@ GST_STATIC_PAD_TEMPLATE ("src", "encoding-name = (string) \"X-GST-OPUS-DRAFT-SPITTKA-00\"") ); -static gboolean gst_rtp_opus_pay_setcaps (GstBaseRTPPayload * payload, +static gboolean gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps); -static GstFlowReturn gst_rtp_opus_pay_handle_buffer (GstBaseRTPPayload * +static GstFlowReturn gst_rtp_opus_pay_handle_buffer (GstRTPBasePayload * payload, GstBuffer * buffer); -GST_BOILERPLATE (GstRtpOPUSPay, gst_rtp_opus_pay, GstBaseRTPPayload, - GST_TYPE_BASE_RTP_PAYLOAD); +G_DEFINE_TYPE (GstRtpOPUSPay, gst_rtp_opus_pay, GST_TYPE_RTP_BASE_PAYLOAD); static void -gst_rtp_opus_pay_base_init (gpointer klass) +gst_rtp_opus_pay_class_init (GstRtpOPUSPayClass * klass) { - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstRTPBasePayloadClass *gstbasertppayload_class; + GstElementClass *element_class; + + gstbasertppayload_class = (GstRTPBasePayloadClass *) klass; + element_class = GST_ELEMENT_CLASS (klass); + + gstbasertppayload_class->set_caps = gst_rtp_opus_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_opus_pay_handle_buffer; gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_opus_pay_src_template)); @@ -74,39 +80,28 @@ gst_rtp_opus_pay_base_init (gpointer klass) "Codec/Payloader/Network/RTP", "Puts Opus audio in RTP packets", "Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>"); -} - -static void -gst_rtp_opus_pay_class_init (GstRtpOPUSPayClass * klass) -{ - GstBaseRTPPayloadClass *gstbasertppayload_class; - - gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; - - gstbasertppayload_class->set_caps = gst_rtp_opus_pay_setcaps; - gstbasertppayload_class->handle_buffer = gst_rtp_opus_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpopuspay_debug, "rtpopuspay", 0, "Opus RTP Payloader"); } static void -gst_rtp_opus_pay_init (GstRtpOPUSPay * rtpopuspay, GstRtpOPUSPayClass * klass) +gst_rtp_opus_pay_init (GstRtpOPUSPay * rtpopuspay) { } static gboolean -gst_rtp_opus_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) +gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) { gboolean res; gchar *capsstr; capsstr = gst_caps_to_string (caps); - gst_basertppayload_set_options (payload, "audio", FALSE, + gst_rtp_base_payload_set_options (payload, "audio", FALSE, "X-GST-OPUS-DRAFT-SPITTKA-00", 48000); res = - gst_basertppayload_set_outcaps (payload, "caps", G_TYPE_STRING, capsstr, + gst_rtp_base_payload_set_outcaps (payload, "caps", G_TYPE_STRING, capsstr, NULL); g_free (capsstr); @@ -114,27 +109,29 @@ gst_rtp_opus_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) } static GstFlowReturn -gst_rtp_opus_pay_handle_buffer (GstBaseRTPPayload * basepayload, +gst_rtp_opus_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { + GstRTPBuffer rtpbuf = { NULL, }; GstBuffer *outbuf; - GstClockTime timestamp; - - guint size; - guint8 *data; - guint8 *payload; - - size = GST_BUFFER_SIZE (buffer); - data = GST_BUFFER_DATA (buffer); - timestamp = GST_BUFFER_TIMESTAMP (buffer); - - outbuf = gst_rtp_buffer_new_allocate (size, 0, 0); - payload = gst_rtp_buffer_get_payload (outbuf); - - memcpy (payload, data, size); - - gst_rtp_buffer_set_marker (outbuf, FALSE); - GST_BUFFER_TIMESTAMP (outbuf) = timestamp; - - return gst_basertppayload_push (basepayload, outbuf); + gsize size; + gpointer *data; + + /* Copy data and timestamp to a new output buffer + * FIXME : Don't we have a convenience function for this ? */ + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + outbuf = gst_rtp_buffer_new_copy_data (data, size); + GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); + + /* Unmap and free input buffer */ + gst_buffer_unmap (buffer, data, size); + gst_buffer_unref (buffer); + + /* Remove marker from RTP buffer */ + gst_rtp_buffer_map (outbuf, GST_MAP_WRITE, &rtpbuf); + gst_rtp_buffer_set_marker (&rtpbuf, FALSE); + gst_rtp_buffer_unmap (&rtpbuf); + + /* Push out */ + return gst_rtp_base_payload_push (basepayload, outbuf); } diff --git a/ext/opus/gstrtpopuspay.h b/ext/opus/gstrtpopuspay.h index 23abd0dab..81160fe2a 100644 --- a/ext/opus/gstrtpopuspay.h +++ b/ext/opus/gstrtpopuspay.h @@ -23,7 +23,7 @@ #define __GST_RTP_OPUS_PAY_H__ #include <gst/gst.h> -#include <gst/rtp/gstbasertppayload.h> +#include <gst/rtp/gstrtpbasepayload.h> G_BEGIN_DECLS @@ -43,12 +43,12 @@ typedef struct _GstRtpOPUSPayClass GstRtpOPUSPayClass; struct _GstRtpOPUSPay { - GstBaseRTPPayload payload; + GstRTPBasePayload payload; }; struct _GstRtpOPUSPayClass { - GstBaseRTPPayloadClass parent_class; + GstRTPBasePayloadClass parent_class; }; GType gst_rtp_opus_pay_get_type (void); diff --git a/ext/resindvd/resindvdbin.c b/ext/resindvd/resindvdbin.c index cbede40eb..5885b238a 100644 --- a/ext/resindvd/resindvdbin.c +++ b/ext/resindvd/resindvdbin.c @@ -101,12 +101,12 @@ rsn_dvdbin_base_init (gpointer gclass) GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, - &video_src_template); - gst_element_class_add_static_pad_template (element_class, - &audio_src_template); - gst_element_class_add_static_pad_template (element_class, - &subpicture_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&subpicture_src_template)); gst_element_class_set_details_simple (element_class, "rsndvdbin", "Generic/Bin/Player", "DVD playback element", "Jan Schmidt <thaytan@noraisin.net>"); @@ -170,10 +170,10 @@ rsn_dvdbin_uri_get_type (void) return GST_URI_SRC; } -static gchar ** +static const gchar *const * rsn_dvdbin_uri_get_protocols (void) { - static gchar *protocols[] = { (char *) "dvd", NULL }; + static const gchar *protocols[] = { "dvd", NULL }; return protocols; } @@ -625,7 +625,7 @@ connect_thru_mq (RsnDvdBin * dvdbin, GstPad * pad) /* Request a pad from multiqueue, then connect this one, then * discover the corresponding output pad and return it */ mq_sink = gst_element_get_request_pad (dvdbin->pieces[DVD_ELEM_MQUEUE], - "sink%d"); + "sink_%u"); if (mq_sink == NULL) return FALSE; dvdbin->mq_req_pads = g_list_prepend (dvdbin->mq_req_pads, mq_sink); @@ -635,7 +635,7 @@ connect_thru_mq (RsnDvdBin * dvdbin, GstPad * pad) sinkname = gst_pad_get_name (mq_sink); tmp = sinkname + 4; - srcname = g_strdup_printf ("src%s", tmp); + srcname = g_strdup_printf ("src_%s", tmp); mq_src = gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_MQUEUE], srcname); @@ -699,13 +699,13 @@ demux_pad_added (GstElement * element, GstPad * pad, RsnDvdBin * dvdbin) } else if (g_str_equal (gst_structure_get_name (s), "video/x-dvd-subpicture")) { dest_pad = gst_element_get_request_pad (dvdbin->pieces[DVD_ELEM_SPU_SELECT], - "sink%d"); + "sink_%u"); skip_mq = TRUE; } else if (can_sink_caps (dvdbin->pieces[DVD_ELEM_AUDDEC], caps)) { GST_LOG_OBJECT (dvdbin, "Found audio pad w/ caps %" GST_PTR_FORMAT, caps); dest_pad = gst_element_get_request_pad (dvdbin->pieces[DVD_ELEM_AUD_SELECT], - "sink%d"); + "sink_%u"); } else { GstStructure *s; diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c index 499b44fdd..a0059fdaa 100644 --- a/ext/resindvd/resindvdsrc.c +++ b/ext/resindvd/resindvdsrc.c @@ -193,7 +193,8 @@ rsn_dvdsrc_base_init (gpointer gclass) GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); gst_element_class_set_details_simple (element_class, "Resin DVD Src", "Source/DVD", "DVD source element", "Jan Schmidt <thaytan@noraisin.net>"); } @@ -2399,7 +2400,7 @@ rsn_dvdsrc_src_event (GstBaseSrc * basesrc, GstEvent * event) GST_LOG_OBJECT (src, "handling seek event"); gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL); - src->flushing_seek = !!(flags & GST_SEEK_FLAG_FLUSH); + src->flushing_seek = ! !(flags & GST_SEEK_FLAG_FLUSH); GST_DEBUG_OBJECT (src, "%s seek event", src->flushing_seek ? "flushing" : "non-flushing"); diff --git a/ext/resindvd/rsnaudiomunge.c b/ext/resindvd/rsnaudiomunge.c index 94cf7b150..5e6f9cc6f 100644 --- a/ext/resindvd/rsnaudiomunge.c +++ b/ext/resindvd/rsnaudiomunge.c @@ -84,9 +84,10 @@ rsn_audiomunge_class_init (RsnAudioMungeClass * klass) GST_DEBUG_CATEGORY_INIT (rsn_audiomunge_debug, "rsnaudiomunge", 0, "ResinDVD audio stream regulator"); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "RsnAudioMunge", "Audio/Filter", diff --git a/ext/resindvd/rsndec.c b/ext/resindvd/rsndec.c index 8d7e3806c..3abc0065c 100644 --- a/ext/resindvd/rsndec.c +++ b/ext/resindvd/rsndec.c @@ -380,10 +380,10 @@ rsn_audiodec_class_init (RsnAudioDecClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); RsnDecClass *dec_class = RSN_DEC_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &audio_src_template); - gst_element_class_add_static_pad_template (element_class, - &audio_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_sink_template)); gst_element_class_set_details_simple (element_class, "RsnAudioDec", "Audio/Decoder", @@ -430,10 +430,10 @@ rsn_videodec_class_init (RsnAudioDecClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); RsnDecClass *dec_class = RSN_DEC_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &video_src_template); - gst_element_class_add_static_pad_template (element_class, - &video_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_template)); gst_element_class_set_details_simple (element_class, "RsnVideoDec", "Video/Decoder", diff --git a/ext/resindvd/rsnparsetter.c b/ext/resindvd/rsnparsetter.c index baaea2b44..a69366f9d 100644 --- a/ext/resindvd/rsnparsetter.c +++ b/ext/resindvd/rsnparsetter.c @@ -59,8 +59,10 @@ rsn_parsetter_base_init (gpointer gclass) GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Resin Aspect Ratio Setter", "Filter/Video", "Overrides caps on video buffers to force a particular display ratio", @@ -119,13 +121,16 @@ static GstFlowReturn rsn_parsetter_chain (GstPad * pad, GstBuffer * buf) { RsnParSetter *parset = RSN_PARSETTER (GST_OBJECT_PARENT (pad)); + RsnMetaWrapped *meta; + + meta = RSN_META_WRAPPED_GET (buf); /* If this is a buffer we wrapped up earlier, unwrap it now */ - if (RSN_IS_WRAPPEDBUFFER (buf)) { - RsnWrappedBuffer *wrap_buf = RSN_WRAPPEDBUFFER (buf); + if (meta != NULL) { + GstBuffer *wrap_buf = buf; - if (wrap_buf->owner == GST_ELEMENT (parset)) { - buf = rsn_wrappedbuffer_unwrap_and_unref (wrap_buf); + if (meta->owner == GST_ELEMENT (parset)) { + buf = rsn_meta_wrapped_unwrap_and_unref (wrap_buf, meta); GST_DEBUG_OBJECT (parset, "Unwrapping %p yields buffer %p with caps %" GST_PTR_FORMAT, wrap_buf, buf, GST_BUFFER_CAPS (buf)); } @@ -374,15 +379,12 @@ rsn_parsetter_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, if (ret != GST_FLOW_OK) return ret; - outbuf = (GstBuffer *) rsn_wrapped_buffer_new (orig_buf); + outbuf = rsn_wrapped_buffer_new (orig_buf, GST_ELEMENT_CAST (parset)); if (!outbuf) { /* FIXME: Throw error */ return GST_FLOW_ERROR; } - rsn_wrapped_buffer_set_owner (RSN_WRAPPEDBUFFER (outbuf), - GST_ELEMENT (parset)); - gst_buffer_set_caps (outbuf, caps); GST_LOG_OBJECT (parset, diff --git a/ext/resindvd/rsnstreamselector.c b/ext/resindvd/rsnstreamselector.c index 33fa00310..9b30ea0f6 100644 --- a/ext/resindvd/rsnstreamselector.c +++ b/ext/resindvd/rsnstreamselector.c @@ -33,7 +33,7 @@ GST_DEBUG_CATEGORY_STATIC (stream_selector_debug); #define GST_CAT_DEFAULT stream_selector_debug static GstStaticPadTemplate rsn_stream_selector_sink_factory = -GST_STATIC_PAD_TEMPLATE ("sink%d", +GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); @@ -481,10 +481,10 @@ rsn_stream_selector_base_init (RsnStreamSelectorClass * klass) "Ronald S. Bultje <rbultje@ronald.bitfreak.net>, " "Jan Schmidt <thaytan@mad.scientist.com>, " "Wim Taymans <wim.taymans@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &rsn_stream_selector_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &rsn_stream_selector_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&rsn_stream_selector_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&rsn_stream_selector_src_factory)); } static void @@ -724,7 +724,7 @@ rsn_stream_selector_request_new_pad (GstElement * element, g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL); GST_LOG_OBJECT (sel, "Creating new pad %d", sel->padcount); GST_OBJECT_LOCK (sel); - name = g_strdup_printf ("sink%d", sel->padcount++); + name = g_strdup_printf ("sink_%u", sel->padcount++); sinkpad = g_object_new (RSN_TYPE_SELECTOR_PAD, "name", name, "direction", templ->direction, "template", templ, NULL); g_free (name); diff --git a/ext/resindvd/rsnwrappedbuffer.c b/ext/resindvd/rsnwrappedbuffer.c index 516cf352c..a5f4c0fd3 100644 --- a/ext/resindvd/rsnwrappedbuffer.c +++ b/ext/resindvd/rsnwrappedbuffer.c @@ -26,53 +26,19 @@ #include "rsnwrappedbuffer.h" -G_DEFINE_TYPE (RsnWrappedBuffer, rsn_wrappedbuffer, GST_TYPE_BUFFER); - -static gboolean -rsn_wrapped_buffer_default_release (GstElement * owner, RsnWrappedBuffer * buf); - -static void rsn_wrapped_buffer_finalize (RsnWrappedBuffer * wrap_buf); - -static void -rsn_wrappedbuffer_class_init (RsnWrappedBufferClass * klass) -{ - GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (klass); - - mini_object_class->finalize = (GstMiniObjectFinalizeFunction) - rsn_wrapped_buffer_finalize; -} - -static void -rsn_wrappedbuffer_init (RsnWrappedBuffer * self) -{ - self->release = rsn_wrapped_buffer_default_release; -} - -static void -rsn_wrapped_buffer_finalize (RsnWrappedBuffer * wrap_buf) +GstBuffer * +rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap, GstElement * owner) { - if (wrap_buf->release) { - /* Release might increment the refcount to recycle and return TRUE, - * in which case, exit without chaining up */ - if (wrap_buf->release (wrap_buf->owner, wrap_buf)) - return; - } - - GST_MINI_OBJECT_CLASS (rsn_wrappedbuffer_parent_class)->finalize - (GST_MINI_OBJECT (wrap_buf)); -} + GstBuffer *buf; + RsnMetaWrapped *meta; -RsnWrappedBuffer * -rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap) -{ - RsnWrappedBuffer *buf; g_return_val_if_fail (buf_to_wrap, NULL); - buf = (RsnWrappedBuffer *) gst_mini_object_new (RSN_TYPE_WRAPPEDBUFFER); - if (buf == NULL) - return NULL; + buf = gst_buffer_new (); + meta = RSN_META_WRAPPED_ADD (buf); - buf->wrapped_buffer = buf_to_wrap; + meta->wrapped_buffer = buf_to_wrap; + meta->owner = gst_object_ref (owner); GST_BUFFER_DATA (buf) = GST_BUFFER_DATA (buf_to_wrap); GST_BUFFER_SIZE (buf) = GST_BUFFER_SIZE (buf_to_wrap); @@ -86,52 +52,29 @@ rsn_wrapped_buffer_new (GstBuffer * buf_to_wrap) } void -rsn_wrapped_buffer_set_owner (RsnWrappedBuffer * wrapped_buf, - GstElement * owner) +rsn_meta_wrapped_set_owner (RsnMetaWrapped * meta, GstElement * owner) { - g_return_if_fail (wrapped_buf != NULL); + g_return_if_fail (meta != NULL); - if (wrapped_buf->owner) - gst_object_unref (wrapped_buf->owner); + if (meta->owner) + gst_object_unref (meta->owner); if (owner) - wrapped_buf->owner = gst_object_ref (owner); - else - wrapped_buf->owner = NULL; -} + gst_object_ref (owner); -void -rsn_wrapped_buffer_set_releasefunc (RsnWrappedBuffer * wrapped_buf, - RsnWrappedBufferReleaseFunc release_func) -{ - g_return_if_fail (wrapped_buf != NULL); - - wrapped_buf->release = release_func; -} - -static gboolean -rsn_wrapped_buffer_default_release (GstElement * owner, RsnWrappedBuffer * buf) -{ - g_return_val_if_fail (buf != NULL, FALSE); - g_return_val_if_fail (buf->wrapped_buffer != NULL, FALSE); - - gst_buffer_unref (buf->wrapped_buffer); - if (buf->owner) - gst_object_unref (buf->owner); - - return FALSE; + meta->owner = owner; } GstBuffer * -rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer * wrap_buf) +rsn_meta_wrapped_unwrap_and_unref (GstBuffer * wrap_buf, RsnMetaWrapped * meta) { GstBuffer *buf; gboolean is_readonly; g_return_val_if_fail (wrap_buf != NULL, NULL); - g_return_val_if_fail (wrap_buf->wrapped_buffer != NULL, NULL); + g_return_val_if_fail (meta->wrapped_buffer != NULL, NULL); - buf = gst_buffer_ref (wrap_buf->wrapped_buffer); + buf = gst_buffer_ref (meta->wrapped_buffer); buf = gst_buffer_make_metadata_writable (buf); /* Copy changed metadata back to the wrapped buffer from the wrapper, @@ -142,7 +85,37 @@ rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer * wrap_buf) if (!is_readonly) GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_READONLY); - gst_buffer_unref (GST_BUFFER (wrap_buf)); + gst_buffer_unref (wrap_buf); return buf; } + +static void +rsn_meta_wrapped_init (RsnMetaWrapped * meta, GstBuffer * buffer) +{ + meta->owner = NULL; +} + +static void +rsn_meta_wrapped_free (RsnMetaWrapped * meta, GstBuffer * buffer) +{ + gst_buffer_unref (meta->wrapped_buffer); + if (meta->owner) + gst_object_unref (meta->owner); +} + +const GstMetaInfo * +rsn_meta_wrapped_get_info (void) +{ + static const GstMetaInfo *meta_info = NULL; + + if (meta_info == NULL) { + meta_info = gst_meta_register ("RsnMetaWrapped", "RsnMetaWrapped", + sizeof (RsnMetaWrapped), + (GstMetaInitFunction) rsn_meta_wrapped_init, + (GstMetaFreeFunction) rsn_meta_wrapped_free, + (GstMetaTransformFunction) NULL, + (GstMetaSerializeFunction) NULL, (GstMetaDeserializeFunction) NULL); + } + return meta_info; +} diff --git a/ext/resindvd/rsnwrappedbuffer.h b/ext/resindvd/rsnwrappedbuffer.h index 7c6a0e735..3c0afe21f 100644 --- a/ext/resindvd/rsnwrappedbuffer.h +++ b/ext/resindvd/rsnwrappedbuffer.h @@ -24,45 +24,25 @@ G_BEGIN_DECLS -#define RSN_TYPE_WRAPPEDBUFFER (rsn_wrappedbuffer_get_type()) -#define RSN_WRAPPEDBUFFER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), RSN_TYPE_WRAPPEDBUFFER, \ - RsnWrappedBuffer)) -#define RSN_WRAPPEDBUFFER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), RSN_TYPE_WRAPPEDBUFFER, \ - RsnWrappedBufferClass)) -#define RSN_IS_WRAPPEDBUFFER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSN_TYPE_WRAPPEDBUFFER)) -#define RSN_IS_WRAPPEDBUFFER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), RSN_TYPE_WRAPPEDBUFFER)) +typedef struct _RsnMetaWrapped RsnMetaWrapped; -typedef struct _RsnWrappedBuffer RsnWrappedBuffer; -typedef struct _RsnWrappedBufferClass RsnWrappedBufferClass; - -typedef gboolean (*RsnWrappedBufferReleaseFunc)(GstElement *owner, - RsnWrappedBuffer *buf); - -struct _RsnWrappedBuffer { - GstBuffer buffer; +struct _RsnMetaWrapped { + GstMeta meta; GstBuffer *wrapped_buffer; GstElement *owner; - RsnWrappedBufferReleaseFunc release; }; -struct _RsnWrappedBufferClass -{ - GstBufferClass parent_class; -}; +GstBuffer *rsn_wrapped_buffer_new (GstBuffer *buf_to_wrap, GstElement *owner); + +GstBuffer *rsn_meta_wrapped_unwrap_and_unref (GstBuffer *wrap_buf, RsnMetaWrapped *meta); + +void rsn_meta_wrapped_set_owner (RsnMetaWrapped *meta, GstElement *owner); -RsnWrappedBuffer *rsn_wrapped_buffer_new (GstBuffer *buf_to_wrap); -GstBuffer *rsn_wrappedbuffer_unwrap_and_unref (RsnWrappedBuffer *wrap_buf); -void rsn_wrapped_buffer_set_owner (RsnWrappedBuffer *wrapped_buf, - GstElement *owner); -void rsn_wrapped_buffer_set_releasefunc (RsnWrappedBuffer *wrapped_buf, - RsnWrappedBufferReleaseFunc release_func); +const GstMetaInfo * rsn_meta_wrapped_get_info (void); -GType rsn_wrappedbuffer_get_type (void); +#define RSN_META_WRAPPED_GET(buf) ((RsnMetaWrapped *)gst_buffer_get_meta(buf,rsn_meta_wrapped_get_info())) +#define RSN_META_WRAPPED_ADD(buf) ((RsnMetaWrapped *)gst_buffer_add_meta(buf,rsn_meta_wrapped_get_info(),NULL)) G_END_DECLS diff --git a/ext/rsvg/gstrsvgdec.c b/ext/rsvg/gstrsvgdec.c index 9ebb84134..f7cb701aa 100644 --- a/ext/rsvg/gstrsvgdec.c +++ b/ext/rsvg/gstrsvgdec.c @@ -82,8 +82,10 @@ gst_rsvg_dec_base_init (gpointer g_class) "Uses librsvg to decode SVG images", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); } static void diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c index 121d4d252..1cbd0990c 100644 --- a/ext/rsvg/gstrsvgoverlay.c +++ b/ext/rsvg/gstrsvgoverlay.c @@ -446,11 +446,12 @@ gst_rsvg_overlay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &video_sink_template); - gst_element_class_add_static_pad_template (element_class, - &data_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&data_sink_template)); gst_element_class_set_details_simple (element_class, "RSVG overlay", "Filter/Editor/Video", diff --git a/ext/rtmp/gstrtmpsink.c b/ext/rtmp/gstrtmpsink.c index bfc8f3c0f..23d580cfd 100644 --- a/ext/rtmp/gstrtmpsink.c +++ b/ext/rtmp/gstrtmpsink.c @@ -80,64 +80,51 @@ static gboolean gst_rtmp_sink_stop (GstBaseSink * sink); static gboolean gst_rtmp_sink_start (GstBaseSink * sink); static GstFlowReturn gst_rtmp_sink_render (GstBaseSink * sink, GstBuffer * buf); -static void -_do_init (GType gtype) -{ - static const GInterfaceInfo urihandler_info = { - gst_rtmp_sink_uri_handler_init, - NULL, - NULL - }; - - g_type_add_interface_static (gtype, GST_TYPE_URI_HANDLER, &urihandler_info); - - GST_DEBUG_CATEGORY_INIT (gst_rtmp_sink_debug, "rtmpsink", 0, - "RTMP server element"); -} - -GST_BOILERPLATE_FULL (GstRTMPSink, gst_rtmp_sink, GstBaseSink, - GST_TYPE_BASE_SINK, _do_init); - - -static void -gst_rtmp_sink_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_set_details_simple (element_class, - "RTMP output sink", - "Sink/Network", "Sends FLV content to a server via RTMP", - "Jan Schmidt <thaytan@noraisin.net>"); - - gst_element_class_add_static_pad_template (element_class, - &sink_template); -} +#define gst_rtmp_sink_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstRTMPSink, gst_rtmp_sink, GST_TYPE_BASE_SINK, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, + gst_rtmp_sink_uri_handler_init)); /* initialize the plugin's class */ static void gst_rtmp_sink_class_init (GstRTMPSinkClass * klass) { GObjectClass *gobject_class; - GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gobject_class->finalize = gst_rtmp_sink_finalize; gobject_class->set_property = gst_rtmp_sink_set_property; gobject_class->get_property = gst_rtmp_sink_get_property; + gst_element_class_install_std_props (gstelement_class, + "location", PROP_LOCATION, G_PARAM_READWRITE, NULL); + + gst_element_class_set_details_simple (gstelement_class, + "RTMP output sink", + "Sink/Network", "Sends FLV content to a server via RTMP", + "Jan Schmidt <thaytan@noraisin.net>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_template)); + gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_rtmp_sink_start); gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_rtmp_sink_stop); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_rtmp_sink_render); - gst_element_class_install_std_props (GST_ELEMENT_CLASS (klass), - "location", PROP_LOCATION, G_PARAM_READWRITE, NULL); + GST_DEBUG_CATEGORY_INIT (gst_rtmp_sink_debug, "rtmpsink", 0, + "RTMP server element"); } /* initialize the new element * initialize instance structure */ static void -gst_rtmp_sink_init (GstRTMPSink * sink, GstRTMPSinkClass * klass) +gst_rtmp_sink_init (GstRTMPSink * sink) { #ifdef G_OS_WIN32 WSADATA wsa_data; @@ -218,6 +205,8 @@ gst_rtmp_sink_render (GstBaseSink * bsink, GstBuffer * buf) { GstRTMPSink *sink = GST_RTMP_SINK (bsink); GstBuffer *reffed_buf = NULL; + guint8 *data; + gsize size; if (sink->first) { /* open the connection */ @@ -237,72 +226,84 @@ gst_rtmp_sink_render (GstBaseSink * bsink, GstBuffer * buf) /* FIXME: Parse the first buffer and see if it contains a header plus a packet instead * of just assuming it's only the header */ - GST_LOG_OBJECT (sink, "Caching first buffer of size %d for concatenation", - GST_BUFFER_SIZE (buf)); + GST_LOG_OBJECT (sink, "Caching first buffer of size %" G_GSIZE_FORMAT + " for concatenation", gst_buffer_get_size (buf)); gst_buffer_replace (&sink->cache, buf); sink->first = FALSE; return GST_FLOW_OK; } if (sink->cache) { - GST_LOG_OBJECT (sink, "Joining 2nd buffer of size %d to cached buf", - GST_BUFFER_SIZE (buf)); + GST_LOG_OBJECT (sink, "Joining 2nd buffer of size %" G_GSIZE_FORMAT + " to cached buf", gst_buffer_get_size (buf)); gst_buffer_ref (buf); reffed_buf = buf = gst_buffer_join (sink->cache, buf); sink->cache = NULL; } - GST_LOG_OBJECT (sink, "Sending %d bytes to RTMP server", - GST_BUFFER_SIZE (buf)); + GST_LOG_OBJECT (sink, "Sending %" G_GSIZE_FORMAT " bytes to RTMP server", + gst_buffer_get_size (buf)); - if (!RTMP_Write (sink->rtmp, - (char *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf))) { - GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL), ("Failed to write data")); - if (reffed_buf) - gst_buffer_unref (reffed_buf); - return GST_FLOW_ERROR; - } + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + + if (!RTMP_Write (sink->rtmp, (char *) data, size)) + goto write_failed; + gst_buffer_unmap (buf, data, size); if (reffed_buf) gst_buffer_unref (reffed_buf); return GST_FLOW_OK; + + /* ERRORS */ +write_failed: + { + GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL), ("Failed to write data")); + gst_buffer_unmap (buf, data, size); + if (reffed_buf) + gst_buffer_unref (reffed_buf); + return GST_FLOW_ERROR; + } } /* * URI interface support. */ static GstURIType -gst_rtmp_sink_uri_get_type (void) +gst_rtmp_sink_uri_get_type (GType type) { return GST_URI_SINK; } -static gchar ** -gst_rtmp_sink_uri_get_protocols (void) +static const gchar *const * +gst_rtmp_sink_uri_get_protocols (GType type) { - static gchar *protocols[] = - { (char *) "rtmp", (char *) "rtmpt", (char *) "rtmps", (char *) "rtmpe", - (char *) "rtmfp", (char *) "rtmpte", (char *) "rtmpts", NULL - }; + static const gchar *protocols[] = + { "rtmp", "rtmpt", "rtmps", "rtmpe", "rtmfp", "rtmpte", "rtmpts", NULL }; + return protocols; } -static const gchar * +static gchar * gst_rtmp_sink_uri_get_uri (GstURIHandler * handler) { GstRTMPSink *sink = GST_RTMP_SINK (handler); - return sink->uri; + /* FIXME: make thread-safe */ + return g_strdup (sink->uri); } static gboolean -gst_rtmp_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri) +gst_rtmp_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) { GstRTMPSink *sink = GST_RTMP_SINK (handler); - if (GST_STATE (sink) >= GST_STATE_PAUSED) + if (GST_STATE (sink) >= GST_STATE_PAUSED) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE, + "Changing the URI on rtmpsrc when it is running is not supported"); return FALSE; + } g_free (sink->uri); sink->uri = NULL; @@ -317,6 +318,8 @@ gst_rtmp_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri) !host.av_len || !playpath.av_len) { GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, ("Failed to parse URI %s", uri), (NULL)); + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Could not parse RTMP URI"); return FALSE; } sink->uri = g_strdup (uri); @@ -347,7 +350,7 @@ gst_rtmp_sink_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: gst_rtmp_sink_uri_set_uri (GST_URI_HANDLER (sink), - g_value_get_string (value)); + g_value_get_string (value), NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c index e9ab2ebb8..28f5ea568 100644 --- a/ext/rtmp/gstrtmpsrc.c +++ b/ext/rtmp/gstrtmpsrc.c @@ -92,46 +92,21 @@ static GstFlowReturn gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer); static gboolean gst_rtmp_src_query (GstBaseSrc * src, GstQuery * query); -static void -_do_init (GType gtype) -{ - static const GInterfaceInfo urihandler_info = { - gst_rtmp_src_uri_handler_init, - NULL, - NULL - }; - - g_type_add_interface_static (gtype, GST_TYPE_URI_HANDLER, &urihandler_info); - - GST_DEBUG_CATEGORY_INIT (rtmpsrc_debug, "rtmpsrc", 0, "RTMP Source"); -} - -GST_BOILERPLATE_FULL (GstRTMPSrc, gst_rtmp_src, GstPushSrc, GST_TYPE_PUSH_SRC, - _do_init); - -static void -gst_rtmp_src_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, &srctemplate); - - gst_element_class_set_details_simple (element_class, - "RTMP Source", - "Source/File", - "Read RTMP streams", - "Bastien Nocera <hadess@hadess.net>, " - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); -} +#define gst_rtmp_src_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstRTMPSrc, gst_rtmp_src, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, + gst_rtmp_src_uri_handler_init)); static void gst_rtmp_src_class_init (GstRTMPSrcClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = GST_ELEMENT_CLASS (klass); gstbasesrc_class = GST_BASE_SRC_CLASS (klass); gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); @@ -140,9 +115,19 @@ gst_rtmp_src_class_init (GstRTMPSrcClass * klass) gobject_class->get_property = gst_rtmp_src_get_property; /* properties */ - gst_element_class_install_std_props (GST_ELEMENT_CLASS (klass), + gst_element_class_install_std_props (gstelement_class, "location", PROP_LOCATION, G_PARAM_READWRITE, NULL); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + + gst_element_class_set_details_simple (gstelement_class, + "RTMP Source", + "Source/File", + "Read RTMP streams", + "Bastien Nocera <hadess@hadess.net>, " + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_rtmp_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_rtmp_src_stop); gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_rtmp_src_is_seekable); @@ -151,10 +136,12 @@ gst_rtmp_src_class_init (GstRTMPSrcClass * klass) gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_rtmp_src_do_seek); gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_rtmp_src_create); gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_rtmp_src_query); + + GST_DEBUG_CATEGORY_INIT (rtmpsrc_debug, "rtmpsrc", 0, "RTMP Source"); } static void -gst_rtmp_src_init (GstRTMPSrc * rtmpsrc, GstRTMPSrcClass * klass) +gst_rtmp_src_init (GstRTMPSrc * rtmpsrc) { #ifdef G_OS_WIN32 WSADATA wsa_data; @@ -190,36 +177,40 @@ gst_rtmp_src_finalize (GObject * object) */ static GstURIType -gst_rtmp_src_uri_get_type (void) +gst_rtmp_src_uri_get_type (GType type) { return GST_URI_SRC; } -static gchar ** -gst_rtmp_src_uri_get_protocols (void) +static const gchar *const * +gst_rtmp_src_uri_get_protocols (GType type) { - static gchar *protocols[] = - { (char *) "rtmp", (char *) "rtmpt", (char *) "rtmps", (char *) "rtmpe", - (char *) "rtmfp", (char *) "rtmpte", (char *) "rtmpts", NULL - }; + static const gchar *protocols[] = + { "rtmp", "rtmpt", "rtmps", "rtmpe", "rtmfp", "rtmpte", "rtmpts", NULL }; + return protocols; } -static const gchar * +static gchar * gst_rtmp_src_uri_get_uri (GstURIHandler * handler) { GstRTMPSrc *src = GST_RTMP_SRC (handler); - return src->uri; + /* FIXME: make thread-safe */ + return g_strdup (src->uri); } static gboolean -gst_rtmp_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) +gst_rtmp_src_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) { GstRTMPSrc *src = GST_RTMP_SRC (handler); - if (GST_STATE (src) >= GST_STATE_PAUSED) + if (GST_STATE (src) >= GST_STATE_PAUSED) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE, + "Changing the URI on rtmpsrc when it is running is not supported"); return FALSE; + } g_free (src->uri); src->uri = NULL; @@ -233,6 +224,8 @@ gst_rtmp_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) if (!RTMP_ParseURL (uri, &protocol, &host, &port, &playpath, &app) || !host.av_len || !playpath.av_len) { GST_ERROR_OBJECT (src, "Failed to parse URI %s", uri); + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Could not parse RTMP URI"); return FALSE; } src->uri = g_strdup (uri); @@ -265,7 +258,7 @@ gst_rtmp_src_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION:{ gst_rtmp_src_uri_set_uri (GST_URI_HANDLER (src), - g_value_get_string (value)); + g_value_get_string (value), NULL); break; } default: @@ -301,8 +294,9 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) { GstRTMPSrc *src; GstBuffer *buf; - guint8 *data; + guint8 *data, *bdata; guint todo; + gsize bsize; int read; int size; @@ -315,15 +309,15 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) GST_DEBUG ("reading from %" G_GUINT64_FORMAT ", size %u", src->cur_offset, size); - buf = gst_buffer_try_new_and_alloc (size); + buf = gst_buffer_new_allocate (NULL, size, 0); if (G_UNLIKELY (buf == NULL)) { GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", size); return GST_FLOW_ERROR; } - todo = size; - data = GST_BUFFER_DATA (buf); - read = 0; + bsize = todo = size; + bdata = data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE); + read = bsize = 0; while (todo > 0) { read = RTMP_Read (src->rtmp, (char *) data, todo); @@ -331,7 +325,6 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) if (G_UNLIKELY (read == 0 && todo == size)) { goto eos; } else if (G_UNLIKELY (read == 0)) { - GST_BUFFER_SIZE (buf) -= todo; todo = 0; break; } @@ -340,13 +333,16 @@ gst_rtmp_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) goto read_failed; if (read < todo) { - data = &data[read]; + data += read; todo -= read; + bsize += read; } else { todo = 0; + bsize += todo; } GST_LOG (" got size %d", read); } + gst_buffer_unmap (buf, bdata, bsize); if (src->discont) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); @@ -480,7 +476,7 @@ gst_rtmp_src_prepare_seek_segment (GstBaseSrc * basesrc, GstEvent * event, } gst_segment_init (segment, GST_FORMAT_TIME); - gst_segment_set_seek (segment, rate, format, flags, cur_type, cur, stop_type, + gst_segment_do_seek (segment, rate, format, flags, cur_type, cur, stop_type, stop, NULL); return TRUE; diff --git a/ext/schroedinger/gstschrodec.c b/ext/schroedinger/gstschrodec.c index 70c30a52d..126ef1fed 100644 --- a/ext/schroedinger/gstschrodec.c +++ b/ext/schroedinger/gstschrodec.c @@ -114,10 +114,10 @@ gst_schro_dec_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_dec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_dec_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_schro_dec_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_schro_dec_sink_template)); gst_element_class_set_details_simple (element_class, "Dirac Decoder", "Codec/Decoder/Video", diff --git a/ext/schroedinger/gstschroenc.c b/ext/schroedinger/gstschroenc.c index 14932da3d..beda4eac9 100644 --- a/ext/schroedinger/gstschroenc.c +++ b/ext/schroedinger/gstschroenc.c @@ -125,10 +125,10 @@ gst_schro_enc_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_enc_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_enc_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_schro_enc_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_schro_enc_sink_template)); gst_element_class_set_details_simple (element_class, "Dirac Encoder", "Codec/Encoder/Video", diff --git a/ext/sdl/sdlaudiosink.c b/ext/sdl/sdlaudiosink.c index 98f5bb709..707459fc7 100644 --- a/ext/sdl/sdlaudiosink.c +++ b/ext/sdl/sdlaudiosink.c @@ -149,8 +149,8 @@ gst_sdlaudio_sink_base_init (gpointer g_class) "Output to a sound card via SDLAUDIO", "Edgard Lima <edgard.lima@indt.org.br>"); - gst_element_class_add_static_pad_template (element_class, - &sdlaudiosink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sdlaudiosink_sink_factory)); } static void diff --git a/ext/sdl/sdlvideosink.c b/ext/sdl/sdlvideosink.c index fe155a45e..fa05ace1a 100644 --- a/ext/sdl/sdlvideosink.c +++ b/ext/sdl/sdlvideosink.c @@ -151,7 +151,6 @@ gst_sdlvideosink_base_init (gpointer g_class) GST_PAD_SINK, GST_PAD_ALWAYS, capslist); gst_element_class_add_pad_template (element_class, sink_template); - gst_object_unref (sink_template); gst_element_class_set_details_simple (element_class, "SDL video sink", "Sink/Video", "An SDL-based videosink", "Ronald Bultje <rbultje@ronald.bitfreak.net>, " diff --git a/ext/shout/gstshout.c b/ext/shout/gstshout.c index 59cfc1409..c5a71136a 100644 --- a/ext/shout/gstshout.c +++ b/ext/shout/gstshout.c @@ -110,8 +110,8 @@ gst_icecastsend_base_init (GstIcecastSendClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &sink_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); gst_element_class_set_details_simple (element_class, "Icecast network sink", "Sink/Network", "Sends data to an icecast server using libshout", diff --git a/ext/snapshot/gstsnapshot.c b/ext/snapshot/gstsnapshot.c index 6b7858161..97ffbed5f 100644 --- a/ext/snapshot/gstsnapshot.c +++ b/ext/snapshot/gstsnapshot.c @@ -116,10 +116,10 @@ gst_snapshot_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &snapshot_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &snapshot_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&snapshot_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&snapshot_src_factory)); gst_element_class_set_details_simple (element_class, "Snapshot", "Filter/Editor/Video", diff --git a/ext/sndfile/gstsfsink.c b/ext/sndfile/gstsfsink.c index 273c840b8..56dc4b006 100644 --- a/ext/sndfile/gstsfsink.c +++ b/ext/sndfile/gstsfsink.c @@ -84,8 +84,8 @@ gst_sf_sink_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GST_DEBUG_CATEGORY_INIT (gst_sf_debug, "sfsink", 0, "sfsink element"); - gst_element_class_add_static_pad_template (element_class, - &sf_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sf_sink_factory)); gst_element_class_set_details_simple (element_class, "Sndfile sink", "Sink/Audio", "Write audio streams to disk using libsndfile", @@ -415,9 +415,9 @@ gst_sf_sink_loop (GstPad * pad) basesink->offset += GST_BUFFER_SIZE (buf); - GST_PAD_PREROLL_LOCK (pad); + GST_BASE_SINK_PREROLL_LOCK (basesink); result = gst_sf_sink_render (basesink, buf); - GST_PAD_PREROLL_UNLOCK (pad); + GST_BASE_SINK_PREROLL_UNLOCK (basesink); if (G_UNLIKELY (result != GST_FLOW_OK)) goto paused; diff --git a/ext/sndfile/gstsfsrc.c b/ext/sndfile/gstsfsrc.c index 8dc79591e..226f54085 100644 --- a/ext/sndfile/gstsfsrc.c +++ b/ext/sndfile/gstsfsrc.c @@ -83,8 +83,8 @@ gst_sf_src_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &sf_src_factory); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sf_src_factory)); gst_element_class_set_details_simple (gstelement_class, "Sndfile source", "Source/Audio", diff --git a/ext/soundtouch/Makefile.am b/ext/soundtouch/Makefile.am index 74a5516d4..07832a7bc 100644 --- a/ext/soundtouch/Makefile.am +++ b/ext/soundtouch/Makefile.am @@ -7,7 +7,7 @@ libgstsoundtouch_la_SOURCES = \ libgstsoundtouch_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SOUNDTOUCH_CFLAGS) libgstsoundtouch_la_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(SOUNDTOUCH_CFLAGS) -libgstsoundtouch_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(SOUNDTOUCH_LIBS) $(LIBM) +libgstsoundtouch_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) $(SOUNDTOUCH_LIBS) $(LIBM) libgstsoundtouch_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsoundtouch_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/ext/soundtouch/gstpitch.cc b/ext/soundtouch/gstpitch.cc index 332e0edd3..6b5b95f15 100644 --- a/ext/soundtouch/gstpitch.cc +++ b/ext/soundtouch/gstpitch.cc @@ -106,10 +106,10 @@ gst_pitch_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_pitch_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_pitch_sink_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_pitch_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_pitch_sink_template)); gst_element_class_set_details_simple (gstelement_class, "Pitch controller", "Filter/Converter/Audio", "Control the pitch of an audio stream", diff --git a/ext/soundtouch/plugin.c b/ext/soundtouch/plugin.c index 5e8cb1563..77cc30492 100644 --- a/ext/soundtouch/plugin.c +++ b/ext/soundtouch/plugin.c @@ -22,15 +22,12 @@ #endif #include <gst/gst.h> -#include <gst/controller/gstcontroller.h> #include "gstpitch.hh" #include "gstbpmdetect.hh" static gboolean plugin_init (GstPlugin * plugin) { - gst_controller_init (NULL, NULL); - return gst_element_register (plugin, "pitch", GST_RANK_NONE, GST_TYPE_PITCH) && gst_element_register (plugin, "bpmdetect", GST_RANK_NONE, GST_TYPE_BPM_DETECT); diff --git a/ext/spandsp/gstspanplc.c b/ext/spandsp/gstspanplc.c index 3e174703c..58edce9f4 100644 --- a/ext/spandsp/gstspanplc.c +++ b/ext/spandsp/gstspanplc.c @@ -71,8 +71,10 @@ gst_span_plc_base_init (gpointer gclass) { GstElementClass *element_class = (GstElementClass *) gclass; - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "SpanDSP PLC", "Filter/Effect/Audio", diff --git a/ext/spc/gstspc.c b/ext/spc/gstspc.c index 70d2340ad..2c74a9c56 100644 --- a/ext/spc/gstspc.c +++ b/ext/spc/gstspc.c @@ -108,8 +108,10 @@ gst_spc_dec_base_init (gpointer g_class) "Uses OpenSPC to emulate an SPC processor", "Chris Lee <clee@kde.org>, Brian Koropoff <bkoropoff@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); } static void diff --git a/ext/swfdec/gstswfdec.c b/ext/swfdec/gstswfdec.c index 43e06de72..9394ddec3 100644 --- a/ext/swfdec/gstswfdec.c +++ b/ext/swfdec/gstswfdec.c @@ -213,12 +213,12 @@ gst_swfdec_base_init (gpointer g_class) "Uses libswfdec to decode Flash video streams", "David Schleef <ds@schleef.org>"); - gst_element_class_add_static_pad_template (element_class, - &video_template_factory); - gst_element_class_add_static_pad_template (element_class, - &audio_template_factory); - gst_element_class_add_static_pad_template (element_class, - &sink_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); } static void diff --git a/ext/teletextdec/gstteletextdec.c b/ext/teletextdec/gstteletextdec.c index bd182670c..846c243e4 100644 --- a/ext/teletextdec/gstteletextdec.c +++ b/ext/teletextdec/gstteletextdec.c @@ -196,9 +196,10 @@ gst_teletextdec_base_init (gpointer klass) "Sebastian Pölsterl <sebp@k-d-w.org>, " "Andoni Morales Alastruey <ylatuya@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } /* initialize the gstteletext's class */ diff --git a/ext/timidity/gsttimidity.c b/ext/timidity/gsttimidity.c index 91e47ced4..cbbcc0da1 100644 --- a/ext/timidity/gsttimidity.c +++ b/ext/timidity/gsttimidity.c @@ -95,8 +95,10 @@ gst_timidity_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Timidity", "Codec/Decoder/Audio", "Midi Synthesizer Element", "Wouter Paesen <wouter@blue-gate.be>"); diff --git a/ext/timidity/gstwildmidi.c b/ext/timidity/gstwildmidi.c index e78ecc11c..6def9f946 100644 --- a/ext/timidity/gstwildmidi.c +++ b/ext/timidity/gstwildmidi.c @@ -120,8 +120,10 @@ gst_wildmidi_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "WildMidi", "Codec/Decoder/Audio", "Midi Synthesizer Element", "Wouter Paesen <wouter@blue-gate.be>"); diff --git a/ext/voamrwbenc/gstvoamrwbenc.c b/ext/voamrwbenc/gstvoamrwbenc.c index 2b3780239..4647b84ab 100644 --- a/ext/voamrwbenc/gstvoamrwbenc.c +++ b/ext/voamrwbenc/gstvoamrwbenc.c @@ -160,9 +160,10 @@ gst_voamrwbenc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "AMR-WB audio encoder", "Codec/Encoder/Audio", diff --git a/ext/vp8/gstvp8dec.c b/ext/vp8/gstvp8dec.c index e3a2fd9bd..1172ac96e 100644 --- a/ext/vp8/gstvp8dec.c +++ b/ext/vp8/gstvp8dec.c @@ -104,7 +104,7 @@ static gboolean gst_vp8_dec_reset (GstBaseVideoDecoder * decoder); static GstFlowReturn gst_vp8_dec_parse_data (GstBaseVideoDecoder * decoder, gboolean at_eos); static GstFlowReturn gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, - GstVideoFrame * frame); + GstVideoFrameState * frame); static GstStaticPadTemplate gst_vp8_dec_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", @@ -117,36 +117,22 @@ static GstStaticPadTemplate gst_vp8_dec_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("I420")) ); -GST_BOILERPLATE (GstVP8Dec, gst_vp8_dec, GstBaseVideoDecoder, - GST_TYPE_BASE_VIDEO_DECODER); - -static void -gst_vp8_dec_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_vp8_dec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_vp8_dec_sink_template); - - gst_element_class_set_details_simple (element_class, - "On2 VP8 Decoder", - "Codec/Decoder/Video", - "Decode VP8 video streams", "David Schleef <ds@entropywave.com>"); -} +#define gst_vp8_dec_parent_class parent_class +G_DEFINE_TYPE (GstVP8Dec, gst_vp8_dec, GST_TYPE_BASE_VIDEO_DECODER); static void gst_vp8_dec_class_init (GstVP8DecClass * klass) { GObjectClass *gobject_class; + GstElementClass *element_class; GstBaseVideoDecoderClass *base_video_decoder_class; gobject_class = G_OBJECT_CLASS (klass); base_video_decoder_class = GST_BASE_VIDEO_DECODER_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); gobject_class->set_property = gst_vp8_dec_set_property; gobject_class->get_property = gst_vp8_dec_get_property; @@ -174,6 +160,16 @@ gst_vp8_dec_class_init (GstVP8DecClass * klass) 0, 16, DEFAULT_NOISE_LEVEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vp8_dec_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vp8_dec_sink_template)); + + gst_element_class_set_details_simple (element_class, + "On2 VP8 Decoder", + "Codec/Decoder/Video", + "Decode VP8 video streams", "David Schleef <ds@entropywave.com>"); + base_video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_vp8_dec_start); base_video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vp8_dec_stop); base_video_decoder_class->reset = GST_DEBUG_FUNCPTR (gst_vp8_dec_reset); @@ -188,7 +184,7 @@ gst_vp8_dec_class_init (GstVP8DecClass * klass) } static void -gst_vp8_dec_init (GstVP8Dec * gst_vp8_dec, GstVP8DecClass * klass) +gst_vp8_dec_init (GstVP8Dec * gst_vp8_dec) { GstBaseVideoDecoder *decoder = (GstBaseVideoDecoder *) gst_vp8_dec; @@ -318,58 +314,50 @@ gst_vp8_dec_send_tags (GstVP8Dec * dec) { GstTagList *list; - list = gst_tag_list_new (); + list = gst_tag_list_new_empty (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_VIDEO_CODEC, "VP8 video", NULL); - gst_element_found_tags_for_pad (GST_ELEMENT (dec), - GST_BASE_VIDEO_CODEC_SRC_PAD (dec), list); + gst_pad_push_event (GST_BASE_VIDEO_CODEC_SRC_PAD (dec), + gst_event_new_tag (list)); } static void gst_vp8_dec_image_to_buffer (GstVP8Dec * dec, const vpx_image_t * img, GstBuffer * buffer) { - int stride, w, h, i; - guint8 *d; - GstVideoState *state = &GST_BASE_VIDEO_CODEC (dec)->state; - - d = GST_BUFFER_DATA (buffer) + - gst_video_format_get_component_offset (state->format, 0, - state->width, state->height); - stride = gst_video_format_get_row_stride (state->format, 0, state->width); - h = gst_video_format_get_component_height (state->format, 0, state->height); - h = MIN (h, img->h); - w = gst_video_format_get_component_width (state->format, 0, state->width); - w = MIN (w, img->w); - - for (i = 0; i < h; i++) - memcpy (d + i * stride, - img->planes[VPX_PLANE_Y] + i * img->stride[VPX_PLANE_Y], w); - - d = GST_BUFFER_DATA (buffer) + - gst_video_format_get_component_offset (state->format, 1, - state->width, state->height); - stride = gst_video_format_get_row_stride (state->format, 1, state->width); - h = gst_video_format_get_component_height (state->format, 1, state->height); - h = MIN (h, img->h >> img->y_chroma_shift); - w = gst_video_format_get_component_width (state->format, 1, state->width); - w = MIN (w, img->w >> img->x_chroma_shift); - for (i = 0; i < h; i++) - memcpy (d + i * stride, - img->planes[VPX_PLANE_U] + i * img->stride[VPX_PLANE_U], w); - - d = GST_BUFFER_DATA (buffer) + - gst_video_format_get_component_offset (state->format, 2, - state->width, state->height); - /* Same stride, height, width as above */ - for (i = 0; i < h; i++) - memcpy (d + i * stride, - img->planes[VPX_PLANE_V] + i * img->stride[VPX_PLANE_V], w); + int deststride, srcstride, height, width, line, comp; + guint8 *dest, *src; + GstVideoFrame frame; + GstVideoInfo *info = &GST_BASE_VIDEO_CODEC (dec)->info; + + if (!gst_video_frame_map (&frame, info, buffer, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (dec, "Could not map video buffer"); + } + + for (comp = 0; comp < 3; comp++) { + dest = GST_VIDEO_FRAME_COMP_DATA (&frame, comp); + src = img->planes[comp]; + width = GST_VIDEO_FRAME_COMP_WIDTH (&frame, comp); + height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, comp); + deststride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, comp); + srcstride = img->stride[comp]; + + /* FIXME (Edward) : Do a plane memcpy is srcstride == deststride instead + * of copying line by line */ + for (line = 0; line < height; line++) { + memcpy (dest, src, width); + dest += deststride; + src += srcstride; + } + } + + gst_video_frame_unmap (&frame); } static GstFlowReturn -gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame) +gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, + GstVideoFrameState * frame) { GstVP8Dec *dec; GstFlowReturn ret = GST_FLOW_OK; @@ -378,11 +366,14 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame) vpx_image_t *img; long decoder_deadline = 0; GstClockTimeDiff deadline; + gsize size; + gpointer data; GST_DEBUG_OBJECT (decoder, "handle_frame"); dec = GST_VP8_DEC (decoder); + /* FIXME : Move this to a separate function for clarity */ if (!dec->decoder_inited) { int flags = 0; vpx_codec_stream_info_t stream_info; @@ -392,9 +383,13 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame) memset (&stream_info, 0, sizeof (stream_info)); stream_info.sz = sizeof (stream_info); - status = vpx_codec_peek_stream_info (&vpx_codec_vp8_dx_algo, - GST_BUFFER_DATA (frame->sink_buffer), - GST_BUFFER_SIZE (frame->sink_buffer), &stream_info); + data = gst_buffer_map (frame->sink_buffer, &size, NULL, GST_MAP_READ); + + status = + vpx_codec_peek_stream_info (&vpx_codec_vp8_dx_algo, data, size, + &stream_info); + + gst_buffer_unmap (frame->sink_buffer, data, size); if (status != VPX_CODEC_OK || !stream_info.is_kf) { GST_WARNING_OBJECT (decoder, "No keyframe, skipping"); @@ -461,9 +456,12 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame) decoder_deadline = MAX (1, deadline / GST_MSECOND); } - status = vpx_codec_decode (&dec->decoder, - GST_BUFFER_DATA (frame->sink_buffer), - GST_BUFFER_SIZE (frame->sink_buffer), NULL, decoder_deadline); + data = gst_buffer_map (frame->sink_buffer, &size, NULL, GST_MAP_READ); + + status = vpx_codec_decode (&dec->decoder, data, size, NULL, decoder_deadline); + + gst_buffer_unmap (frame->sink_buffer, data, size); + if (status) { GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE, ("Failed to decode frame"), ("%s", gst_vpx_error_name (status))); diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c index 5ed11e3a0..7a1832843 100644 --- a/ext/vp8/gstvp8enc.c +++ b/ext/vp8/gstvp8enc.c @@ -222,12 +222,12 @@ static void gst_vp8_enc_get_property (GObject * object, guint prop_id, static gboolean gst_vp8_enc_start (GstBaseVideoEncoder * encoder); static gboolean gst_vp8_enc_stop (GstBaseVideoEncoder * encoder); static gboolean gst_vp8_enc_set_format (GstBaseVideoEncoder * - base_video_encoder, GstVideoState * state); + base_video_encoder, GstVideoInfo * info); static gboolean gst_vp8_enc_finish (GstBaseVideoEncoder * base_video_encoder); static GstFlowReturn gst_vp8_enc_handle_frame (GstBaseVideoEncoder * - base_video_encoder, GstVideoFrame * frame); + base_video_encoder, GstVideoFrameState * frame); static GstFlowReturn gst_vp8_enc_shape_output (GstBaseVideoEncoder * encoder, - GstVideoFrame * frame); + GstVideoFrameState * frame); static gboolean gst_vp8_enc_sink_event (GstBaseVideoEncoder * base_video_encoder, GstEvent * event); @@ -235,7 +235,7 @@ static GstStaticPadTemplate gst_vp8_enc_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("I420")) ); static GstStaticPadTemplate gst_vp8_enc_src_template = @@ -245,54 +245,38 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("video/x-vp8") ); -static void -do_init (GType vp8enc_type) -{ - static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; - const GInterfaceInfo preset_interface_info = { - NULL, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; +#define gst_vp8_enc_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstVP8Enc, gst_vp8_enc, GST_TYPE_BASE_VIDEO_ENCODER, + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL); + G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, NULL);); - g_type_add_interface_static (vp8enc_type, GST_TYPE_TAG_SETTER, - &tag_setter_info); - g_type_add_interface_static (vp8enc_type, GST_TYPE_PRESET, - &preset_interface_info); -} - -GST_BOILERPLATE_FULL (GstVP8Enc, gst_vp8_enc, GstBaseVideoEncoder, - GST_TYPE_BASE_VIDEO_ENCODER, do_init); - -static void -gst_vp8_enc_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_vp8_enc_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_vp8_enc_sink_template); - - gst_element_class_set_details_simple (element_class, - "On2 VP8 Encoder", - "Codec/Encoder/Video", - "Encode VP8 video streams", "David Schleef <ds@entropywave.com>"); -} static void gst_vp8_enc_class_init (GstVP8EncClass * klass) { GObjectClass *gobject_class; + GstElementClass *element_class; GstBaseVideoEncoderClass *base_video_encoder_class; + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); base_video_encoder_class = GST_BASE_VIDEO_ENCODER_CLASS (klass); gobject_class->set_property = gst_vp8_enc_set_property; gobject_class->get_property = gst_vp8_enc_get_property; gobject_class->finalize = gst_vp8_enc_finalize; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vp8_enc_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vp8_enc_sink_template)); + + gst_element_class_set_details_simple (element_class, + "On2 VP8 Encoder", + "Codec/Encoder/Video", + "Encode VP8 video streams", "David Schleef <ds@entropywave.com>"); + base_video_encoder_class->start = gst_vp8_enc_start; base_video_encoder_class->stop = gst_vp8_enc_stop; base_video_encoder_class->handle_frame = gst_vp8_enc_handle_frame; @@ -446,7 +430,7 @@ gst_vp8_enc_class_init (GstVP8EncClass * klass) } static void -gst_vp8_enc_init (GstVP8Enc * gst_vp8_enc, GstVP8EncClass * klass) +gst_vp8_enc_init (GstVP8Enc * gst_vp8_enc) { GST_DEBUG_OBJECT (gst_vp8_enc, "init"); @@ -706,7 +690,7 @@ gst_vp8_enc_stop (GstBaseVideoEncoder * base_video_encoder) static gboolean gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, - GstVideoState * state) + GstVideoInfo * info) { GstVP8Enc *encoder; vpx_codec_enc_cfg_t cfg; @@ -732,10 +716,10 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, return FALSE; } - cfg.g_w = state->width; - cfg.g_h = state->height; - cfg.g_timebase.num = state->fps_d; - cfg.g_timebase.den = state->fps_n; + cfg.g_w = info->width; + cfg.g_h = info->height; + cfg.g_timebase.num = info->fps_d; + cfg.g_timebase.den = info->fps_n; cfg.g_error_resilient = encoder->error_resilient; cfg.g_lag_in_frames = encoder->max_latency; @@ -838,7 +822,7 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, gst_base_video_encoder_set_latency (base_video_encoder, 0, gst_util_uint64_scale (encoder->max_latency, - state->fps_d * GST_SECOND, state->fps_n)); + info->fps_d * GST_SECOND, info->fps_n)); encoder->inited = TRUE; /* prepare cached image buffer setup */ @@ -848,39 +832,29 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, image->fmt = VPX_IMG_FMT_I420; image->bps = 12; image->x_chroma_shift = image->y_chroma_shift = 1; - image->w = image->d_w = state->width; - image->h = image->d_h = state->height; - - image->stride[VPX_PLANE_Y] = - gst_video_format_get_row_stride (state->format, 0, state->width); - image->stride[VPX_PLANE_U] = - gst_video_format_get_row_stride (state->format, 1, state->width); - image->stride[VPX_PLANE_V] = - gst_video_format_get_row_stride (state->format, 2, state->width); - image->planes[VPX_PLANE_Y] = - data + gst_video_format_get_component_offset (state->format, 0, - state->width, state->height); - image->planes[VPX_PLANE_U] = - data + gst_video_format_get_component_offset (state->format, 1, - state->width, state->height); - image->planes[VPX_PLANE_V] = - data + gst_video_format_get_component_offset (state->format, 2, - state->width, state->height); + image->w = image->d_w = info->width; + image->h = image->d_h = info->height; + image->stride[VPX_PLANE_Y] = GST_VIDEO_INFO_COMP_STRIDE (info, 0); + image->stride[VPX_PLANE_U] = GST_VIDEO_INFO_COMP_STRIDE (info, 1); + image->stride[VPX_PLANE_V] = GST_VIDEO_INFO_COMP_STRIDE (info, 2); + image->planes[VPX_PLANE_Y] = data + GST_VIDEO_INFO_COMP_OFFSET (info, 0); + image->planes[VPX_PLANE_U] = data + GST_VIDEO_INFO_COMP_OFFSET (info, 1); + image->planes[VPX_PLANE_V] = data + GST_VIDEO_INFO_COMP_OFFSET (info, 2); caps = gst_caps_new_simple ("video/x-vp8", - "width", G_TYPE_INT, state->width, - "height", G_TYPE_INT, state->height, - "framerate", GST_TYPE_FRACTION, state->fps_n, - state->fps_d, - "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n, - state->par_d, NULL); + "width", G_TYPE_INT, info->width, + "height", G_TYPE_INT, info->height, + "framerate", GST_TYPE_FRACTION, info->fps_n, + info->fps_d, + "pixel-aspect-ratio", GST_TYPE_FRACTION, info->par_n, info->par_d, NULL); { GstStructure *s; GstBuffer *stream_hdr, *vorbiscomment; const GstTagList *iface_tags; GValue array = { 0, }; GValue value = { 0, }; + gsize size; s = gst_caps_get_structure (caps, 0); /* put buffers in a fixed list */ @@ -889,19 +863,21 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, /* Create Ogg stream-info */ stream_hdr = gst_buffer_new_and_alloc (26); - data = GST_BUFFER_DATA (stream_hdr); + data = gst_buffer_map (stream_hdr, &size, NULL, GST_MAP_WRITE); GST_WRITE_UINT8 (data, 0x4F); GST_WRITE_UINT32_BE (data + 1, 0x56503830); /* "VP80" */ GST_WRITE_UINT8 (data + 5, 0x01); /* stream info header */ GST_WRITE_UINT8 (data + 6, 1); /* Major version 1 */ GST_WRITE_UINT8 (data + 7, 0); /* Minor version 0 */ - GST_WRITE_UINT16_BE (data + 8, state->width); - GST_WRITE_UINT16_BE (data + 10, state->height); - GST_WRITE_UINT24_BE (data + 12, state->par_n); - GST_WRITE_UINT24_BE (data + 15, state->par_d); - GST_WRITE_UINT32_BE (data + 18, state->fps_n); - GST_WRITE_UINT32_BE (data + 22, state->fps_d); + GST_WRITE_UINT16_BE (data + 8, info->width); + GST_WRITE_UINT16_BE (data + 10, info->height); + GST_WRITE_UINT24_BE (data + 12, info->par_n); + GST_WRITE_UINT24_BE (data + 15, info->par_d); + GST_WRITE_UINT32_BE (data + 18, info->fps_n); + GST_WRITE_UINT32_BE (data + 22, info->fps_d); + + gst_buffer_unmap (stream_hdr, data, size); GST_BUFFER_FLAG_SET (stream_hdr, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&value, stream_hdr); @@ -943,7 +919,7 @@ gst_vp8_enc_process (GstVP8Enc * encoder) const vpx_codec_cx_pkt_t *pkt; GstBaseVideoEncoder *base_video_encoder; GstVP8EncCoderHook *hook; - GstVideoFrame *frame; + GstVideoFrameState *frame; GstFlowReturn ret = GST_FLOW_OK; base_video_encoder = GST_BASE_VIDEO_ENCODER (encoder); @@ -966,7 +942,7 @@ gst_vp8_enc_process (GstVP8Enc * encoder) frame = gst_base_video_encoder_get_oldest_frame (base_video_encoder); if (frame != NULL) { buffer = gst_buffer_new (); - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_PREROLL); + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_LIVE); frame->src_buffer = buffer; gst_base_video_encoder_finish_frame (base_video_encoder, frame); } @@ -985,9 +961,10 @@ gst_vp8_enc_process (GstVP8Enc * encoder) frame->is_sync_point = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) != 0; hook = frame->coder_hook; - buffer = gst_buffer_new_and_alloc (pkt->data.frame.sz); - - memcpy (GST_BUFFER_DATA (buffer), pkt->data.frame.buf, pkt->data.frame.sz); + /* FIXME : It would be nice to avoid the memory copy ... */ + buffer = + gst_buffer_new_wrapped (g_memdup (pkt->data.frame.buf, + pkt->data.frame.sz), pkt->data.frame.sz); if (hook->image) g_slice_free (vpx_image_t, hook->image); @@ -1049,21 +1026,28 @@ static vpx_image_t * gst_vp8_enc_buffer_to_image (GstVP8Enc * enc, GstBuffer * buffer) { vpx_image_t *image = g_slice_new (vpx_image_t); - guint8 *data = GST_BUFFER_DATA (buffer); + GstVideoFrame frame; memcpy (image, &enc->image, sizeof (*image)); - image->img_data = data; - image->planes[VPX_PLANE_Y] += (data - (guint8 *) NULL); - image->planes[VPX_PLANE_U] += (data - (guint8 *) NULL); - image->planes[VPX_PLANE_V] += (data - (guint8 *) NULL); + gst_video_frame_map (&frame, &GST_BASE_VIDEO_CODEC (enc)->info, + buffer, GST_MAP_READ); + + image->img_data = frame.data[0]; + image->planes[VPX_PLANE_Y] = frame.data[0]; + image->planes[VPX_PLANE_U] = frame.data[1]; + image->planes[VPX_PLANE_V] = frame.data[2]; + + /* FIXME : We should only unmap when we're done with it */ + + gst_video_frame_unmap (&frame); return image; } static GstFlowReturn gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, - GstVideoFrame * frame) + GstVideoFrameState * frame) { GstVP8Enc *encoder; const GstVideoState *state; @@ -1125,7 +1109,7 @@ _to_granulepos (guint64 frame_end_number, guint inv_count, guint keyframe_dist) static GstFlowReturn gst_vp8_enc_shape_output (GstBaseVideoEncoder * base_video_encoder, - GstVideoFrame * frame) + GstVideoFrameState * frame) { GstVP8Enc *encoder; GstBuffer *buf; @@ -1164,8 +1148,6 @@ gst_vp8_enc_shape_output (GstBaseVideoEncoder * base_video_encoder, gst_util_uint64_scale (frame->presentation_frame_number + 1, GST_SECOND * state->fps_d, state->fps_n); - gst_buffer_set_caps (buf, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder))); ret = gst_pad_push (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder), buf); if (ret != GST_FLOW_OK) { diff --git a/ext/xvid/gstxviddec.c b/ext/xvid/gstxviddec.c index 8cd4997ee..c290777a9 100644 --- a/ext/xvid/gstxviddec.c +++ b/ext/xvid/gstxviddec.c @@ -100,9 +100,10 @@ gst_xviddec_base_init (GstXvidDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "XviD video decoder", "Codec/Decoder/Video", diff --git a/ext/xvid/gstxvidenc.c b/ext/xvid/gstxvidenc.c index dcd6a4ee8..57e9a3317 100644 --- a/ext/xvid/gstxvidenc.c +++ b/ext/xvid/gstxvidenc.c @@ -244,8 +244,10 @@ gst_xvidenc_base_init (GstXvidEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "XviD video encoder", "Codec/Encoder/Video", "XviD encoder based on xvidcore", diff --git a/ext/zbar/gstzbar.c b/ext/zbar/gstzbar.c index c0310349d..e9e9d2661 100644 --- a/ext/zbar/gstzbar.c +++ b/ext/zbar/gstzbar.c @@ -109,14 +109,14 @@ static GstStaticPadTemplate gst_zbar_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV (ZBAR_YUV_CAPS)) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (ZBAR_YUV_CAPS)) ); static GstStaticPadTemplate gst_zbar_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV (ZBAR_YUV_CAPS)) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (ZBAR_YUV_CAPS)) ); static void gst_zbar_finalize (GObject * object); @@ -125,40 +125,27 @@ static void gst_zbar_set_property (GObject * object, guint prop_id, static void gst_zbar_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static gboolean gst_zbar_set_caps (GstBaseTransform * base, GstCaps * incaps, - GstCaps * outcaps); -static GstFlowReturn gst_zbar_transform_ip (GstBaseTransform * transform, - GstBuffer * buf); static gboolean gst_zbar_start (GstBaseTransform * base); static gboolean gst_zbar_stop (GstBaseTransform * base); -GST_BOILERPLATE (GstZBar, gst_zbar, GstVideoFilter, GST_TYPE_VIDEO_FILTER); +static GstFlowReturn gst_zbar_transform_frame_ip (GstVideoFilter * vfilter, + GstVideoFrame * frame); - -static void -gst_zbar_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, "Barcode detector", - "Filter/Analyzer/Video", - "Detect bar codes in the video streams", - "Stefan Kost <ensonic@users.sf.net>"); - - gst_element_class_add_static_pad_template (element_class, - &gst_zbar_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_zbar_src_template); -} +#define gst_zbar_parent_class parent_class +G_DEFINE_TYPE (GstZBar, gst_zbar, GST_TYPE_VIDEO_FILTER); static void gst_zbar_class_init (GstZBarClass * g_class) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstBaseTransformClass *trans_class; + GstVideoFilterClass *vfilter_class; gobject_class = G_OBJECT_CLASS (g_class); + gstelement_class = GST_ELEMENT_CLASS (g_class); trans_class = GST_BASE_TRANSFORM_CLASS (g_class); + vfilter_class = GST_VIDEO_FILTER_CLASS (g_class); gobject_class->set_property = gst_zbar_set_property; gobject_class->get_property = gst_zbar_get_property; @@ -176,14 +163,25 @@ gst_zbar_class_init (GstZBarClass * g_class) G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | G_PARAM_STATIC_STRINGS)); - trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_zbar_set_caps); - trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_zbar_transform_ip); + gst_element_class_set_details_simple (gstelement_class, "Barcode detector", + "Filter/Analyzer/Video", + "Detect bar codes in the video streams", + "Stefan Kost <ensonic@users.sf.net>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_zbar_sink_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_zbar_src_template)); + trans_class->start = GST_DEBUG_FUNCPTR (gst_zbar_start); trans_class->stop = GST_DEBUG_FUNCPTR (gst_zbar_stop); + + vfilter_class->transform_frame_ip = + GST_DEBUG_FUNCPTR (gst_zbar_transform_frame_ip); } static void -gst_zbar_init (GstZBar * zbar, GstZBarClass * g_class) +gst_zbar_init (GstZBar * zbar) { zbar->cache = DEFAULT_CACHE; zbar->message = DEFAULT_MESSAGE; @@ -245,56 +243,30 @@ gst_zbar_get_property (GObject * object, guint prop_id, GValue * value, } } -static gboolean -gst_zbar_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) -{ - GstZBar *zbar = GST_ZBAR (base); - GstStructure *structure; - gboolean res; - guint32 fourcc; - gint width, height; - - GST_DEBUG_OBJECT (zbar, - "set_caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); - - structure = gst_caps_get_structure (incaps, 0); - - res = gst_structure_get_int (structure, "width", &width); - res &= gst_structure_get_int (structure, "height", &height); - res &= gst_structure_get_fourcc (structure, "format", &fourcc); - - if (res) { - zbar->width = width; - zbar->height = height; - zbar->format = gst_video_format_from_fourcc (fourcc); - } - - return res; -} - static GstFlowReturn -gst_zbar_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) +gst_zbar_transform_frame_ip (GstVideoFilter * vfilter, GstVideoFrame * frame) { - GstZBar *zbar = GST_ZBAR (base); - guint8 *data; - guint rowstride; + GstZBar *zbar = GST_ZBAR (vfilter); + gpointer data; + gint stride, height; zbar_image_t *image; const zbar_symbol_t *symbol; int n; - if (base->passthrough) + if (GST_BASE_TRANSFORM (vfilter)->passthrough) goto done; - data = GST_BUFFER_DATA (outbuf); - image = zbar_image_create (); /* all formats we support start with an 8-bit Y plane. zbar doesn't need * to know about the chroma plane(s) */ + data = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + height = GST_VIDEO_FRAME_HEIGHT (frame); + zbar_image_set_format (image, GST_MAKE_FOURCC ('Y', '8', '0', '0')); - rowstride = gst_video_format_get_row_stride (zbar->format, 0, zbar->width); - zbar_image_set_size (image, rowstride, zbar->height); - zbar_image_set_data (image, (gpointer) data, rowstride * zbar->height, NULL); + zbar_image_set_size (image, stride, height); + zbar_image_set_data (image, (gpointer) data, stride * height, NULL); /* scan the image for barcodes */ n = zbar_scan_image (zbar->scanner, image); @@ -320,7 +292,7 @@ gst_zbar_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) /* post a message */ s = gst_structure_new ("barcode", - "timestamp", G_TYPE_UINT64, GST_BUFFER_TIMESTAMP (outbuf), + "timestamp", G_TYPE_UINT64, GST_BUFFER_TIMESTAMP (frame->buffer), "type", G_TYPE_STRING, zbar_get_symbol_name (typ), "symbol", G_TYPE_STRING, data, "quality", G_TYPE_INT, quality, NULL); m = gst_message_new_element (GST_OBJECT (zbar), s); @@ -335,8 +307,6 @@ out: done: return GST_FLOW_OK; - -/* ERRORS */ } static gboolean @@ -344,10 +314,6 @@ gst_zbar_start (GstBaseTransform * base) { GstZBar *zbar = GST_ZBAR (base); - zbar->width = 0; - zbar->height = 0; - zbar->format = GST_VIDEO_FORMAT_UNKNOWN; - /* start the cache if enabled (e.g. for filtering dupes) */ zbar_image_scanner_enable_cache (zbar->scanner, zbar->cache); diff --git a/ext/zbar/gstzbar.h b/ext/zbar/gstzbar.h index b73c8b67e..f81583ae1 100644 --- a/ext/zbar/gstzbar.h +++ b/ext/zbar/gstzbar.h @@ -21,8 +21,8 @@ #ifndef __GST_VIDEO_ZBAR_H__ #define __GST_VIDEO_ZBAR_H__ -#include <gst/video/gstvideofilter.h> #include <gst/video/video.h> +#include <gst/video/gstvideofilter.h> #include <zbar.h> G_BEGIN_DECLS @@ -51,16 +51,10 @@ struct _GstZBar /*< private >*/ GstVideoFilter videofilter; - /* format */ - gint width; - gint height; - - GstVideoFormat format; - /* properties */ gboolean message; gboolean cache; - + /* internals */ zbar_image_scanner_t *scanner; }; diff --git a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c index 09995b823..98213c9ba 100644 --- a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c +++ b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c @@ -84,7 +84,8 @@ static guint basecamerasrc_signals[LAST_SIGNAL]; GST_DEBUG_CATEGORY (base_camera_src_debug); #define GST_CAT_DEFAULT base_camera_src_debug -GST_BOILERPLATE (GstBaseCameraSrc, gst_base_camera_src, GstBin, GST_TYPE_BIN); +#define parent_class gst_base_camera_src_parent_class +G_DEFINE_TYPE (GstBaseCameraSrc, gst_base_camera_src, GST_TYPE_BIN); static GstStaticPadTemplate vfsrc_template = GST_STATIC_PAD_TEMPLATE (GST_BASE_CAMERA_SRC_VIEWFINDER_PAD_NAME, @@ -429,32 +430,14 @@ gst_base_camera_src_change_state (GstElement * element, } static void -gst_base_camera_src_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - GST_DEBUG_CATEGORY_INIT (base_camera_src_debug, "base_camera_src", 0, - "Base camera src"); - - gst_element_class_set_details_simple (gstelement_class, - "Base class for camerabin src bin", "Source/Video", - "Abstracts capture device for camerabin2", "Rob Clark <rob@ti.com>"); - - gst_element_class_add_static_pad_template (gstelement_class, &vfsrc_template); - - gst_element_class_add_static_pad_template (gstelement_class, - &imgsrc_template); - - gst_element_class_add_static_pad_template (gstelement_class, - &vidsrc_template); -} - -static void gst_base_camera_src_class_init (GstBaseCameraSrcClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; + GST_DEBUG_CATEGORY_INIT (base_camera_src_debug, "base_camera_src", 0, + "Base camera src"); + gobject_class = G_OBJECT_CLASS (klass); gstelement_class = GST_ELEMENT_CLASS (klass); @@ -534,11 +517,23 @@ gst_base_camera_src_class_init (GstBaseCameraSrcClass * klass) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gstelement_class->change_state = gst_base_camera_src_change_state; + + gst_element_class_set_details_simple (gstelement_class, + "Base class for camerabin src bin", "Source/Video", + "Abstracts capture device for camerabin2", "Rob Clark <rob@ti.com>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&vfsrc_template)); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&imgsrc_template)); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&vidsrc_template)); } static void -gst_base_camera_src_init (GstBaseCameraSrc * self, - GstBaseCameraSrcClass * klass) +gst_base_camera_src_init (GstBaseCameraSrc * self) { self->width = DEFAULT_WIDTH; self->height = DEFAULT_HEIGHT; diff --git a/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c b/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c index 4273c7109..41d11e158 100644 --- a/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c +++ b/gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c @@ -79,20 +79,20 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer user_data) } static GstFlowReturn -gst_camerabin_preview_pipeline_new_buffer (GstAppSink * appsink, +gst_camerabin_preview_pipeline_new_sample (GstAppSink * appsink, gpointer user_data) { - GstBuffer *buffer; + GstSample *sample; GstStructure *s; GstMessage *msg; GstCameraBinPreviewPipelineData *data; data = user_data; - buffer = gst_app_sink_pull_buffer (appsink); + sample = gst_app_sink_pull_sample (appsink); s = gst_structure_new (GST_BASE_CAMERA_SRC_PREVIEW_MESSAGE_NAME, - "buffer", GST_TYPE_BUFFER, buffer, NULL); - gst_buffer_unref (buffer); + "sample", GST_TYPE_SAMPLE, sample, NULL); + gst_sample_unref (sample); msg = gst_message_new_element (GST_OBJECT (data->element), s); GST_DEBUG_OBJECT (data->element, "sending message with preview image"); @@ -181,7 +181,7 @@ gst_camerabin_create_preview_pipeline (GstElement * element, goto error; } - callbacks.new_buffer = gst_camerabin_preview_pipeline_new_buffer; + callbacks.new_sample = gst_camerabin_preview_pipeline_new_sample; gst_app_sink_set_callbacks ((GstAppSink *) data->appsink, &callbacks, data, NULL); diff --git a/gst-libs/gst/interfaces/photography.c b/gst-libs/gst/interfaces/photography.c index 878b185eb..11f0e71d8 100644 --- a/gst-libs/gst/interfaces/photography.c +++ b/gst-libs/gst/interfaces/photography.c @@ -62,8 +62,6 @@ gst_photography_get_type (void) gst_photography_type = g_type_register_static (G_TYPE_INTERFACE, "GstPhotography", &gst_photography_info, 0); - g_type_interface_add_prerequisite (gst_photography_type, - GST_TYPE_IMPLEMENTS_INTERFACE); } return gst_photography_type; @@ -112,7 +110,7 @@ gst_photography_set_ ## function_name (GstPhotography * photo, param_type param) { \ GstPhotographyInterface *iface; \ g_return_val_if_fail (photo != NULL, FALSE); \ - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); \ + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); \ if (iface->set_ ## function_name) { \ return iface->set_ ## function_name (photo, param); \ } \ @@ -123,7 +121,7 @@ gst_photography_get_ ## function_name (GstPhotography * photo, param_type * para { \ GstPhotographyInterface *iface; \ g_return_val_if_fail (photo != NULL, FALSE); \ - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); \ + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); \ if (iface->get_ ## function_name) { \ return iface->get_ ## function_name (photo, param); \ } \ @@ -391,7 +389,7 @@ gst_photography_get_capabilities (GstPhotography * photo) GstPhotographyInterface *iface; g_return_val_if_fail (photo != NULL, GST_PHOTOGRAPHY_CAPS_NONE); - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); if (iface->get_capabilities) { return iface->get_capabilities (photo); } else { @@ -420,7 +418,7 @@ gst_photography_prepare_for_capture (GstPhotography * photo, g_return_val_if_fail (photo != NULL, FALSE); - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); if (iface->prepare_for_capture) { ret = iface->prepare_for_capture (photo, func, capture_caps, user_data); } @@ -442,7 +440,7 @@ gst_photography_set_autofocus (GstPhotography * photo, gboolean on) GstPhotographyInterface *iface; g_return_if_fail (photo != NULL); - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); if (iface->set_autofocus) { iface->set_autofocus (photo, on); } @@ -465,7 +463,7 @@ gst_photography_set_config (GstPhotography * photo, GstPhotoSettings * config) g_return_val_if_fail (photo != NULL, FALSE); - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); if (iface->set_config) { ret = iface->set_config (photo, config); } @@ -490,7 +488,7 @@ gst_photography_get_config (GstPhotography * photo, GstPhotoSettings * config) g_return_val_if_fail (photo != NULL, FALSE); - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); + iface = GST_PHOTOGRAPHY_GET_INTERFACE (photo); if (iface->get_config) { ret = iface->get_config (photo, config); } diff --git a/gst-libs/gst/interfaces/photography.h b/gst-libs/gst/interfaces/photography.h index 4852ea3e1..21a4a5086 100644 --- a/gst-libs/gst/interfaces/photography.h +++ b/gst-libs/gst/interfaces/photography.h @@ -37,10 +37,10 @@ G_BEGIN_DECLS #define GST_TYPE_PHOTOGRAPHY \ (gst_photography_get_type ()) #define GST_PHOTOGRAPHY(obj) \ - (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PHOTOGRAPHY, GstPhotography)) + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PHOTOGRAPHY, GstPhotography)) #define GST_IS_PHOTOGRAPHY(obj) \ - (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PHOTOGRAPHY)) -#define GST_PHOTOGRAPHY_GET_IFACE(inst) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PHOTOGRAPHY)) +#define GST_PHOTOGRAPHY_GET_INTERFACE(inst) \ (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PHOTOGRAPHY, GstPhotographyInterface)) diff --git a/gst-libs/gst/signalprocessor/Makefile.am b/gst-libs/gst/signalprocessor/Makefile.am index f7e5f6520..9172685fb 100644 --- a/gst-libs/gst/signalprocessor/Makefile.am +++ b/gst-libs/gst/signalprocessor/Makefile.am @@ -7,10 +7,10 @@ libgstsignalprocessor_@GST_MAJORMINOR@_la_SOURCES = gstsignalprocessor.c libgstsignalprocessor_@GST_MAJORMINOR@_la_CFLAGS = \ $(GST_PLUGINS_BAD_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) + $(GST_CFLAGS) libgstsignalprocessor_@GST_MAJORMINOR@_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ - $(GST_CONTROLLER_LIBS) $(GST_LIBS) + $(GST_LIBS) libgstsignalprocessor_@GST_MAJORMINOR@_la_LDFLAGS = \ $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS) diff --git a/gst-libs/gst/signalprocessor/gstsignalprocessor.c b/gst-libs/gst/signalprocessor/gstsignalprocessor.c index 7b7826a43..472075fd7 100644 --- a/gst-libs/gst/signalprocessor/gstsignalprocessor.c +++ b/gst-libs/gst/signalprocessor/gstsignalprocessor.c @@ -44,7 +44,6 @@ #include <stdlib.h> #include <string.h> -#include <gst/controller/gstcontroller.h> #include <gst/audio/audio.h> #include "gstsignalprocessor.h" @@ -121,7 +120,6 @@ gst_signal_processor_class_add_pad_template (GstSignalProcessorClass * klass, GST_SIGNAL_PROCESSOR_PAD_TEMPLATE (new)->channels = channels; gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass), new); - g_object_unref (new); } @@ -166,40 +164,56 @@ gst_signal_processor_pad_get_type (void) return type; } -static void -_do_init (GType object_type) -{ - GST_DEBUG_CATEGORY_INIT (gst_signal_processor_debug, "signalprocessor", 0, - "signalprocessor baseclass"); -} +static GstElementClass *parent_class = NULL; + +static void gst_signal_processor_class_init (GstSignalProcessorClass * klass); +static void gst_signal_processor_init (GstSignalProcessor * self, + GstSignalProcessorClass * klass); -GST_BOILERPLATE_FULL (GstSignalProcessor, gst_signal_processor, GstElement, - GST_TYPE_ELEMENT, _do_init); +GType +gst_signal_processor_get_type (void) +{ + static volatile gsize signal_processor_type = 0; + + if (g_once_init_enter (&signal_processor_type)) { + GType _type; + static const GTypeInfo signal_processor_info = { + sizeof (GstSignalProcessorClass), + NULL, + NULL, + (GClassInitFunc) gst_signal_processor_class_init, + NULL, + NULL, + sizeof (GstSignalProcessor), + 0, + (GInstanceInitFunc) gst_signal_processor_init, + }; + _type = g_type_register_static (GST_TYPE_ELEMENT, + "GstSignalProcessor", &signal_processor_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (&signal_processor_type, _type); + } + return signal_processor_type; +} static void gst_signal_processor_finalize (GObject * object); -static gboolean gst_signal_processor_src_activate_pull (GstPad * pad, - gboolean active); -static gboolean gst_signal_processor_sink_activate_push (GstPad * pad, - gboolean active); +static gboolean gst_signal_processor_src_activate_mode (GstPad * pad, + GstObject * parent, GstPadMode mode, gboolean active); +static gboolean gst_signal_processor_sink_activate_mode (GstPad * pad, + GstObject * parent, GstPadMode mode, gboolean active); static GstStateChangeReturn gst_signal_processor_change_state (GstElement * element, GstStateChange transition); -static gboolean gst_signal_processor_event (GstPad * pad, GstEvent * event); +static gboolean gst_signal_processor_event (GstPad * pad, GstObject * parent, + GstEvent * event); static GstFlowReturn gst_signal_processor_getrange (GstPad * pad, - guint64 offset, guint length, GstBuffer ** buffer); + GstObject * parent, guint64 offset, guint length, GstBuffer ** buffer); static GstFlowReturn gst_signal_processor_chain (GstPad * pad, - GstBuffer * buffer); + GstObject * parent, GstBuffer * buffer); static gboolean gst_signal_processor_setcaps (GstPad * pad, GstCaps * caps); static void -gst_signal_processor_base_init (gpointer g_class) -{ - /* NOP */ -} - -static void gst_signal_processor_class_init (GstSignalProcessorClass * klass) { GObjectClass *gobject_class; @@ -208,6 +222,8 @@ gst_signal_processor_class_init (GstSignalProcessorClass * klass) gobject_class = G_OBJECT_CLASS (klass); gstelement_class = GST_ELEMENT_CLASS (klass); + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_signal_processor_finalize); gstelement_class->change_state = @@ -216,9 +232,12 @@ gst_signal_processor_class_init (GstSignalProcessorClass * klass) GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_setcaps); GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_event); GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_chain); - GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_sink_activate_push); + GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_sink_activate_mode); GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_getrange); - GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_src_activate_pull); + GST_DEBUG_REGISTER_FUNCPTR (gst_signal_processor_src_activate_mode); + + GST_DEBUG_CATEGORY_INIT (gst_signal_processor_debug, "signalprocessor", 0, + "signalprocessor baseclass"); } static void @@ -235,21 +254,19 @@ gst_signal_processor_add_pad_from_template (GstSignalProcessor * self, GST_SIGNAL_PROCESSOR_PAD (pad)->channels = GST_SIGNAL_PROCESSOR_PAD_TEMPLATE (templ)->channels; - gst_pad_set_setcaps_function (pad, gst_signal_processor_setcaps); - if (templ->direction == GST_PAD_SINK) { GST_DEBUG_OBJECT (pad, "added new sink pad"); gst_pad_set_event_function (pad, gst_signal_processor_event); gst_pad_set_chain_function (pad, gst_signal_processor_chain); - gst_pad_set_activatepush_function (pad, - gst_signal_processor_sink_activate_push); + gst_pad_set_activatemode_function (pad, + gst_signal_processor_sink_activate_mode); } else { GST_DEBUG_OBJECT (pad, "added new src pad"); gst_pad_set_getrange_function (pad, gst_signal_processor_getrange); - gst_pad_set_activatepull_function (pad, - gst_signal_processor_src_activate_pull); + gst_pad_set_activatemode_function (pad, + gst_signal_processor_src_activate_mode); } gst_element_add_pad (GST_ELEMENT (self), pad); @@ -471,7 +488,7 @@ gst_signal_processor_setcaps (GstPad * pad, GstCaps * caps) self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); - if (self->mode == GST_ACTIVATE_PULL && !gst_caps_is_equal (caps, self->caps) + if (self->mode == GST_PAD_MODE_PULL && !gst_caps_is_equal (caps, self->caps) && !gst_signal_processor_setcaps_pull (self, pad, caps)) goto setcaps_pull_failed; @@ -566,13 +583,13 @@ gst_signal_processor_interleave_group (GstSignalProcessorGroup * group, } static gboolean -gst_signal_processor_event (GstPad * pad, GstEvent * event) +gst_signal_processor_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstSignalProcessor *self; GstSignalProcessorClass *bclass; gboolean ret; - self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); + self = GST_SIGNAL_PROCESSOR (parent); bclass = GST_SIGNAL_PROCESSOR_GET_CLASS (self); GST_DEBUG_OBJECT (pad, "got event %s", GST_EVENT_TYPE_NAME (event)); @@ -584,18 +601,27 @@ gst_signal_processor_event (GstPad * pad, GstEvent * event) bclass->event (self, event); switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_signal_processor_setcaps (pad, caps); + gst_event_unref (event); + break; + } case GST_EVENT_FLUSH_START: + ret = gst_pad_event_default (pad, parent, event); break; case GST_EVENT_FLUSH_STOP: /* clear errors now */ self->flow_state = GST_FLOW_OK; + ret = gst_pad_event_default (pad, parent, event); break; default: + ret = gst_pad_event_default (pad, parent, event); break; } - ret = gst_pad_event_default (pad, event); - - gst_object_unref (self); return ret; } @@ -694,7 +720,7 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) srcpad = (GstSignalProcessorPad *) srcs->data; if (sinkpad->channels == 1 && sinkpad->channels == srcpad->channels - && GST_BUFFER_SIZE (sinkpad->pen) == + && gst_buffer_get_size (sinkpad->pen) == samples_avail * sizeof (gfloat)) { /* reusable, yay */ g_assert (sinkpad->samples_avail == samples_avail); @@ -715,24 +741,18 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) /* now allocate for any remaining outputs */ while (srcs) { GstSignalProcessorPad *srcpad; - GstFlowReturn ret; srcpad = (GstSignalProcessorPad *) srcs->data; - ret = gst_pad_alloc_buffer_and_set_caps (GST_PAD (srcpad), - GST_CLOCK_TIME_NONE, - samples_avail * srcpad->channels * sizeof (gfloat), self->caps, - &srcpad->pen); + srcpad->pen = + gst_buffer_new_allocate (NULL, + samples_avail * srcpad->channels * sizeof (gfloat), 0); - if (ret != GST_FLOW_OK) { - GST_INFO_OBJECT (self, - "allocating buffer for %u samples, %u channels failed", samples_avail, - srcpad->channels); - self->flow_state = ret; - return 0; - } else if (srcpad->channels > 1) { + if (srcpad->channels > 1) { GstSignalProcessorGroup *group = &self->group_out[out_group_index++]; - group->interleaved_buffer = (gfloat *) GST_BUFFER_DATA (srcpad->pen); + group->interleaved_buffer = + (gfloat *) gst_buffer_map (srcpad->pen, NULL, NULL, + GST_MAP_READWRITE); if (!group->buffer || group->channels < srcpad->channels || group->nframes < samples_avail) group->buffer = @@ -742,7 +762,9 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) group->nframes = samples_avail; self->pending_out++; } else { - self->audio_out[srcpad->index] = (gfloat *) GST_BUFFER_DATA (srcpad->pen); + self->audio_out[srcpad->index] = + (gfloat *) gst_buffer_map (srcpad->pen, NULL, NULL, + GST_MAP_READWRITE); self->pending_out++; } @@ -755,7 +777,7 @@ gst_signal_processor_prepare (GstSignalProcessor * self, guint nframes) /* update controlled parameters */ if (samples_avail && GST_CLOCK_TIME_IS_VALID (ts)) { - gst_object_sync_values ((GObject *) self, ts); + gst_object_sync_values ((GstObject *) self, ts); } return samples_avail; @@ -842,15 +864,16 @@ gst_signal_processor_pen_buffer (GstSignalProcessor * self, GstPad * pad, GstBuffer * buffer) { GstSignalProcessorPad *spad = (GstSignalProcessorPad *) pad; + gsize size; if (spad->pen) goto had_buffer; /* keep the reference */ spad->pen = buffer; - spad->data = (gfloat *) GST_BUFFER_DATA (buffer); - spad->samples_avail = - GST_BUFFER_SIZE (buffer) / sizeof (float) / spad->channels; + spad->data = + (gfloat *) gst_buffer_map (buffer, &size, NULL, GST_MAP_READWRITE); + spad->samples_avail = size / sizeof (float) / spad->channels; g_assert (self->pending_in != 0); @@ -883,6 +906,7 @@ gst_signal_processor_flush (GstSignalProcessor * self) GstSignalProcessorPad *spad = (GstSignalProcessorPad *) pads->data; if (spad->pen) { + gst_buffer_unmap (spad->pen, spad->data, -1); gst_buffer_unref (spad->pen); spad->pen = NULL; spad->data = NULL; @@ -941,14 +965,14 @@ gst_signal_processor_do_pulls (GstSignalProcessor * self, guint nframes) } static GstFlowReturn -gst_signal_processor_getrange (GstPad * pad, guint64 offset, +gst_signal_processor_getrange (GstPad * pad, GstObject * parent, guint64 offset, guint length, GstBuffer ** buffer) { GstSignalProcessor *self; GstSignalProcessorPad *spad = (GstSignalProcessorPad *) pad; GstFlowReturn ret = GST_FLOW_ERROR; - self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); + self = GST_SIGNAL_PROCESSOR (parent); if (spad->pen) { *buffer = spad->pen; @@ -972,8 +996,6 @@ gst_signal_processor_getrange (GstPad * pad, guint64 offset, GST_DEBUG_OBJECT (self, "returns %s", gst_flow_get_name (ret)); - gst_object_unref (self); - return ret; } @@ -1020,11 +1042,12 @@ gst_signal_processor_do_pushes (GstSignalProcessor * self) } static GstFlowReturn -gst_signal_processor_chain (GstPad * pad, GstBuffer * buffer) +gst_signal_processor_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer) { GstSignalProcessor *self; - self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); + self = GST_SIGNAL_PROCESSOR (parent); GST_LOG_OBJECT (self, "chain(%s:%s, %p) : p_in=%u, p_out=%u", GST_DEBUG_PAD_NAME (pad), buffer, self->pending_in, self->pending_out); @@ -1036,91 +1059,103 @@ gst_signal_processor_chain (GstPad * pad, GstBuffer * buffer) gst_signal_processor_do_pushes (self); } - gst_object_unref (self); - return self->flow_state; } static gboolean -gst_signal_processor_sink_activate_push (GstPad * pad, gboolean active) +gst_signal_processor_sink_activate_mode (GstPad * pad, GstObject * parent, + GstPadMode mode, gboolean active) { - gboolean result = TRUE; + gboolean result; GstSignalProcessor *self; - self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); - - if (active) { - if (self->mode == GST_ACTIVATE_NONE) { - self->mode = GST_ACTIVATE_PUSH; - result = TRUE; - } else if (self->mode == GST_ACTIVATE_PUSH) { - result = TRUE; - } else { - g_warning ("foo"); - result = FALSE; - } - } else { - if (self->mode == GST_ACTIVATE_NONE) { - result = TRUE; - } else if (self->mode == GST_ACTIVATE_PUSH) { - self->mode = GST_ACTIVATE_NONE; - result = TRUE; - } else { - g_warning ("foo"); + self = GST_SIGNAL_PROCESSOR (parent); + + switch (mode) { + case GST_PAD_MODE_PUSH: + if (active) { + if (self->mode == GST_PAD_MODE_NONE) { + self->mode = GST_PAD_MODE_PUSH; + result = TRUE; + } else if (self->mode == GST_PAD_MODE_PUSH) { + result = TRUE; + } else { + g_warning ("foo"); + result = FALSE; + } + } else { + if (self->mode == GST_PAD_MODE_NONE) { + result = TRUE; + } else if (self->mode == GST_PAD_MODE_PUSH) { + self->mode = GST_PAD_MODE_NONE; + result = TRUE; + } else { + g_warning ("foo"); + result = FALSE; + } + } + break; + default: result = FALSE; - } + break; } GST_DEBUG_OBJECT (self, "result : %d", result); - gst_object_unref (self); - return result; } static gboolean -gst_signal_processor_src_activate_pull (GstPad * pad, gboolean active) +gst_signal_processor_src_activate_mode (GstPad * pad, GstObject * parent, + GstPadMode mode, gboolean active) { - gboolean result = TRUE; + gboolean result; GstSignalProcessor *self; - self = GST_SIGNAL_PROCESSOR (gst_pad_get_parent (pad)); - - if (active) { - if (self->mode == GST_ACTIVATE_NONE) { - GList *l; - - for (l = GST_ELEMENT (self)->sinkpads; l; l = l->next) - result &= gst_pad_activate_pull (pad, active); - if (result) - self->mode = GST_ACTIVATE_PULL; - } else if (self->mode == GST_ACTIVATE_PULL) { - result = TRUE; - } else { - g_warning ("foo"); - result = FALSE; - } - } else { - if (self->mode == GST_ACTIVATE_NONE) { - result = TRUE; - } else if (self->mode == GST_ACTIVATE_PULL) { - GList *l; - - for (l = GST_ELEMENT (self)->sinkpads; l; l = l->next) - result &= gst_pad_activate_pull (pad, active); - if (result) - self->mode = GST_ACTIVATE_NONE; - result = TRUE; - } else { - g_warning ("foo"); + self = GST_SIGNAL_PROCESSOR (parent); + + switch (mode) { + case GST_PAD_MODE_PUSH: + if (active) { + if (self->mode == GST_PAD_MODE_NONE) { + GList *l; + + result = TRUE; + for (l = GST_ELEMENT (self)->sinkpads; l; l = l->next) + result &= gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, active); + if (result) + self->mode = GST_PAD_MODE_PULL; + } else if (self->mode == GST_PAD_MODE_PULL) { + result = TRUE; + } else { + g_warning ("foo"); + result = FALSE; + } + } else { + if (self->mode == GST_PAD_MODE_NONE) { + result = TRUE; + } else if (self->mode == GST_PAD_MODE_PULL) { + GList *l; + + result = TRUE; + for (l = GST_ELEMENT (self)->sinkpads; l; l = l->next) + result &= gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, active); + if (result) + self->mode = GST_PAD_MODE_NONE; + result = TRUE; + } else { + g_warning ("foo"); + result = FALSE; + } + } + break; + default: result = FALSE; - } + break; } GST_DEBUG_OBJECT (self, "result : %d", result); - gst_object_unref (self); - return result; } diff --git a/gst-libs/gst/signalprocessor/gstsignalprocessor.h b/gst-libs/gst/signalprocessor/gstsignalprocessor.h index 4d512e146..b32c94435 100644 --- a/gst-libs/gst/signalprocessor/gstsignalprocessor.h +++ b/gst-libs/gst/signalprocessor/gstsignalprocessor.h @@ -82,7 +82,7 @@ struct _GstSignalProcessor { GstCaps *caps; GstSignalProcessorState state; GstFlowReturn flow_state; - GstActivateMode mode; + GstPadMode mode; /* pending inputs before processing can take place */ guint pending_in; diff --git a/gst-libs/gst/video/Makefile.am b/gst-libs/gst/video/Makefile.am index 7ce58a3c7..56f2572b3 100644 --- a/gst-libs/gst/video/Makefile.am +++ b/gst-libs/gst/video/Makefile.am @@ -8,7 +8,7 @@ libgstbasevideo_@GST_MAJORMINOR@_la_SOURCES = \ gstbasevideoutils.c \ gstbasevideodecoder.c \ gstbasevideoencoder.c \ - gstsurfacebuffer.c \ + gstsurfacemeta.c \ gstsurfaceconverter.c \ videocontext.c @@ -18,7 +18,7 @@ libgstbasevideo_@GST_MAJORMINOR@include_HEADERS = \ gstbasevideoutils.h \ gstbasevideodecoder.h \ gstbasevideoencoder.h \ - gstsurfacebuffer.h \ + gstsurfacemeta.h \ gstsurfaceconverter.h \ videocontext.h diff --git a/gst-libs/gst/video/gstbasevideocodec.c b/gst-libs/gst/video/gstbasevideocodec.c index a1dc91db4..816e62e35 100644 --- a/gst-libs/gst/video/gstbasevideocodec.c +++ b/gst-libs/gst/video/gstbasevideocodec.c @@ -45,31 +45,44 @@ static void gst_base_video_codec_finalize (GObject * object); static GstStateChangeReturn gst_base_video_codec_change_state (GstElement * element, GstStateChange transition); -GType -gst_video_frame_get_type (void) -{ - static volatile gsize type = 0; +static GstElementClass *parent_class = NULL; - if (g_once_init_enter (&type)) { - GType _type; +G_DEFINE_BOXED_TYPE (GstVideoFrameState, gst_video_frame_state, + (GBoxedCopyFunc) gst_video_frame_state_ref, + (GBoxedFreeFunc) gst_video_frame_state_unref); - _type = g_boxed_type_register_static ("GstVideoFrame", - (GBoxedCopyFunc) gst_video_frame_ref, - (GBoxedFreeFunc) gst_video_frame_unref); - g_once_init_leave (&type, _type); - } - return (GType) type; -} - -GST_BOILERPLATE (GstBaseVideoCodec, gst_base_video_codec, GstElement, - GST_TYPE_ELEMENT); +/* NOTE (Edward): Do not use G_DEFINE_* because we need to have + * a GClassInitFunc called with the target class (which the macros + * don't handle). + */ +static void gst_base_video_codec_class_init (GstBaseVideoCodecClass * klass); +static void gst_base_video_codec_init (GstBaseVideoCodec * dec, + GstBaseVideoCodecClass * klass); -static void -gst_base_video_codec_base_init (gpointer g_class) +GType +gst_base_video_codec_get_type (void) { - GST_DEBUG_CATEGORY_INIT (basevideocodec_debug, "basevideocodec", 0, - "Base Video Codec"); + static volatile gsize base_video_codec_type = 0; + if (g_once_init_enter (&base_video_codec_type)) { + GType _type; + static const GTypeInfo base_video_codec_info = { + sizeof (GstBaseVideoCodecClass), + NULL, + NULL, + (GClassInitFunc) gst_base_video_codec_class_init, + NULL, + NULL, + sizeof (GstBaseVideoCodec), + 0, + (GInstanceInitFunc) gst_base_video_codec_init, + }; + + _type = g_type_register_static (GST_TYPE_ELEMENT, + "GstBaseVideoCodec", &base_video_codec_info, G_TYPE_FLAG_ABSTRACT); + g_once_init_leave (&base_video_codec_type, _type); + } + return base_video_codec_type; } static void @@ -81,9 +94,14 @@ gst_base_video_codec_class_init (GstBaseVideoCodecClass * klass) gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = gst_base_video_codec_finalize; element_class->change_state = gst_base_video_codec_change_state; + + GST_DEBUG_CATEGORY_INIT (basevideocodec_debug, "basevideocodec", 0, + "Base Video Codec"); } static void @@ -124,7 +142,7 @@ gst_base_video_codec_reset (GstBaseVideoCodec * base_video_codec) GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_codec); for (g = base_video_codec->frames; g; g = g_list_next (g)) { - gst_video_frame_unref ((GstVideoFrame *) g->data); + gst_video_frame_state_unref ((GstVideoFrameState *) g->data); } g_list_free (base_video_codec->frames); base_video_codec->frames = NULL; @@ -183,31 +201,38 @@ gst_base_video_codec_change_state (GstElement * element, return ret; } -GstVideoFrame * -gst_base_video_codec_new_frame (GstBaseVideoCodec * base_video_codec) +void +gst_base_video_codec_append_frame (GstBaseVideoCodec * codec, + GstVideoFrameState * frame) { - GstVideoFrame *frame; - - frame = g_slice_new0 (GstVideoFrame); + g_return_if_fail (frame != NULL); - frame->ref_count = 1; + gst_video_frame_state_ref (frame); + codec->frames = g_list_append (codec->frames, frame); +} - GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_codec); - frame->system_frame_number = base_video_codec->system_frame_number; - base_video_codec->system_frame_number++; - GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_codec); +void +gst_base_video_codec_remove_frame (GstBaseVideoCodec * codec, + GstVideoFrameState * frame) +{ + GList *link; - GST_LOG_OBJECT (base_video_codec, "Created new frame %p (sfn:%d)", - frame, frame->system_frame_number); + g_return_if_fail (frame != NULL); - return frame; + link = g_list_find (codec->frames, frame); + if (link) { + gst_video_frame_state_unref ((GstVideoFrameState *) link->data); + codec->frames = g_list_delete_link (codec->frames, link); + } } static void -_gst_video_frame_free (GstVideoFrame * frame) +_gst_video_frame_state_free (GstVideoFrameState * frame) { g_return_if_fail (frame != NULL); + GST_LOG ("Freeing frame %p (sfn:%d)", frame, frame->system_frame_number); + if (frame->sink_buffer) { gst_buffer_unref (frame->sink_buffer); } @@ -222,11 +247,31 @@ _gst_video_frame_free (GstVideoFrame * frame) if (frame->coder_hook_destroy_notify && frame->coder_hook) frame->coder_hook_destroy_notify (frame->coder_hook); - g_slice_free (GstVideoFrame, frame); + g_slice_free (GstVideoFrameState, frame); +} + +GstVideoFrameState * +gst_base_video_codec_new_frame (GstBaseVideoCodec * base_video_codec) +{ + GstVideoFrameState *frame; + + frame = g_slice_new0 (GstVideoFrameState); + + frame->ref_count = 1; + + GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_codec); + frame->system_frame_number = base_video_codec->system_frame_number; + base_video_codec->system_frame_number++; + GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_codec); + + GST_LOG_OBJECT (base_video_codec, "Created new frame %p (sfn:%d)", + frame, frame->system_frame_number); + + return frame; } -GstVideoFrame * -gst_video_frame_ref (GstVideoFrame * frame) +GstVideoFrameState * +gst_video_frame_state_ref (GstVideoFrameState * frame) { g_return_val_if_fail (frame != NULL, NULL); @@ -236,12 +281,12 @@ gst_video_frame_ref (GstVideoFrame * frame) } void -gst_video_frame_unref (GstVideoFrame * frame) +gst_video_frame_state_unref (GstVideoFrameState * frame) { g_return_if_fail (frame != NULL); g_return_if_fail (frame->ref_count > 0); if (g_atomic_int_dec_and_test (&frame->ref_count)) { - _gst_video_frame_free (frame); + _gst_video_frame_state_free (frame); } } diff --git a/gst-libs/gst/video/gstbasevideocodec.h b/gst-libs/gst/video/gstbasevideocodec.h index 41c2282a6..fb4ee7fec 100644 --- a/gst-libs/gst/video/gstbasevideocodec.h +++ b/gst-libs/gst/video/gstbasevideocodec.h @@ -28,6 +28,8 @@ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/video/video.h> +#include <gst/video/gstvideopool.h> +#include <gst/video/gstvideometa.h> G_BEGIN_DECLS @@ -83,7 +85,7 @@ G_BEGIN_DECLS #define GST_BASE_VIDEO_CODEC_STREAM_UNLOCK(codec) g_static_rec_mutex_unlock (&GST_BASE_VIDEO_CODEC (codec)->stream_lock) typedef struct _GstVideoState GstVideoState; -typedef struct _GstVideoFrame GstVideoFrame; +typedef struct _GstVideoFrameState GstVideoFrameState; typedef struct _GstBaseVideoCodec GstBaseVideoCodec; typedef struct _GstBaseVideoCodecClass GstBaseVideoCodecClass; @@ -108,7 +110,7 @@ struct _GstVideoState }; -struct _GstVideoFrame +struct _GstVideoFrameState { gint ref_count; @@ -159,7 +161,8 @@ struct _GstBaseVideoCodec guint64 system_frame_number; GList *frames; /* Protected with OBJECT_LOCK */ - GstVideoState state; + GstVideoState state; /* Compressed video pad */ + GstVideoInfo info; /* Raw video pad */ GstSegment segment; gdouble proportion; @@ -181,13 +184,16 @@ struct _GstBaseVideoCodecClass void *padding[GST_PADDING_LARGE]; }; -GType gst_video_frame_get_type (void); +GType gst_video_frame_state_get_type (void); GType gst_base_video_codec_get_type (void); -GstVideoFrame * gst_base_video_codec_new_frame (GstBaseVideoCodec *base_video_codec); +void gst_base_video_codec_append_frame (GstBaseVideoCodec *codec, GstVideoFrameState *frame); +void gst_base_video_codec_remove_frame (GstBaseVideoCodec *codec, GstVideoFrameState *frame); -GstVideoFrame * gst_video_frame_ref (GstVideoFrame * frame); -void gst_video_frame_unref (GstVideoFrame * frame); +GstVideoFrameState * gst_base_video_codec_new_frame (GstBaseVideoCodec *base_video_codec); + +GstVideoFrameState * gst_video_frame_state_ref (GstVideoFrameState * frame); +void gst_video_frame_state_unref (GstVideoFrameState * frame); G_END_DECLS diff --git a/gst-libs/gst/video/gstbasevideodecoder.c b/gst-libs/gst/video/gstbasevideodecoder.c index 6a5554ea3..5a7519cb6 100644 --- a/gst-libs/gst/video/gstbasevideodecoder.c +++ b/gst-libs/gst/video/gstbasevideodecoder.c @@ -137,22 +137,20 @@ GST_DEBUG_CATEGORY (basevideodecoder_debug); static void gst_base_video_decoder_finalize (GObject * object); -static gboolean gst_base_video_decoder_sink_setcaps (GstPad * pad, +static gboolean gst_base_video_decoder_setcaps (GstBaseVideoDecoder * vdec, GstCaps * caps); static gboolean gst_base_video_decoder_sink_event (GstPad * pad, - GstEvent * event); + GstObject * parent, GstEvent * event); static gboolean gst_base_video_decoder_src_event (GstPad * pad, - GstEvent * event); + GstObject * parent, GstEvent * event); static GstFlowReturn gst_base_video_decoder_chain (GstPad * pad, - GstBuffer * buf); + GstObject * parent, GstBuffer * buf); static gboolean gst_base_video_decoder_sink_query (GstPad * pad, - GstQuery * query); + GstObject * parent, GstQuery * query); static GstStateChangeReturn gst_base_video_decoder_change_state (GstElement * element, GstStateChange transition); -static const GstQueryType *gst_base_video_decoder_get_query_types (GstPad * - pad); static gboolean gst_base_video_decoder_src_query (GstPad * pad, - GstQuery * query); + GstObject * parent, GstQuery * query); static void gst_base_video_decoder_reset (GstBaseVideoDecoder * base_video_decoder, gboolean full); @@ -167,21 +165,14 @@ gst_base_video_decoder_get_field_timestamp (GstBaseVideoDecoder * base_video_decoder, int field_offset); static guint64 gst_base_video_decoder_get_field_duration (GstBaseVideoDecoder * base_video_decoder, int n_fields); -static GstVideoFrame *gst_base_video_decoder_new_frame (GstBaseVideoDecoder * - base_video_decoder); +static GstVideoFrameState *gst_base_video_decoder_new_frame (GstBaseVideoDecoder + * base_video_decoder); static void gst_base_video_decoder_clear_queues (GstBaseVideoDecoder * dec); -GST_BOILERPLATE (GstBaseVideoDecoder, gst_base_video_decoder, - GstBaseVideoCodec, GST_TYPE_BASE_VIDEO_CODEC); - -static void -gst_base_video_decoder_base_init (gpointer g_class) -{ - GST_DEBUG_CATEGORY_INIT (basevideodecoder_debug, "basevideodecoder", 0, - "Base Video Decoder"); - -} +#define gst_base_video_decoder_parent_class parent_class +G_DEFINE_TYPE (GstBaseVideoDecoder, gst_base_video_decoder, + GST_TYPE_BASE_VIDEO_CODEC); static void gst_base_video_decoder_class_init (GstBaseVideoDecoderClass * klass) @@ -196,11 +187,13 @@ gst_base_video_decoder_class_init (GstBaseVideoDecoderClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_base_video_decoder_change_state); + + GST_DEBUG_CATEGORY_INIT (basevideodecoder_debug, "basevideodecoder", 0, + "Base Video Decoder"); } static void -gst_base_video_decoder_init (GstBaseVideoDecoder * base_video_decoder, - GstBaseVideoDecoderClass * klass) +gst_base_video_decoder_init (GstBaseVideoDecoder * base_video_decoder) { GstPad *pad; @@ -212,8 +205,6 @@ gst_base_video_decoder_init (GstBaseVideoDecoder * base_video_decoder, GST_DEBUG_FUNCPTR (gst_base_video_decoder_chain)); gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_decoder_sink_event)); - gst_pad_set_setcaps_function (pad, - GST_DEBUG_FUNCPTR (gst_base_video_decoder_sink_setcaps)); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_decoder_sink_query)); @@ -221,8 +212,6 @@ gst_base_video_decoder_init (GstBaseVideoDecoder * base_video_decoder, gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_decoder_src_event)); - gst_pad_set_query_type_function (pad, - GST_DEBUG_FUNCPTR (gst_base_video_decoder_get_query_types)); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_decoder_src_query)); gst_pad_use_fixed_caps (pad); @@ -264,16 +253,15 @@ gst_base_video_decoder_push_src_event (GstBaseVideoDecoder * decoder, } static gboolean -gst_base_video_decoder_sink_setcaps (GstPad * pad, GstCaps * caps) +gst_base_video_decoder_setcaps (GstBaseVideoDecoder * base_video_decoder, + GstCaps * caps) { - GstBaseVideoDecoder *base_video_decoder; GstBaseVideoDecoderClass *base_video_decoder_class; GstStructure *structure; const GValue *codec_data; GstVideoState state; gboolean ret = TRUE; - base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); base_video_decoder_class = GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder); @@ -287,35 +275,42 @@ gst_base_video_decoder_sink_setcaps (GstPad * pad, GstCaps * caps) structure = gst_caps_get_structure (caps, 0); - gst_video_format_parse_caps (caps, NULL, &state.width, &state.height); - /* this one fails if no framerate in caps */ - if (!gst_video_parse_caps_framerate (caps, &state.fps_n, &state.fps_d)) { + /* FIXME : Add have_{width_height|framerate|par} fields to + * GstVideoState so we can make better decisions + */ + + gst_structure_get_int (structure, "width", &state.width); + gst_structure_get_int (structure, "height", &state.height); + + if (!gst_structure_get_fraction (structure, "framerate", &state.fps_n, + &state.fps_d)) { state.fps_n = 0; state.fps_d = 1; } - /* but the p-a-r sets 1/1 instead, which is not quite informative ... */ - if (!gst_structure_has_field (structure, "pixel-aspect-ratio") || - !gst_video_parse_caps_pixel_aspect_ratio (caps, + + if (!gst_structure_get_fraction (structure, "pixel-aspect-ratio", &state.par_n, &state.par_d)) { state.par_n = 0; state.par_d = 1; } state.have_interlaced = - gst_video_format_parse_caps_interlaced (caps, &state.interlaced); + gst_structure_get_boolean (structure, "interlaced", &state.interlaced); codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data && G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { - state.codec_data = GST_BUFFER (gst_value_dup_mini_object (codec_data)); + state.codec_data = GST_BUFFER (gst_value_get_buffer (codec_data)); + gst_buffer_ref (state.codec_data); } if (base_video_decoder_class->set_format) { + GST_LOG_OBJECT (base_video_decoder, "Calling ::set_format()"); ret = base_video_decoder_class->set_format (base_video_decoder, &state); } if (ret) { - gst_buffer_replace (&GST_BASE_VIDEO_CODEC (base_video_decoder)-> - state.codec_data, NULL); + gst_buffer_replace (&GST_BASE_VIDEO_CODEC (base_video_decoder)->state. + codec_data, NULL); gst_caps_replace (&GST_BASE_VIDEO_CODEC (base_video_decoder)->state.caps, NULL); GST_BASE_VIDEO_CODEC (base_video_decoder)->state = state; @@ -325,7 +320,6 @@ gst_base_video_decoder_sink_setcaps (GstPad * pad, GstCaps * caps) } GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); - g_object_unref (base_video_decoder); return ret; } @@ -348,6 +342,11 @@ gst_base_video_decoder_finalize (GObject * object) base_video_decoder->output_adapter = NULL; } + if (base_video_decoder->pool) { + g_object_unref (base_video_decoder->pool); + base_video_decoder->pool = NULL; + } + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -389,13 +388,14 @@ gst_base_video_decoder_flush (GstBaseVideoDecoder * dec, gboolean hard) } static gboolean -gst_base_video_decoder_sink_event (GstPad * pad, GstEvent * event) +gst_base_video_decoder_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event) { GstBaseVideoDecoder *base_video_decoder; GstBaseVideoDecoderClass *base_video_decoder_class; gboolean ret = FALSE; - base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); + base_video_decoder = GST_BASE_VIDEO_DECODER (parent); base_video_decoder_class = GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder); @@ -404,6 +404,15 @@ gst_base_video_decoder_sink_event (GstPad * pad, GstEvent * event) GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_base_video_decoder_setcaps (base_video_decoder, caps); + gst_event_unref (event); + break; + } case GST_EVENT_EOS: { GstFlowReturn flow_ret; @@ -427,66 +436,52 @@ gst_base_video_decoder_sink_event (GstPad * pad, GstEvent * event) GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); break; } - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - double rate, arate; - GstFormat format; - gint64 start; - gint64 stop; - gint64 pos; + GstSegment seg; GstSegment *segment = &GST_BASE_VIDEO_CODEC (base_video_decoder)->segment; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); - gst_event_parse_new_segment_full (event, &update, &rate, - &arate, &format, &start, &stop, &pos); + gst_event_copy_segment (event, &seg); - if (format == GST_FORMAT_TIME) { + if (seg.format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (base_video_decoder, - "received TIME NEW_SEGMENT %" GST_TIME_FORMAT - " -- %" GST_TIME_FORMAT ", pos %" GST_TIME_FORMAT - ", rate %g, applied_rate %g", - GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (pos), - rate, arate); + "received TIME SEGMENT %" GST_SEGMENT_FORMAT, &seg); } else { GstFormat dformat = GST_FORMAT_TIME; + gint64 start; GST_DEBUG_OBJECT (base_video_decoder, - "received NEW_SEGMENT %" G_GINT64_FORMAT - " -- %" G_GINT64_FORMAT ", time %" G_GINT64_FORMAT - ", rate %g, applied_rate %g", start, stop, pos, rate, arate); + "received SEGMENT %" GST_SEGMENT_FORMAT, &seg); /* handle newsegment as a result from our legacy simple seeking */ /* note that initial 0 should convert to 0 in any case */ if (base_video_decoder->do_byte_time && gst_pad_query_convert (GST_BASE_VIDEO_CODEC_SINK_PAD - (base_video_decoder), GST_FORMAT_BYTES, start, &dformat, + (base_video_decoder), GST_FORMAT_BYTES, seg.start, dformat, &start)) { /* best attempt convert */ /* as these are only estimates, stop is kept open-ended to avoid * premature cutting */ GST_DEBUG_OBJECT (base_video_decoder, "converted to TIME start %" GST_TIME_FORMAT, - GST_TIME_ARGS (start)); - pos = start; - stop = GST_CLOCK_TIME_NONE; + GST_TIME_ARGS (seg.start)); + seg.start = start; + seg.stop = GST_CLOCK_TIME_NONE; + seg.time = start; /* replace event */ gst_event_unref (event); - event = gst_event_new_new_segment_full (update, rate, arate, - GST_FORMAT_TIME, start, stop, pos); + event = gst_event_new_segment (&seg); } else { GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); goto newseg_wrong_format; } } - if (!update) { - gst_base_video_decoder_flush (base_video_decoder, FALSE); - } + gst_base_video_decoder_flush (base_video_decoder, FALSE); - base_video_decoder->timestamp_offset = start; + base_video_decoder->timestamp_offset = seg.start; - gst_segment_set_newsegment_full (segment, - update, rate, arate, format, start, stop, pos); + *segment = seg; ret = gst_base_video_decoder_push_src_event (base_video_decoder, event); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); @@ -506,7 +501,6 @@ gst_base_video_decoder_sink_event (GstPad * pad, GstEvent * event) } done: - gst_object_unref (base_video_decoder); return ret; newseg_wrong_format: @@ -565,13 +559,12 @@ gst_base_video_decoder_do_seek (GstBaseVideoDecoder * dec, GstEvent * event) } memcpy (&seek_segment, &codec->segment, sizeof (seek_segment)); - gst_segment_set_seek (&seek_segment, rate, format, flags, start_type, + gst_segment_do_seek (&seek_segment, rate, format, flags, start_type, start_time, end_type, end_time, NULL); - start_time = seek_segment.last_stop; + start_time = seek_segment.position; - format = GST_FORMAT_BYTES; if (!gst_pad_query_convert (codec->sinkpad, GST_FORMAT_TIME, start_time, - &format, &start)) { + GST_FORMAT_BYTES, &start)) { GST_DEBUG_OBJECT (dec, "conversion failed"); return FALSE; } @@ -588,12 +581,13 @@ gst_base_video_decoder_do_seek (GstBaseVideoDecoder * dec, GstEvent * event) } static gboolean -gst_base_video_decoder_src_event (GstPad * pad, GstEvent * event) +gst_base_video_decoder_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) { GstBaseVideoDecoder *base_video_decoder; gboolean res = FALSE; - base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); + base_video_decoder = GST_BASE_VIDEO_DECODER (parent); GST_DEBUG_OBJECT (base_video_decoder, "received event %d, %s", GST_EVENT_TYPE (event), @@ -630,9 +624,9 @@ gst_base_video_decoder_src_event (GstPad * pad, GstEvent * event) /* ... though a non-time seek can be aided as well */ /* First bring the requested format to time */ tformat = GST_FORMAT_TIME; - if (!(res = gst_pad_query_convert (pad, format, cur, &tformat, &tcur))) + if (!(res = gst_pad_query_convert (pad, format, cur, tformat, &tcur))) goto convert_error; - if (!(res = gst_pad_query_convert (pad, format, stop, &tformat, &tstop))) + if (!(res = gst_pad_query_convert (pad, format, stop, tformat, &tstop))) goto convert_error; /* then seek with time on the peer */ @@ -647,12 +641,13 @@ gst_base_video_decoder_src_event (GstPad * pad, GstEvent * event) } case GST_EVENT_QOS: { + GstQOSType type; gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; GstClockTime duration; - gst_event_parse_qos (event, &proportion, &diff, ×tamp); + gst_event_parse_qos (event, &type, &proportion, &diff, ×tamp); GST_OBJECT_LOCK (base_video_decoder); GST_BASE_VIDEO_CODEC (base_video_decoder)->proportion = proportion; @@ -693,7 +688,6 @@ gst_base_video_decoder_src_event (GstPad * pad, GstEvent * event) break; } done: - gst_object_unref (base_video_decoder); return res; convert_error: @@ -701,26 +695,14 @@ convert_error: goto done; } -static const GstQueryType * -gst_base_video_decoder_get_query_types (GstPad * pad) -{ - static const GstQueryType query_types[] = { - GST_QUERY_POSITION, - GST_QUERY_DURATION, - GST_QUERY_CONVERT, - 0 - }; - - return query_types; -} - static gboolean -gst_base_video_decoder_src_query (GstPad * pad, GstQuery * query) +gst_base_video_decoder_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) { GstBaseVideoDecoder *dec; gboolean res = TRUE; - dec = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); + dec = GST_BASE_VIDEO_DECODER (parent); GST_LOG_OBJECT (dec, "handling query: %" GST_PTR_FORMAT, query); @@ -750,7 +732,7 @@ gst_base_video_decoder_src_query (GstPad * pad, GstQuery * query) /* and convert to the final format */ gst_query_parse_position (query, &format, NULL); if (!(res = gst_pad_query_convert (pad, GST_FORMAT_TIME, time, - &format, &value))) + format, &value))) break; gst_query_set_position (query, format, value); @@ -765,7 +747,7 @@ gst_base_video_decoder_src_query (GstPad * pad, GstQuery * query) GstFormat format; /* upstream in any case */ - if ((res = gst_pad_query_default (pad, query))) + if ((res = gst_pad_query_default (pad, parent, query))) break; gst_query_parse_duration (query, &format, NULL); @@ -774,12 +756,12 @@ gst_base_video_decoder_src_query (GstPad * pad, GstQuery * query) gint64 value; format = GST_FORMAT_BYTES; - if (gst_pad_query_peer_duration (GST_BASE_VIDEO_CODEC_SINK_PAD (dec), - &format, &value)) { + if (gst_pad_peer_query_duration (GST_BASE_VIDEO_CODEC_SINK_PAD (dec), + format, &value)) { GST_LOG_OBJECT (dec, "upstream size %" G_GINT64_FORMAT, value); format = GST_FORMAT_TIME; if (gst_pad_query_convert (GST_BASE_VIDEO_CODEC_SINK_PAD (dec), - GST_FORMAT_BYTES, value, &format, &value)) { + GST_FORMAT_BYTES, value, format, &value)) { gst_query_set_duration (query, GST_FORMAT_TIME, value); res = TRUE; } @@ -803,24 +785,26 @@ gst_base_video_decoder_src_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); } - gst_object_unref (dec); return res; + /* ERRORS */ error: - GST_ERROR_OBJECT (dec, "query failed"); - gst_object_unref (dec); - return res; + { + GST_ERROR_OBJECT (dec, "query failed"); + return res; + } } static gboolean -gst_base_video_decoder_sink_query (GstPad * pad, GstQuery * query) +gst_base_video_decoder_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query) { GstBaseVideoDecoder *base_video_decoder; gboolean res = FALSE; - base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); + base_video_decoder = GST_BASE_VIDEO_DECODER (parent); GST_LOG_OBJECT (base_video_decoder, "handling query: %" GST_PTR_FORMAT, query); @@ -841,16 +825,18 @@ gst_base_video_decoder_sink_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } done: - gst_object_unref (base_video_decoder); - return res; + + /* ERRORS */ error: - GST_DEBUG_OBJECT (base_video_decoder, "query failed"); - goto done; + { + GST_DEBUG_OBJECT (base_video_decoder, "query failed"); + goto done; + } } typedef struct _Timestamp Timestamp; @@ -922,17 +908,17 @@ gst_base_video_decoder_clear_queues (GstBaseVideoDecoder * dec) g_list_foreach (dec->gather, (GFunc) gst_mini_object_unref, NULL); g_list_free (dec->gather); dec->gather = NULL; - g_list_foreach (dec->decode, (GFunc) gst_video_frame_unref, NULL); + g_list_foreach (dec->decode, (GFunc) gst_video_frame_state_unref, NULL); g_list_free (dec->decode); dec->decode = NULL; g_list_foreach (dec->parse, (GFunc) gst_mini_object_unref, NULL); g_list_free (dec->parse); dec->parse = NULL; - g_list_foreach (dec->parse_gather, (GFunc) gst_video_frame_unref, NULL); + g_list_foreach (dec->parse_gather, (GFunc) gst_video_frame_state_unref, NULL); g_list_free (dec->parse_gather); dec->parse_gather = NULL; g_list_foreach (GST_BASE_VIDEO_CODEC (dec)->frames, - (GFunc) gst_video_frame_unref, NULL); + (GFunc) gst_video_frame_state_unref, NULL); g_list_free (GST_BASE_VIDEO_CODEC (dec)->frames); GST_BASE_VIDEO_CODEC (dec)->frames = NULL; } @@ -968,7 +954,7 @@ gst_base_video_decoder_reset (GstBaseVideoDecoder * base_video_decoder, base_video_decoder->timestamps = NULL; if (base_video_decoder->current_frame) { - gst_video_frame_unref (base_video_decoder->current_frame); + gst_video_frame_state_unref (base_video_decoder->current_frame); base_video_decoder->current_frame = NULL; } @@ -1006,7 +992,7 @@ gst_base_video_decoder_chain_forward (GstBaseVideoDecoder * base_video_decoder, if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { gst_base_video_decoder_add_timestamp (base_video_decoder, buf); } - base_video_decoder->input_offset += GST_BUFFER_SIZE (buf); + base_video_decoder->input_offset += gst_buffer_get_size (buf); if (base_video_decoder->packetized) { base_video_decoder->current_frame->sink_buffer = buf; @@ -1060,6 +1046,7 @@ gst_base_video_decoder_chain_forward (GstBaseVideoDecoder * base_video_decoder, } do { + GST_LOG_OBJECT (base_video_decoder, "Calling ::parse_data()"); ret = klass->parse_data (base_video_decoder, FALSE); } while (ret == GST_FLOW_OK); @@ -1089,7 +1076,7 @@ gst_base_video_decoder_flush_decode (GstBaseVideoDecoder * dec) while (walk) { GList *next; - GstVideoFrame *frame = (GstVideoFrame *) (walk->data); + GstVideoFrameState *frame = (GstVideoFrameState *) (walk->data); GstBuffer *buf = frame->sink_buffer; GST_DEBUG_OBJECT (dec, "decoding frame %p, ts %" GST_TIME_FORMAT, @@ -1097,9 +1084,9 @@ gst_base_video_decoder_flush_decode (GstBaseVideoDecoder * dec) next = g_list_next (walk); if (dec->current_frame) - gst_video_frame_unref (dec->current_frame); + gst_video_frame_state_unref (dec->current_frame); dec->current_frame = frame; - gst_video_frame_ref (dec->current_frame); + gst_video_frame_state_ref (dec->current_frame); /* decode buffer, resulting data prepended to queue */ res = gst_base_video_decoder_have_frame_2 (dec); @@ -1152,9 +1139,9 @@ gst_base_video_decoder_flush_parse (GstBaseVideoDecoder * dec) /* now we can process frames */ GST_DEBUG_OBJECT (dec, "checking frames"); while (dec->parse_gather) { - GstVideoFrame *frame; + GstVideoFrameState *frame; - frame = (GstVideoFrame *) (dec->parse_gather->data); + frame = (GstVideoFrameState *) (dec->parse_gather->data); /* remove from the gather list */ dec->parse_gather = g_list_delete_link (dec->parse_gather, dec->parse_gather); @@ -1173,12 +1160,12 @@ gst_base_video_decoder_flush_parse (GstBaseVideoDecoder * dec) GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data); if (G_LIKELY (res == GST_FLOW_OK)) { - GST_DEBUG_OBJECT (dec, "pushing buffer %p of size %u, " + GST_DEBUG_OBJECT (dec, "pushing buffer %p of size %" G_GSIZE_FORMAT ", " "time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, buf, - GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); /* should be already, but let's be sure */ - buf = gst_buffer_make_metadata_writable (buf); + buf = gst_buffer_make_writable (buf); /* avoid stray DISCONT from forward processing, * which have no meaning in reverse pushing */ GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT); @@ -1216,9 +1203,9 @@ gst_base_video_decoder_chain_reverse (GstBaseVideoDecoder * dec, } if (G_LIKELY (buf)) { - GST_DEBUG_OBJECT (dec, "gathering buffer %p of size %u, " + GST_DEBUG_OBJECT (dec, "gathering buffer %p of size %" G_GSIZE_FORMAT ", " "time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, buf, - GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); /* add buffer to gather queue */ @@ -1229,17 +1216,17 @@ gst_base_video_decoder_chain_reverse (GstBaseVideoDecoder * dec, } static GstFlowReturn -gst_base_video_decoder_chain (GstPad * pad, GstBuffer * buf) +gst_base_video_decoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstBaseVideoDecoder *base_video_decoder; GstFlowReturn ret = GST_FLOW_OK; - base_video_decoder = GST_BASE_VIDEO_DECODER (GST_PAD_PARENT (pad)); + base_video_decoder = GST_BASE_VIDEO_DECODER (parent); GST_LOG_OBJECT (base_video_decoder, - "chain %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " size %d", - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_SIZE (buf)); + "chain %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " size %" + G_GSIZE_FORMAT "", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), gst_buffer_get_size (buf)); GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); @@ -1251,17 +1238,15 @@ gst_base_video_decoder_chain (GstPad * pad, GstBuffer * buf) GST_FORMAT_UNDEFINED) { GstEvent *event; GstFlowReturn ret; + GstSegment *segment = &GST_BASE_VIDEO_CODEC (base_video_decoder)->segment; GST_WARNING_OBJECT (base_video_decoder, "Received buffer without a new-segment. " "Assuming timestamps start from 0."); - gst_segment_set_newsegment_full (&GST_BASE_VIDEO_CODEC - (base_video_decoder)->segment, FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, - GST_CLOCK_TIME_NONE, 0); + gst_segment_init (segment, GST_FORMAT_TIME); - event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, - GST_CLOCK_TIME_NONE, 0); + event = gst_event_new_segment (segment); ret = gst_base_video_decoder_push_src_event (base_video_decoder, event); if (!ret) { @@ -1347,10 +1332,10 @@ gst_base_video_decoder_change_state (GstElement * element, return ret; } -static GstVideoFrame * +static GstVideoFrameState * gst_base_video_decoder_new_frame (GstBaseVideoDecoder * base_video_decoder) { - GstVideoFrame *frame; + GstVideoFrameState *frame; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); frame = @@ -1375,12 +1360,13 @@ gst_base_video_decoder_new_frame (GstBaseVideoDecoder * base_video_decoder) static void gst_base_video_decoder_prepare_finish_frame (GstBaseVideoDecoder * - base_video_decoder, GstVideoFrame * frame) + base_video_decoder, GstVideoFrameState * frame) { GList *l, *events = NULL; #ifndef GST_DISABLE_GST_DEBUG - GST_LOG_OBJECT (base_video_decoder, "n %d in %d out %d", + GST_LOG_OBJECT (base_video_decoder, + "n %d in %" G_GSIZE_FORMAT " out %" G_GSIZE_FORMAT, g_list_length (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames), gst_adapter_available (base_video_decoder->input_adapter), gst_adapter_available (base_video_decoder->output_adapter)); @@ -1392,7 +1378,7 @@ gst_base_video_decoder_prepare_finish_frame (GstBaseVideoDecoder * /* Push all pending events that arrived before this frame */ for (l = base_video_decoder->base_video_codec.frames; l; l = l->next) { - GstVideoFrame *tmp = l->data; + GstVideoFrameState *tmp = l->data; if (tmp->events) { events = tmp->events; @@ -1471,12 +1457,14 @@ gst_base_video_decoder_prepare_finish_frame (GstBaseVideoDecoder * static void gst_base_video_decoder_do_finish_frame (GstBaseVideoDecoder * dec, - GstVideoFrame * frame) + GstVideoFrameState * frame) { - GST_BASE_VIDEO_CODEC (dec)->frames = - g_list_remove (GST_BASE_VIDEO_CODEC (dec)->frames, frame); + gst_base_video_codec_remove_frame (GST_BASE_VIDEO_CODEC (dec), frame); + + if (frame->src_buffer) + gst_buffer_unref (frame->src_buffer); - gst_video_frame_unref (frame); + gst_video_frame_state_unref (frame); } /** @@ -1494,7 +1482,7 @@ gst_base_video_decoder_do_finish_frame (GstBaseVideoDecoder * dec, */ GstFlowReturn gst_base_video_decoder_drop_frame (GstBaseVideoDecoder * dec, - GstVideoFrame * frame) + GstVideoFrameState * frame) { GstClockTime stream_time, jitter, earliest_time, qostime, timestamp; GstSegment *segment; @@ -1539,7 +1527,7 @@ gst_base_video_decoder_drop_frame (GstBaseVideoDecoder * dec, /** * gst_base_video_decoder_finish_frame: * @base_video_decoder: a #GstBaseVideoDecoder - * @frame: a decoded #GstVideoFrame + * @frame: a decoded #GstVideoFrameState * * @frame should have a valid decoded data buffer, whose metadata fields * are then appropriately set according to frame data and pushed downstream. @@ -1550,7 +1538,7 @@ gst_base_video_decoder_drop_frame (GstBaseVideoDecoder * dec, */ GstFlowReturn gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder, - GstVideoFrame * frame) + GstVideoFrameState * frame) { GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state; GstBuffer *src_buffer; @@ -1570,7 +1558,7 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder, goto done; } - src_buffer = gst_buffer_make_metadata_writable (frame->src_buffer); + src_buffer = gst_buffer_make_writable (frame->src_buffer); frame->src_buffer = NULL; GST_BUFFER_FLAG_UNSET (src_buffer, GST_BUFFER_FLAG_DELTA_UNIT); @@ -1581,16 +1569,16 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder, tff ^= 1; } if (tff) { - GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_TFF); + GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_FLAG_TFF); } else { - GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_TFF); + GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_FLAG_TFF); } - GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_RFF); - GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_ONEFIELD); + GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_FLAG_RFF); + GST_BUFFER_FLAG_UNSET (src_buffer, GST_VIDEO_BUFFER_FLAG_ONEFIELD); if (frame->n_fields == 3) { - GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_RFF); + GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_FLAG_RFF); } else if (frame->n_fields == 1) { - GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_ONEFIELD); + GST_BUFFER_FLAG_SET (src_buffer, GST_VIDEO_BUFFER_FLAG_ONEFIELD); } } if (GST_BASE_VIDEO_CODEC (base_video_decoder)->discont) { @@ -1605,7 +1593,7 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder, /* update rate estimate */ GST_BASE_VIDEO_CODEC (base_video_decoder)->bytes += - GST_BUFFER_SIZE (src_buffer); + gst_buffer_get_size (src_buffer); if (GST_CLOCK_TIME_IS_VALID (frame->presentation_duration)) { GST_BASE_VIDEO_CODEC (base_video_decoder)->time += frame->presentation_duration; @@ -1614,17 +1602,14 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder, GST_BASE_VIDEO_CODEC (base_video_decoder)->time = GST_CLOCK_TIME_NONE; } - gst_buffer_set_caps (src_buffer, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder))); - GST_LOG_OBJECT (base_video_decoder, "pushing frame ts %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (src_buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (src_buffer))); if (base_video_decoder->sink_clipping) { - gint64 start = GST_BUFFER_TIMESTAMP (src_buffer); - gint64 stop = GST_BUFFER_TIMESTAMP (src_buffer) + + guint64 start = GST_BUFFER_TIMESTAMP (src_buffer); + guint64 stop = GST_BUFFER_TIMESTAMP (src_buffer) + GST_BUFFER_DURATION (src_buffer); GstSegment *segment = &GST_BASE_VIDEO_CODEC (base_video_decoder)->segment; @@ -1683,7 +1668,7 @@ done: /** * gst_base_video_decoder_finish_frame: * @base_video_decoder: a #GstBaseVideoDecoder - * @n_bytes: an encoded #GstVideoFrame + * @n_bytes: an encoded #GstVideoFrameState * * Removes next @n_bytes of input data and adds it to currently parsed frame. */ @@ -1817,7 +1802,7 @@ gst_base_video_decoder_have_frame (GstBaseVideoDecoder * base_video_decoder) static GstFlowReturn gst_base_video_decoder_have_frame_2 (GstBaseVideoDecoder * base_video_decoder) { - GstVideoFrame *frame = base_video_decoder->current_frame; + GstVideoFrameState *frame = base_video_decoder->current_frame; GstBaseVideoDecoderClass *base_video_decoder_class; GstFlowReturn ret = GST_FLOW_OK; @@ -1847,8 +1832,8 @@ gst_base_video_decoder_have_frame_2 (GstBaseVideoDecoder * base_video_decoder) GST_TIME_ARGS (frame->decode_timestamp)); GST_LOG_OBJECT (base_video_decoder, "dist %d", frame->distance_from_sync); - GST_BASE_VIDEO_CODEC (base_video_decoder)->frames = - g_list_append (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames, frame); + gst_base_video_codec_append_frame (GST_BASE_VIDEO_CODEC (base_video_decoder), + frame); frame->deadline = gst_segment_to_running_time (&GST_BASE_VIDEO_CODEC @@ -1856,6 +1841,7 @@ gst_base_video_decoder_have_frame_2 (GstBaseVideoDecoder * base_video_decoder) frame->presentation_timestamp); /* do something with frame */ + GST_LOG_OBJECT (base_video_decoder, "Calling ::handle_frame()"); ret = base_video_decoder_class->handle_frame (base_video_decoder, frame); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (base_video_decoder, "flow error %s", @@ -1930,9 +1916,9 @@ gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder * base_video_decoder) * gst_base_video_decoder_get_oldest_frame: * @base_video_decoder: a #GstBaseVideoDecoder * - * Returns: oldest pending unfinished #GstVideoFrame. + * Returns: oldest pending unfinished #GstVideoFrameState. */ -GstVideoFrame * +GstVideoFrameState * gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder * base_video_decoder) { @@ -1944,7 +1930,7 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder * if (g == NULL) return NULL; - return (GstVideoFrame *) (g->data); + return (GstVideoFrameState *) (g->data); } /** @@ -1952,19 +1938,19 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder * * @base_video_decoder: a #GstBaseVideoDecoder * @frame_number: system_frame_number of a frame * - * Returns: pending unfinished #GstVideoFrame identified by @frame_number. + * Returns: pending unfinished #GstVideoFrameState identified by @frame_number. */ -GstVideoFrame * +GstVideoFrameState * gst_base_video_decoder_get_frame (GstBaseVideoDecoder * base_video_decoder, int frame_number) { GList *g; - GstVideoFrame *frame = NULL; + GstVideoFrameState *frame = NULL; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); for (g = g_list_first (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames); g; g = g_list_next (g)) { - GstVideoFrame *tmp = g->data; + GstVideoFrameState *tmp = g->data; if (frame->system_frame_number == frame_number) { frame = tmp; @@ -1982,12 +1968,22 @@ gst_base_video_decoder_get_frame (GstBaseVideoDecoder * base_video_decoder, * * Sets src pad caps according to currently configured #GstVideoState. * + * The #GstVideoInfo and #GstBufferPool will be created and negotiated + * according to those values. + * + * Returns: %TRUE if the format was properly negotiated, else %FALSE. */ gboolean gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) { GstCaps *caps; - GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state; + GstBaseVideoCodec *codec = GST_BASE_VIDEO_CODEC (base_video_decoder); + GstVideoState *state = &codec->state; + GstVideoInfo *info = &codec->info; + GstQuery *query; + GstBufferPool *pool = NULL; + GstStructure *config; + guint size, min, max, prefix, alignment; gboolean ret; /* minimum sense */ @@ -1997,6 +1993,8 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); + gst_video_info_set_format (info, state->format, state->width, state->height); + /* sanitize */ if (state->fps_n == 0 || state->fps_d == 0) { state->fps_n = 0; @@ -2007,11 +2005,22 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) state->par_d = 1; } - caps = gst_video_format_new_caps (state->format, - state->width, state->height, - state->fps_n, state->fps_d, state->par_n, state->par_d); - gst_caps_set_simple (caps, "interlaced", - G_TYPE_BOOLEAN, state->interlaced, NULL); + info->par_n = state->par_n; + info->par_d = state->par_d; + info->fps_n = state->fps_n; + info->fps_d = state->fps_d; + + if (state->have_interlaced) { + if (state->interlaced) + GST_VIDEO_INFO_FLAG_SET (info, GST_VIDEO_FLAG_INTERLACED); + if (state->top_field_first) + GST_VIDEO_INFO_FLAG_SET (info, GST_VIDEO_FLAG_TFF); + } + + /* FIXME : Handle chroma site */ + /* FIXME : Handle colorimetry */ + + caps = gst_video_info_to_caps (info); GST_DEBUG_OBJECT (base_video_decoder, "setting caps %" GST_PTR_FORMAT, caps); @@ -2020,9 +2029,50 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) caps); gst_caps_unref (caps); - /* arrange for derived info */ - state->bytes_per_picture = - gst_video_format_get_size (state->format, state->width, state->height); + /* Negotiate pool */ + query = gst_query_new_allocation (caps, TRUE); + + if (gst_pad_peer_query (codec->srcpad, query)) { + GST_DEBUG_OBJECT (codec, "got downstream ALLOCATION hints"); + /* we got configuration from our peer, parse them */ + gst_query_parse_allocation_params (query, &size, &min, &max, &prefix, + &alignment, &pool); + size = MAX (size, info->size); + } else { + GST_DEBUG_OBJECT (codec, "didn't get downstream ALLOCATION hints"); + size = info->size; + min = max = 0; + prefix = 0; + alignment = 0; + } + + if (pool == NULL) { + /* we did not get a pool, make one ourselves then */ + pool = gst_buffer_pool_new (); + } + + if (base_video_decoder->pool) + gst_object_unref (base_video_decoder->pool); + base_video_decoder->pool = pool; + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set (config, caps, size, min, max, prefix, alignment); + state->bytes_per_picture = size; + + /* just set the option, if the pool can support it we will transparently use + * it through the video info API. We could also see if the pool support this + * option and only activate it then. */ + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + /* check if downstream supports cropping */ + base_video_decoder->use_cropping = + gst_query_has_allocation_meta (query, GST_VIDEO_CROP_META_API); + + gst_buffer_pool_set_config (pool, config); + /* and activate */ + gst_buffer_pool_set_active (pool, TRUE); + + gst_query_unref (query); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); @@ -2033,9 +2083,8 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) * gst_base_video_decoder_alloc_src_buffer: * @base_video_decoder: a #GstBaseVideoDecoder * - * Helper function that uses gst_pad_alloc_buffer_and_set_caps - * to allocate a buffer to hold a video frame for @base_video_decoder's - * current #GstVideoState. + * Helper function that returns a buffer from the decoders' configured + * #GstBufferPool. * * Returns: allocated buffer */ @@ -2043,36 +2092,21 @@ GstBuffer * gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * base_video_decoder) { - GstBuffer *buffer; - GstFlowReturn flow_ret; - GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state; - int num_bytes = state->bytes_per_picture; - - GST_DEBUG ("alloc src buffer caps=%" GST_PTR_FORMAT, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder))); + GstBuffer *buffer = NULL; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); - flow_ret = - gst_pad_alloc_buffer_and_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD - (base_video_decoder), GST_BUFFER_OFFSET_NONE, num_bytes, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)), - &buffer); - - if (flow_ret != GST_FLOW_OK) { - buffer = gst_buffer_new_and_alloc (num_bytes); - gst_buffer_set_caps (buffer, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder))); - } + gst_buffer_pool_acquire_buffer (base_video_decoder->pool, &buffer, NULL); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); + return buffer; } /** * gst_base_video_decoder_alloc_src_frame: * @base_video_decoder: a #GstBaseVideoDecoder - * @frame: a #GstVideoFrame + * @frame: a #GstVideoFrameState * * Helper function that uses gst_pad_alloc_buffer_and_set_caps * to allocate a buffer to hold a video frame for @base_video_decoder's @@ -2083,24 +2117,17 @@ gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * */ GstFlowReturn gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder * - base_video_decoder, GstVideoFrame * frame) + base_video_decoder, GstVideoFrameState * frame) { GstFlowReturn flow_ret; - GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state; - int num_bytes = state->bytes_per_picture; - g_return_val_if_fail (state->bytes_per_picture != 0, GST_FLOW_ERROR); - g_return_val_if_fail (GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD - (base_video_decoder)) != NULL, GST_FLOW_ERROR); + GST_LOG_OBJECT (base_video_decoder, "alloc buffer"); - GST_LOG_OBJECT (base_video_decoder, "alloc buffer size %d", num_bytes); GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); flow_ret = - gst_pad_alloc_buffer_and_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD - (base_video_decoder), GST_BUFFER_OFFSET_NONE, num_bytes, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)), - &frame->src_buffer); + gst_buffer_pool_acquire_buffer (base_video_decoder->pool, + &frame->src_buffer, NULL); if (flow_ret != GST_FLOW_OK) { GST_WARNING_OBJECT (base_video_decoder, "failed to get buffer %s", @@ -2115,7 +2142,7 @@ gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder * /** * gst_base_video_decoder_get_max_decode_time: * @base_video_decoder: a #GstBaseVideoDecoder - * @frame: a #GstVideoFrame + * @frame: a #GstVideoFrameState * * Determines maximum possible decoding time for @frame that will * allow it to decode and arrive in time (as determined by QoS events). @@ -2126,7 +2153,7 @@ gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder * */ GstClockTimeDiff gst_base_video_decoder_get_max_decode_time (GstBaseVideoDecoder * - base_video_decoder, GstVideoFrame * frame) + base_video_decoder, GstVideoFrameState * frame) { GstClockTimeDiff deadline; GstClockTime earliest_time; diff --git a/gst-libs/gst/video/gstbasevideodecoder.h b/gst-libs/gst/video/gstbasevideodecoder.h index a3b81fe44..891d02ba3 100644 --- a/gst-libs/gst/video/gstbasevideodecoder.h +++ b/gst-libs/gst/video/gstbasevideodecoder.h @@ -95,7 +95,7 @@ GstFlowReturn _gst_base_video_decoder_error (GstBaseVideoDecoder *dec, gint weig * enclosed in parentheses) * @ret: variable to receive return value * - * Utility function that audio decoder elements can use in case they encountered + * Utility function that video decoder elements can use in case they encountered * a data processing error that may be fatal for the current "data unit" but * need not prevent subsequent decoding. Such errors are counted and if there * are too many, as configured in the context's max_errors, the pipeline will @@ -104,7 +104,7 @@ GstFlowReturn _gst_base_video_decoder_error (GstBaseVideoDecoder *dec, gint weig * is logged. In either case, @ret is set to the proper value to * return to upstream/caller (indicating either GST_FLOW_ERROR or GST_FLOW_OK). */ -#define GST_BASE_AUDIO_DECODER_ERROR(el, w, domain, code, text, debug, ret) \ +#define GST_BASE_VIDEO_DECODER_ERROR(el, w, domain, code, text, debug, ret) \ G_STMT_START { \ gchar *__txt = _gst_element_error_printf text; \ gchar *__dbg = _gst_element_error_printf debug; \ @@ -142,7 +142,7 @@ struct _GstBaseVideoDecoder /* ... being tracked here; * only available during parsing */ /* FIXME remove and add parameter to method */ - GstVideoFrame *current_frame; + GstVideoFrameState *current_frame; /* events that should apply to the current frame */ GList *current_frame_events; /* relative offset of input data */ @@ -182,6 +182,12 @@ struct _GstBaseVideoDecoder int reorder_depth; int distance_from_sync; + /* Raw video bufferpool */ + GstBufferPool *pool; + /* Indicates whether downstream can handle + * GST_META_API_VIDEO_CROP */ + gboolean use_cropping; + /* qos messages: frames dropped/processed */ guint dropped; guint processed; @@ -237,7 +243,7 @@ struct _GstBaseVideoDecoderClass GstFlowReturn (*finish) (GstBaseVideoDecoder *coder); - GstFlowReturn (*handle_frame) (GstBaseVideoDecoder *coder, GstVideoFrame *frame); + GstFlowReturn (*handle_frame) (GstBaseVideoDecoder *coder, GstVideoFrameState *frame); /*< private >*/ @@ -251,9 +257,9 @@ struct _GstBaseVideoDecoderClass void gst_base_video_decoder_class_set_capture_pattern (GstBaseVideoDecoderClass *klass, guint32 mask, guint32 pattern); -GstVideoFrame *gst_base_video_decoder_get_frame (GstBaseVideoDecoder *coder, +GstVideoFrameState *gst_base_video_decoder_get_frame (GstBaseVideoDecoder *coder, int frame_number); -GstVideoFrame *gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *coder); +GstVideoFrameState *gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *coder); void gst_base_video_decoder_add_to_frame (GstBaseVideoDecoder *base_video_decoder, int n_bytes); @@ -264,15 +270,16 @@ void gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder *bas gboolean gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder *base_video_decoder); GstBuffer *gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * base_video_decoder); GstFlowReturn gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder *base_video_decoder, - GstVideoFrame *frame); + GstVideoFrameState *frame); GstVideoState *gst_base_video_decoder_get_state (GstBaseVideoDecoder *base_video_decoder); GstClockTimeDiff gst_base_video_decoder_get_max_decode_time ( GstBaseVideoDecoder *base_video_decoder, - GstVideoFrame *frame); + GstVideoFrameState *frame); GstFlowReturn gst_base_video_decoder_finish_frame (GstBaseVideoDecoder *base_video_decoder, - GstVideoFrame *frame); + GstVideoFrameState *frame); GstFlowReturn gst_base_video_decoder_drop_frame (GstBaseVideoDecoder *dec, - GstVideoFrame *frame); + GstVideoFrameState *frame); + GType gst_base_video_decoder_get_type (void); G_END_DECLS diff --git a/gst-libs/gst/video/gstbasevideoencoder.c b/gst-libs/gst/video/gstbasevideoencoder.c index e4fe35f59..f4b1ee2d1 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.c +++ b/gst-libs/gst/video/gstbasevideoencoder.c @@ -143,45 +143,24 @@ forced_key_unit_event_new (GstClockTime running_time, gboolean all_headers, static void gst_base_video_encoder_finalize (GObject * object); -static gboolean gst_base_video_encoder_sink_setcaps (GstPad * pad, - GstCaps * caps); -static GstCaps *gst_base_video_encoder_sink_getcaps (GstPad * pad); +static GstCaps *gst_base_video_encoder_sink_getcaps (GstPad * pad, + GstCaps * filter); static gboolean gst_base_video_encoder_src_event (GstPad * pad, - GstEvent * event); + GstObject * parent, GstEvent * event); static gboolean gst_base_video_encoder_sink_event (GstPad * pad, - GstEvent * event); + GstObject * parent, GstEvent * event); +static gboolean gst_base_video_encoder_sink_query (GstPad * pad, + GstObject * parent, GstQuery * query); static GstFlowReturn gst_base_video_encoder_chain (GstPad * pad, - GstBuffer * buf); + GstObject * parent, GstBuffer * buf); static GstStateChangeReturn gst_base_video_encoder_change_state (GstElement * element, GstStateChange transition); -static const GstQueryType *gst_base_video_encoder_get_query_types (GstPad * - pad); static gboolean gst_base_video_encoder_src_query (GstPad * pad, - GstQuery * query); + GstObject * parent, GstQuery * query); -static void -_do_init (GType object_type) -{ - const GInterfaceInfo preset_interface_info = { - NULL, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - g_type_add_interface_static (object_type, GST_TYPE_PRESET, - &preset_interface_info); -} - -GST_BOILERPLATE_FULL (GstBaseVideoEncoder, gst_base_video_encoder, - GstBaseVideoCodec, GST_TYPE_BASE_VIDEO_CODEC, _do_init); - -static void -gst_base_video_encoder_base_init (gpointer g_class) -{ - GST_DEBUG_CATEGORY_INIT (basevideoencoder_debug, "basevideoencoder", 0, - "Base Video Encoder"); - -} +#define gst_base_video_encoder_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstBaseVideoEncoder, gst_base_video_encoder, + GST_TYPE_BASE_VIDEO_CODEC, G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET, NULL);); static void gst_base_video_encoder_class_init (GstBaseVideoEncoderClass * klass) @@ -189,6 +168,9 @@ gst_base_video_encoder_class_init (GstBaseVideoEncoderClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; + GST_DEBUG_CATEGORY_INIT (basevideoencoder_debug, "basevideoencoder", 0, + "Base Video Encoder"); + gobject_class = G_OBJECT_CLASS (klass); gstelement_class = GST_ELEMENT_CLASS (klass); @@ -226,8 +208,7 @@ gst_base_video_encoder_reset (GstBaseVideoEncoder * base_video_encoder) } static void -gst_base_video_encoder_init (GstBaseVideoEncoder * base_video_encoder, - GstBaseVideoEncoderClass * klass) +gst_base_video_encoder_init (GstBaseVideoEncoder * base_video_encoder) { GstPad *pad; @@ -239,15 +220,11 @@ gst_base_video_encoder_init (GstBaseVideoEncoder * base_video_encoder, GST_DEBUG_FUNCPTR (gst_base_video_encoder_chain)); gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_encoder_sink_event)); - gst_pad_set_setcaps_function (pad, - GST_DEBUG_FUNCPTR (gst_base_video_encoder_sink_setcaps)); - gst_pad_set_getcaps_function (pad, - GST_DEBUG_FUNCPTR (gst_base_video_encoder_sink_getcaps)); + gst_pad_set_query_function (pad, + GST_DEBUG_FUNCPTR (gst_base_video_encoder_sink_query)); pad = GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder); - gst_pad_set_query_type_function (pad, - GST_DEBUG_FUNCPTR (gst_base_video_encoder_get_query_types)); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_base_video_encoder_src_query)); gst_pad_set_event_function (pad, @@ -292,7 +269,7 @@ gst_base_video_encoder_drain (GstBaseVideoEncoder * enc) /* everything should be away now */ if (codec->frames) { /* not fatal/impossible though if subclass/codec eats stuff */ - g_list_foreach (codec->frames, (GFunc) gst_video_frame_unref, NULL); + g_list_foreach (codec->frames, (GFunc) gst_video_frame_state_unref, NULL); g_list_free (codec->frames); codec->frames = NULL; } @@ -301,70 +278,71 @@ gst_base_video_encoder_drain (GstBaseVideoEncoder * enc) } static gboolean -gst_base_video_encoder_sink_setcaps (GstPad * pad, GstCaps * caps) +gst_base_video_encoder_sink_setcaps (GstBaseVideoEncoder * base_video_encoder, + GstCaps * caps) { - GstBaseVideoEncoder *base_video_encoder; GstBaseVideoEncoderClass *base_video_encoder_class; - GstStructure *structure; + GstBaseVideoCodec *codec = GST_BASE_VIDEO_CODEC (base_video_encoder); + GstVideoInfo *info, tmp_info; GstVideoState *state, tmp_state; - gboolean ret; - gboolean changed = FALSE; + gboolean ret = FALSE; + gboolean changed = TRUE; + + GST_DEBUG_OBJECT (base_video_encoder, "setcaps %" GST_PTR_FORMAT, caps); - base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); base_video_encoder_class = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); /* subclass should do something here ... */ g_return_val_if_fail (base_video_encoder_class->set_format != NULL, FALSE); - GST_DEBUG_OBJECT (base_video_encoder, "setcaps %" GST_PTR_FORMAT, caps); - GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); - state = &GST_BASE_VIDEO_CODEC (base_video_encoder)->state; + /* Get GstVideoInfo from upstream caps */ + info = &codec->info; + if (!gst_video_info_from_caps (&tmp_info, caps)) + goto exit; + + state = &codec->state; memset (&tmp_state, 0, sizeof (tmp_state)); tmp_state.caps = gst_caps_ref (caps); - structure = gst_caps_get_structure (caps, 0); - - ret = - gst_video_format_parse_caps (caps, &tmp_state.format, &tmp_state.width, - &tmp_state.height); - if (!ret) - goto exit; - - changed = (tmp_state.format != state->format - || tmp_state.width != state->width || tmp_state.height != state->height); - if (!gst_video_parse_caps_framerate (caps, &tmp_state.fps_n, - &tmp_state.fps_d)) { - tmp_state.fps_n = 0; - tmp_state.fps_d = 1; + /* Check if input caps changed */ + if (info->finfo) { + /* Check if anything changed */ + changed = GST_VIDEO_INFO_FORMAT (&tmp_info) != GST_VIDEO_INFO_FORMAT (info); + changed |= GST_VIDEO_INFO_FLAGS (&tmp_info) != GST_VIDEO_INFO_FLAGS (info); + changed |= GST_VIDEO_INFO_WIDTH (&tmp_info) != GST_VIDEO_INFO_WIDTH (info); + changed |= + GST_VIDEO_INFO_HEIGHT (&tmp_info) != GST_VIDEO_INFO_HEIGHT (info); + changed |= GST_VIDEO_INFO_SIZE (&tmp_info) != GST_VIDEO_INFO_SIZE (info); + changed |= GST_VIDEO_INFO_VIEWS (&tmp_info) != GST_VIDEO_INFO_VIEWS (info); + changed |= GST_VIDEO_INFO_FPS_N (&tmp_info) != GST_VIDEO_INFO_FPS_N (info); + changed |= GST_VIDEO_INFO_FPS_D (&tmp_info) != GST_VIDEO_INFO_FPS_D (info); + changed |= GST_VIDEO_INFO_PAR_N (&tmp_info) != GST_VIDEO_INFO_PAR_N (info); + changed |= GST_VIDEO_INFO_PAR_D (&tmp_info) != GST_VIDEO_INFO_PAR_D (info); } - changed = changed || (tmp_state.fps_n != state->fps_n - || tmp_state.fps_d != state->fps_d); - if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &tmp_state.par_n, - &tmp_state.par_d)) { - tmp_state.par_n = 1; - tmp_state.par_d = 1; - } - changed = changed || (tmp_state.par_n != state->par_n - || tmp_state.par_d != state->par_d); - - tmp_state.have_interlaced = - gst_structure_get_boolean (structure, "interlaced", - &tmp_state.interlaced); - changed = changed || (tmp_state.have_interlaced != state->have_interlaced - || tmp_state.interlaced != state->interlaced); - - tmp_state.bytes_per_picture = - gst_video_format_get_size (tmp_state.format, tmp_state.width, - tmp_state.height); - tmp_state.clean_width = tmp_state.width; - tmp_state.clean_height = tmp_state.height; + /* Copy over info from input GstVideoInfo into output GstVideoFrameState */ + tmp_state.format = GST_VIDEO_INFO_FORMAT (&tmp_info); + tmp_state.bytes_per_picture = tmp_info.size; + tmp_state.width = tmp_info.width; + tmp_state.height = tmp_info.height; + tmp_state.fps_n = tmp_info.fps_n; + tmp_state.fps_d = tmp_info.fps_d; + tmp_state.par_n = tmp_info.par_n; + tmp_state.par_d = tmp_info.par_d; + tmp_state.clean_width = tmp_info.width; + tmp_state.clean_height = tmp_info.height; tmp_state.clean_offset_left = 0; tmp_state.clean_offset_top = 0; + /* FIXME (Edward): We need flags in GstVideoInfo to know whether + * interlaced field was present in input caps */ + tmp_state.have_interlaced = tmp_state.interlaced = + GST_VIDEO_INFO_FLAG_IS_SET (&tmp_info, GST_VIDEO_FLAG_INTERLACED); + tmp_state.top_field_first = + GST_VIDEO_INFO_FLAG_IS_SET (&tmp_info, GST_VIDEO_FLAG_TFF); if (changed) { /* arrange draining pending frames */ @@ -373,10 +351,11 @@ gst_base_video_encoder_sink_setcaps (GstPad * pad, GstCaps * caps) /* and subclass should be ready to configure format at any time around */ if (base_video_encoder_class->set_format) ret = - base_video_encoder_class->set_format (base_video_encoder, &tmp_state); + base_video_encoder_class->set_format (base_video_encoder, &tmp_info); if (ret) { gst_caps_replace (&state->caps, NULL); *state = tmp_state; + *info = tmp_info; } } else { /* no need to stir things up */ @@ -394,13 +373,11 @@ exit: caps); } - g_object_unref (base_video_encoder); - return ret; } static GstCaps * -gst_base_video_encoder_sink_getcaps (GstPad * pad) +gst_base_video_encoder_sink_getcaps (GstPad * pad, GstCaps * filter) { GstBaseVideoEncoder *base_video_encoder; const GstCaps *templ_caps; @@ -441,7 +418,7 @@ gst_base_video_encoder_sink_getcaps (GstPad * pad) const GValue *val; GstStructure *s; - s = gst_structure_id_empty_new (q_name); + s = gst_structure_new_id_empty (q_name); if ((val = gst_structure_get_value (allowed_s, "width"))) gst_structure_set_value (s, "width", val); if ((val = gst_structure_get_value (allowed_s, "height"))) @@ -455,9 +432,20 @@ gst_base_video_encoder_sink_getcaps (GstPad * pad) } } + GST_LOG_OBJECT (base_video_encoder, "filtered caps (first) %" GST_PTR_FORMAT, + filter_caps); + fcaps = gst_caps_intersect (filter_caps, templ_caps); gst_caps_unref (filter_caps); + if (filter) { + GST_LOG_OBJECT (base_video_encoder, "intersecting with %" GST_PTR_FORMAT, + filter); + filter_caps = gst_caps_intersect (fcaps, filter); + gst_caps_unref (fcaps); + fcaps = filter_caps; + } + done: gst_caps_replace (&allowed, NULL); @@ -468,14 +456,37 @@ done: return fcaps; } +static gboolean +gst_base_video_encoder_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_base_video_encoder_sink_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + return res; +} + static void gst_base_video_encoder_finalize (GObject * object) { - GstBaseVideoEncoder *base_video_encoder; - + GstBaseVideoEncoder *base_video_encoder = (GstBaseVideoEncoder *) object; GST_DEBUG_OBJECT (object, "finalize"); - base_video_encoder = GST_BASE_VIDEO_ENCODER (object); gst_buffer_replace (&base_video_encoder->headers, NULL); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -492,6 +503,15 @@ gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder, GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_base_video_encoder_sink_setcaps (base_video_encoder, caps); + gst_event_unref (event); + } + break; case GST_EVENT_EOS: { GstFlowReturn flow_ret; @@ -509,27 +529,20 @@ gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder, GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; } - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - double rate; - double applied_rate; - GstFormat format; - gint64 start; - gint64 stop; - gint64 position; + const GstSegment *segment; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); - gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, - &format, &start, &stop, &position); + gst_event_parse_segment (event, &segment); GST_DEBUG_OBJECT (base_video_encoder, "newseg rate %g, applied rate %g, " "format %d, start = %" GST_TIME_FORMAT ", stop = %" GST_TIME_FORMAT - ", pos = %" GST_TIME_FORMAT, rate, applied_rate, format, - GST_TIME_ARGS (start), GST_TIME_ARGS (stop), - GST_TIME_ARGS (position)); + ", pos = %" GST_TIME_FORMAT, segment->rate, segment->applied_rate, + segment->format, GST_TIME_ARGS (segment->start), + GST_TIME_ARGS (segment->stop), GST_TIME_ARGS (segment->position)); - if (format != GST_FORMAT_TIME) { + if (segment->format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (base_video_encoder, "received non TIME newsegment"); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; @@ -537,9 +550,8 @@ gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder, base_video_encoder->at_eos = FALSE; - gst_segment_set_newsegment_full (&GST_BASE_VIDEO_CODEC - (base_video_encoder)->segment, update, rate, applied_rate, format, - start, stop, position); + gst_segment_copy_into (segment, &GST_BASE_VIDEO_CODEC + (base_video_encoder)->segment); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; } @@ -578,14 +590,15 @@ gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder, } static gboolean -gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event) +gst_base_video_encoder_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event) { GstBaseVideoEncoder *enc; GstBaseVideoEncoderClass *klass; gboolean handled = FALSE; gboolean ret = TRUE; - enc = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); + enc = GST_BASE_VIDEO_ENCODER (parent); klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (enc); GST_DEBUG_OBJECT (enc, "received event %d, %s", GST_EVENT_TYPE (event), @@ -623,17 +636,17 @@ gst_base_video_encoder_sink_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (enc, "event handled"); - gst_object_unref (enc); return ret; } static gboolean -gst_base_video_encoder_src_event (GstPad * pad, GstEvent * event) +gst_base_video_encoder_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) { GstBaseVideoEncoder *base_video_encoder; gboolean ret = FALSE; - base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); + base_video_encoder = GST_BASE_VIDEO_ENCODER (parent); GST_LOG_OBJECT (base_video_encoder, "handling event: %" GST_PTR_FORMAT, event); @@ -677,31 +690,17 @@ gst_base_video_encoder_src_event (GstPad * pad, GstEvent * event) break; } - gst_object_unref (base_video_encoder); return ret; } -static const GstQueryType * -gst_base_video_encoder_get_query_types (GstPad * pad) -{ - static const GstQueryType query_types[] = { - GST_QUERY_CONVERT, - GST_QUERY_LATENCY, - 0 - }; - - return query_types; -} - static gboolean -gst_base_video_encoder_src_query (GstPad * pad, GstQuery * query) +gst_base_video_encoder_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) { GstBaseVideoEncoder *enc; gboolean res; - GstPad *peerpad; - enc = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); - peerpad = gst_pad_get_peer (GST_BASE_VIDEO_CODEC_SINK_PAD (enc)); + enc = GST_BASE_VIDEO_ENCODER (parent); GST_LOG_OBJECT (enc, "handling query: %" GST_PTR_FORMAT, query); @@ -725,7 +724,7 @@ gst_base_video_encoder_src_query (GstPad * pad, GstQuery * query) gboolean live; GstClockTime min_latency, max_latency; - res = gst_pad_query (peerpad, query); + res = gst_pad_peer_query (GST_BASE_VIDEO_CODEC_SINK_PAD (enc), query); if (res) { gst_query_parse_latency (query, &live, &min_latency, &max_latency); GST_DEBUG_OBJECT (enc, "Peer latency: live %d, min %" @@ -744,42 +743,36 @@ gst_base_video_encoder_src_query (GstPad * pad, GstQuery * query) } break; default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); } - gst_object_unref (peerpad); - gst_object_unref (enc); return res; + /* ERRORS */ error: - GST_DEBUG_OBJECT (enc, "query failed"); - gst_object_unref (peerpad); - gst_object_unref (enc); - return res; + { + GST_DEBUG_OBJECT (enc, "query failed"); + return res; + } } static GstFlowReturn -gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf) +gst_base_video_encoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstBaseVideoEncoder *base_video_encoder; GstBaseVideoEncoderClass *klass; - GstVideoFrame *frame; + GstVideoFrameState *frame; GstFlowReturn ret = GST_FLOW_OK; - base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); + base_video_encoder = GST_BASE_VIDEO_ENCODER (parent); klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); g_return_val_if_fail (klass->handle_frame != NULL, GST_FLOW_ERROR); GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); - if (!GST_PAD_CAPS (pad)) { - ret = GST_FLOW_NOT_NEGOTIATED; - goto done; - } - GST_LOG_OBJECT (base_video_encoder, - "received buffer of size %d with ts %" GST_TIME_FORMAT - ", duration %" GST_TIME_FORMAT, GST_BUFFER_SIZE (buf), + "received buffer of size %" G_GSIZE_FORMAT " with ts %" GST_TIME_FORMAT + ", duration %" GST_TIME_FORMAT, gst_buffer_get_size (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); @@ -789,10 +782,10 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf) } if (base_video_encoder->sink_clipping) { - gint64 start = GST_BUFFER_TIMESTAMP (buf); - gint64 stop = start + GST_BUFFER_DURATION (buf); - gint64 clip_start; - gint64 clip_stop; + guint64 start = GST_BUFFER_TIMESTAMP (buf); + guint64 stop = start + GST_BUFFER_DURATION (buf); + guint64 clip_start; + guint64 clip_stop; if (!gst_segment_clip (&GST_BASE_VIDEO_CODEC (base_video_encoder)->segment, GST_FORMAT_TIME, start, stop, &clip_start, &clip_stop)) { @@ -874,8 +867,6 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf) done: GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); - g_object_unref (base_video_encoder); - return ret; } @@ -930,7 +921,7 @@ stop_error: /** * gst_base_video_encoder_finish_frame: * @base_video_encoder: a #GstBaseVideoEncoder - * @frame: an encoded #GstVideoFrame + * @frame: an encoded #GstVideoFrameState * * @frame must have a valid encoded data buffer, whose metadata fields * are then appropriately set according to frame data or no buffer at @@ -942,7 +933,7 @@ stop_error: */ GstFlowReturn gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, - GstVideoFrame * frame) + GstVideoFrameState * frame) { GstFlowReturn ret = GST_FLOW_OK; GstBaseVideoEncoderClass *base_video_encoder_class; @@ -959,7 +950,7 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, /* Push all pending events that arrived before this frame */ for (l = base_video_encoder->base_video_codec.frames; l; l = l->next) { - GstVideoFrame *tmp = l->data; + GstVideoFrameState *tmp = l->data; if (tmp->events) { GList *k; @@ -992,6 +983,8 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, (base_video_encoder)->segment, GST_FORMAT_TIME, frame->presentation_timestamp); + /* re-use upstream event if any so it also conveys any additional + * info upstream arranged in there */ GST_OBJECT_LOCK (base_video_encoder); for (l = base_video_encoder->force_key_unit; l; l = l->next) { ForcedKeyUnitEvent *tmp = l->data; @@ -1035,7 +1028,7 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, if (fevt->all_headers) { if (base_video_encoder->headers) { headers = gst_buffer_ref (base_video_encoder->headers); - headers = gst_buffer_make_metadata_writable (headers); + headers = gst_buffer_make_writable (headers); } } @@ -1048,6 +1041,7 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, } if (frame->is_sync_point) { + GST_LOG_OBJECT (base_video_encoder, "key frame"); base_video_encoder->distance_from_sync = 0; GST_BUFFER_FLAG_UNSET (frame->src_buffer, GST_BUFFER_FLAG_DELTA_UNIT); } else { @@ -1078,7 +1072,7 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, /* update rate estimate */ GST_BASE_VIDEO_CODEC (base_video_encoder)->bytes += - GST_BUFFER_SIZE (frame->src_buffer); + gst_buffer_get_size (frame->src_buffer); if (GST_CLOCK_TIME_IS_VALID (frame->presentation_duration)) { GST_BASE_VIDEO_CODEC (base_video_encoder)->time += frame->presentation_duration; @@ -1093,15 +1087,6 @@ gst_base_video_encoder_finish_frame (GstBaseVideoEncoder * base_video_encoder, GST_BASE_VIDEO_CODEC (base_video_encoder)->discont = FALSE; } - gst_buffer_set_caps (GST_BUFFER (frame->src_buffer), - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder))); - - if (G_UNLIKELY (headers)) { - gst_buffer_set_caps (headers, - GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder))); - gst_pad_push (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_encoder), headers); - } - if (base_video_encoder_class->shape_output) { ret = base_video_encoder_class->shape_output (base_video_encoder, frame); } else { @@ -1116,7 +1101,7 @@ done: GST_BASE_VIDEO_CODEC (base_video_encoder)->frames = g_list_remove (GST_BASE_VIDEO_CODEC (base_video_encoder)->frames, frame); - gst_video_frame_unref (frame); + gst_video_frame_state_unref (frame); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); @@ -1189,9 +1174,9 @@ gst_base_video_encoder_set_latency_fields (GstBaseVideoEncoder * * gst_base_video_encoder_get_oldest_frame: * @base_video_encoder: a #GstBaseVideoEncoder * - * Returns: oldest unfinished pending #GstVideoFrame + * Returns: oldest unfinished pending #GstVideoFrameState */ -GstVideoFrame * +GstVideoFrameState * gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder * base_video_encoder) { @@ -1203,7 +1188,7 @@ gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder * if (g == NULL) return NULL; - return (GstVideoFrame *) (g->data); + return (GstVideoFrameState *) (g->data); } /* FIXME there could probably be more of these; diff --git a/gst-libs/gst/video/gstbasevideoencoder.h b/gst-libs/gst/video/gstbasevideoencoder.h index 6e2aa7095..547d0ac2d 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.h +++ b/gst-libs/gst/video/gstbasevideoencoder.h @@ -112,7 +112,7 @@ struct _GstBaseVideoEncoder * Allows closing external resources. * @set_format: Optional. * Notifies subclass of incoming data format. - * GstVideoState fields have already been + * GstVideoInfo fields have already been * set according to provided caps. * @handle_frame: Provides input frame to subclass. * @finish: Optional. @@ -143,16 +143,16 @@ struct _GstBaseVideoEncoderClass gboolean (*stop) (GstBaseVideoEncoder *coder); gboolean (*set_format) (GstBaseVideoEncoder *coder, - GstVideoState *state); + GstVideoInfo *info); GstFlowReturn (*handle_frame) (GstBaseVideoEncoder *coder, - GstVideoFrame *frame); + GstVideoFrameState *frame); gboolean (*reset) (GstBaseVideoEncoder *coder); GstFlowReturn (*finish) (GstBaseVideoEncoder *coder); GstFlowReturn (*shape_output) (GstBaseVideoEncoder *coder, - GstVideoFrame *frame); + GstVideoFrameState *frame); gboolean (*event) (GstBaseVideoEncoder *coder, GstEvent *event); @@ -166,9 +166,9 @@ GType gst_base_video_encoder_get_type (void); const GstVideoState* gst_base_video_encoder_get_state (GstBaseVideoEncoder *coder); -GstVideoFrame* gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *coder); +GstVideoFrameState* gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *coder); GstFlowReturn gst_base_video_encoder_finish_frame (GstBaseVideoEncoder *base_video_encoder, - GstVideoFrame *frame); + GstVideoFrameState *frame); void gst_base_video_encoder_set_latency (GstBaseVideoEncoder *base_video_encoder, GstClockTime min_latency, GstClockTime max_latency); diff --git a/gst-libs/gst/video/gstsurfacebuffer.h b/gst-libs/gst/video/gstsurfacebuffer.h deleted file mode 100644 index 6ce660572..000000000 --- a/gst-libs/gst/video/gstsurfacebuffer.h +++ /dev/null @@ -1,93 +0,0 @@ -/* GStreamer - * Copyright (C) 2011 Collabora Ltd. - * Copyright (C) 2011 Intel - * - * Author: Nicolas Dufresne <nicolas.dufresne@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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef _GST_SURFACE_BUFFER_H_ -#define _GST_SURFACE_BUFFER_H_ - -#ifndef GST_USE_UNSTABLE_API -#warning "GstSurfaceBuffer 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 <gst/video/gstsurfaceconverter.h> - -G_BEGIN_DECLS - -#define GST_TYPE_SURFACE_BUFFER (gst_surface_buffer_get_type()) -#define GST_SURFACE_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SURFACE_BUFFER,GstSurfaceBuffer)) -#define GST_SURFACE_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SURFACE_BUFFER,GstSurfaceBufferClass)) -#define GST_SURFACE_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_SURFACE_BUFFER,GstSurfaceBufferClass)) -#define GST_IS_SURFACE_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SURFACE_BUFFER)) -#define GST_IS_SURFACE_BUFFER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SURFACE_BUFFER)) - -/** - * GST_VIDEO_CAPS_SURFACE: - * - * Base caps for GstSurfaceBuffer. Implementation specific type must be marked - * using the type attribute (e.g. type=vaapi). Available convertion shall be - * specified using boolean attributes (e.g. opengl=true). - */ -#define GST_VIDEO_CAPS_SURFACE "video/x-surface" - -typedef struct _GstSurfaceBufferClass GstSurfaceBufferClass; - -/** - * GstSurfaceBuffer: - * @parent: parent object - */ -struct _GstSurfaceBuffer -{ - GstBuffer parent; - - /*< private >*/ - void *padding[GST_PADDING]; -}; - -/** - * GstSurfaceBufferClass: - * @parent_class: parent class type. - * @create_converter: vmethod to create a converter. - * - * #GstVideoContextInterface interface. - */ -struct _GstSurfaceBufferClass -{ - GstBufferClass parent_class; - - GstSurfaceConverter * (*create_converter) (GstSurfaceBuffer *buffer, - const gchar *type, - GValue *dest); - - /*< private >*/ - void *padding[GST_PADDING]; -}; - -GType gst_surface_buffer_get_type (void); - -GstSurfaceConverter *gst_surface_buffer_create_converter (GstSurfaceBuffer *buffer, - const gchar *type, - GValue *dest); - -G_END_DECLS - -#endif diff --git a/gst-libs/gst/video/gstsurfaceconverter.c b/gst-libs/gst/video/gstsurfaceconverter.c index c482ff12e..23fc5dd44 100644 --- a/gst-libs/gst/video/gstsurfaceconverter.c +++ b/gst-libs/gst/video/gstsurfaceconverter.c @@ -25,7 +25,7 @@ #endif #include "gstsurfaceconverter.h" -#include "gstsurfacebuffer.h" +#include "gstsurfacemeta.h" /** * SECTION:gstsurfaceconverter @@ -63,7 +63,7 @@ gst_surface_converter_default_init (GstSurfaceConverterInterface * iface) /** * gst_surface_converter_upload: * @converter: a #GstSurfaceConverter - * @buffer: the #GstSurfaceBuffer to upload + * @buffer: the #GstBuffer to upload * * Convert and uploads the #GstSurfaceBuffer to the converter destination. * @@ -71,10 +71,10 @@ gst_surface_converter_default_init (GstSurfaceConverterInterface * iface) */ gboolean gst_surface_converter_upload (GstSurfaceConverter * converter, - GstSurfaceBuffer * buffer) + GstBuffer * buffer) { g_return_val_if_fail (GST_IS_SURFACE_CONVERTER (converter), FALSE); - g_return_val_if_fail (GST_IS_SURFACE_BUFFER (buffer), FALSE); + g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); return GST_SURFACE_CONVERTER_GET_IFACE (converter)->upload (converter, buffer); } diff --git a/gst-libs/gst/video/gstsurfaceconverter.h b/gst-libs/gst/video/gstsurfaceconverter.h index c8fdcc804..702494498 100644 --- a/gst-libs/gst/video/gstsurfaceconverter.h +++ b/gst-libs/gst/video/gstsurfaceconverter.h @@ -32,12 +32,9 @@ G_BEGIN_DECLS -/* Forward declaration from gstsurfacebuffer.h */ -typedef struct _GstSurfaceBuffer GstSurfaceBuffer; - #define GST_TYPE_SURFACE_CONVERTER (gst_surface_converter_get_type ()) -#define GST_SURFACE_CONVERTER(obj) (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SURFACE_CONVERTER, GstSurfaceConverter)) -#define GST_IS_SURFACE_CONVERTER(obj) (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SURFACE_CONVERTER)) +#define GST_SURFACE_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SURFACE_CONVERTER, GstSurfaceConverter)) +#define GST_IS_SURFACE_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SURFACE_CONVERTER)) #define GST_SURFACE_CONVERTER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_SURFACE_CONVERTER, GstSurfaceConverterInterface)) typedef struct _GstSurfaceConverter GstSurfaceConverter; @@ -55,13 +52,13 @@ struct _GstSurfaceConverterInterface GTypeInterface parent; gboolean (*upload) (GstSurfaceConverter *converter, - GstSurfaceBuffer *buffer); + GstBuffer *buffer); }; GType gst_surface_converter_get_type (void); gboolean gst_surface_converter_upload (GstSurfaceConverter *converter, - GstSurfaceBuffer *buffer); + GstBuffer *buffer); G_END_DECLS diff --git a/gst-libs/gst/video/gstsurfacebuffer.c b/gst-libs/gst/video/gstsurfacemeta.c index 61bf4eeba..399e649e7 100644 --- a/gst-libs/gst/video/gstsurfacebuffer.c +++ b/gst-libs/gst/video/gstsurfacemeta.c @@ -24,13 +24,13 @@ #include "config.h" #endif -#include "gstsurfacebuffer.h" +#include "gstsurfacemeta.h" /** - * SECTION:gstsurfacebuffer - * @short_description: Accelerated surface base class + * SECTION:gstsurfacemeta + * @short_description: Accelerated surface metadata * - * This base class is used to abstract hardware accelerated buffers and enable + * This meta data is used to abstract hardware accelerated buffers and enable * generic convertion to standard type such as GL textures. The media type for * those buffers is defined by #GST_VIDEO_CAPS_SURFACE. An implementation * specific type must be set using the "type" key (e.g. type="vaapi"). @@ -44,30 +44,25 @@ * </note> */ -G_DEFINE_TYPE (GstSurfaceBuffer, gst_surface_buffer, GST_TYPE_BUFFER); -static GstSurfaceConverter * -gst_surface_buffer_default_create_converter (GstSurfaceBuffer * surface, - const gchar * type, GValue * dest) +const GstMetaInfo * +gst_surface_meta_get_info (void) { - return NULL; -} + static const GstMetaInfo *meta_info = NULL; -static void -gst_surface_buffer_class_init (GstSurfaceBufferClass * klass) -{ - klass->create_converter = gst_surface_buffer_default_create_converter; -} - -static void -gst_surface_buffer_init (GstSurfaceBuffer * surface) -{ - /* Nothing to do */ + if (meta_info == NULL) { + meta_info = gst_meta_register ("GstSurfaceMeta", "GstSurfaceMeta", + sizeof (GstSurfaceMeta), + (GstMetaInitFunction) NULL, + (GstMetaFreeFunction) NULL, + (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL); + } + return meta_info; } /** - * gst_surface_buffer_create_converter: - * @buffer: a #GstSurfaceBuffer + * gst_surface_meta_create_converter: + * @meta: a #GstSurfaceMeta * @type: the type to convert to * @dest: a #GValue containing the destination to upload * @@ -79,10 +74,10 @@ gst_surface_buffer_init (GstSurfaceBuffer * surface) * Returns: newly allocated #GstSurfaceConverter */ GstSurfaceConverter * -gst_surface_buffer_create_converter (GstSurfaceBuffer * buffer, +gst_surface_meta_create_converter (GstSurfaceMeta * meta, const gchar * type, GValue * dest) { - g_return_val_if_fail (GST_IS_SURFACE_BUFFER (buffer), FALSE); - return GST_SURFACE_BUFFER_GET_CLASS (buffer)->create_converter (buffer, - type, dest); + g_return_val_if_fail (meta != NULL, FALSE); + + return meta->create_converter (meta, type, dest); } diff --git a/gst-libs/gst/video/gstsurfacemeta.h b/gst-libs/gst/video/gstsurfacemeta.h new file mode 100644 index 000000000..8ff26cdfb --- /dev/null +++ b/gst-libs/gst/video/gstsurfacemeta.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2011 Intel + * + * Author: Nicolas Dufresne <nicolas.dufresne@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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef _GST_SURFACE_META_H_ +#define _GST_SURFACE_META_H_ + +#ifndef GST_USE_UNSTABLE_API +#warning "GstSurfaceBuffer 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 <gst/video/gstsurfaceconverter.h> + +G_BEGIN_DECLS + +typedef struct _GstSurfaceMeta GstSurfaceMeta; + +/** + * GstSurfaceMeta: + * @create_converter: vmethod to create a converter. + * + */ +struct _GstSurfaceMeta { + GstMeta meta; + + GstSurfaceConverter * (*create_converter) (GstSurfaceMeta *meta, + const gchar *type, + GValue *dest); +}; + +const GstMetaInfo *gst_surface_meta_get_info (void); +#define GST_SURFACE_META_INFO (gst_surface_meta_get_info()) + +#define gst_buffer_get_surface_meta(b) \ + ((GstSurfaceMeta*)gst_buffer_get_meta((b),GST_SURFACE_META_INFO)) +#define gst_buffer_add_surface_meta(b) \ + ((GstSurfaceMeta*)gst_buffer_add_meta((b),GST_SURFACE_META_INFO,NULL)) + +GstSurfaceConverter *gst_surface_meta_create_converter (GstSurfaceMeta *meta, + const gchar *type, + GValue *dest); + +G_END_DECLS + +#endif diff --git a/gst-libs/gst/video/videocontext.c b/gst-libs/gst/video/videocontext.c index a5458a2e2..489cf06a7 100644 --- a/gst-libs/gst/video/videocontext.c +++ b/gst-libs/gst/video/videocontext.c @@ -184,9 +184,10 @@ gst_video_context_new_structure (const gchar ** types) } static gboolean -gst_video_context_pad_query (gpointer item, GValue * value, gpointer user_data) +gst_video_context_pad_query (const GValue * item, GValue * value, + gpointer user_data) { - GstPad *pad = GST_PAD (item); + GstPad *pad = g_value_get_object (item); GstQuery *query = user_data; gboolean res; @@ -353,7 +354,7 @@ gst_video_context_message_parse_prepare (GstMessage * message, if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) return FALSE; - if (!gst_structure_has_name (message->structure, "prepare-video-context")) + if (!gst_message_has_name (message, "prepare-video-context")) return FALSE; if (!GST_IS_VIDEO_CONTEXT (src)) @@ -384,7 +385,7 @@ GstQuery * gst_video_context_query_new (const gchar ** types) { GstStructure *structure = gst_video_context_new_structure (types); - return gst_query_new_application (GST_QUERY_CUSTOM, structure); + return gst_query_new_custom (GST_QUERY_CUSTOM, structure); } /** @@ -440,7 +441,7 @@ gst_video_context_run_query (GstElement * element, GstQuery * query) const gchar ** gst_video_context_query_get_supported_types (GstQuery * query) { - GstStructure *structure = gst_query_get_structure (query); + const GstStructure *structure = gst_query_get_structure (query); const GValue *value = gst_structure_get_value (structure, "types"); if (G_VALUE_HOLDS (value, G_TYPE_STRV)) @@ -461,7 +462,7 @@ void gst_video_context_query_parse_value (GstQuery * query, const gchar ** type, const GValue ** value) { - GstStructure *structure = gst_query_get_structure (query); + const GstStructure *structure = gst_query_get_structure (query); if (type) *type = gst_structure_get_string (structure, "video-context-type"); @@ -482,7 +483,7 @@ void gst_video_context_query_set_value (GstQuery * query, const gchar * type, GValue * value) { - GstStructure *structure = gst_query_get_structure (query); + GstStructure *structure = gst_query_writable_structure (query); gst_structure_set (structure, "video-context-type", G_TYPE_STRING, type, "video-context", G_TYPE_VALUE, value, NULL); } @@ -499,7 +500,7 @@ void gst_video_context_query_set_string (GstQuery * query, const gchar * type, const gchar * value) { - GstStructure *structure = gst_query_get_structure (query); + GstStructure *structure = gst_query_writable_structure (query); gst_structure_set (structure, "video-context-type", G_TYPE_STRING, type, "video-context", G_TYPE_STRING, value, NULL); } @@ -516,7 +517,7 @@ void gst_video_context_query_set_pointer (GstQuery * query, const gchar * type, gpointer value) { - GstStructure *structure = gst_query_get_structure (query); + GstStructure *structure = gst_query_writable_structure (query); gst_structure_set (structure, "video-context-type", G_TYPE_STRING, type, "video-context", G_TYPE_POINTER, value, NULL); } @@ -533,7 +534,7 @@ void gst_video_context_query_set_object (GstQuery * query, const gchar * type, GObject * value) { - GstStructure *structure = gst_query_get_structure (query); + GstStructure *structure = gst_query_writable_structure (query); gst_structure_set (structure, "video-context-type", G_TYPE_STRING, type, "video-context", G_TYPE_OBJECT, value, NULL); } diff --git a/gst-libs/gst/video/videocontext.h b/gst-libs/gst/video/videocontext.h index 5becb5616..98d4b5423 100644 --- a/gst-libs/gst/video/videocontext.h +++ b/gst-libs/gst/video/videocontext.h @@ -36,8 +36,8 @@ G_BEGIN_DECLS #define GST_TYPE_VIDEO_CONTEXT (gst_video_context_iface_get_type ()) -#define GST_VIDEO_CONTEXT(obj) (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_CONTEXT, GstVideoContext)) -#define GST_IS_VIDEO_CONTEXT(obj) (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_CONTEXT)) +#define GST_VIDEO_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_CONTEXT, GstVideoContext)) +#define GST_IS_VIDEO_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_CONTEXT)) #define GST_VIDEO_CONTEXT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VIDEO_CONTEXT, GstVideoContextInterface)) /** diff --git a/gst/adpcmdec/adpcmdec.c b/gst/adpcmdec/adpcmdec.c index b97584cb9..0fcfeb03f 100644 --- a/gst/adpcmdec/adpcmdec.c +++ b/gst/adpcmdec/adpcmdec.c @@ -562,10 +562,10 @@ adpcmdec_class_init (ADPCMDecClass * klass) adpcmdec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &adpcmdec_sink_template); - gst_element_class_add_static_pad_template (element_class, - &adpcmdec_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&adpcmdec_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&adpcmdec_src_template)); gst_element_class_set_details_simple (element_class, "ADPCM decoder", "Codec/Decoder/Audio", "Decode MS and IMA ADPCM audio", diff --git a/gst/adpcmenc/adpcmenc.c b/gst/adpcmenc/adpcmenc.c index d8ce1db49..5f6a24424 100644 --- a/gst/adpcmenc/adpcmenc.c +++ b/gst/adpcmenc/adpcmenc.c @@ -544,10 +544,10 @@ adpcmenc_class_init (ADPCMEncClass * klass) adpcmenc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &adpcmenc_sink_template); - gst_element_class_add_static_pad_template (element_class, - &adpcmenc_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&adpcmenc_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&adpcmenc_src_template)); gst_element_class_set_details_simple (element_class, "ADPCM encoder", "Codec/Encoder/Audio", "Encode ADPCM audio", diff --git a/gst/aiff/aiffmux.c b/gst/aiff/aiffmux.c index 0d2772af5..a2d99f587 100644 --- a/gst/aiff/aiffmux.c +++ b/gst/aiff/aiffmux.c @@ -110,8 +110,10 @@ gst_aiff_mux_base_init (gpointer gclass) "AIFF audio muxer", "Muxer/Audio", "Multiplex raw audio into AIFF", "Robert Swain <robert.swain@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } static GstStateChangeReturn diff --git a/gst/aiff/aiffparse.c b/gst/aiff/aiffparse.c index 6dbee6868..575b309b5 100644 --- a/gst/aiff/aiffparse.c +++ b/gst/aiff/aiffparse.c @@ -105,10 +105,10 @@ gst_aiff_parse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &sink_template_factory); - gst_element_class_add_static_pad_template (element_class, - &src_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template_factory)); gst_element_class_set_details_simple (element_class, "AIFF audio demuxer", "Codec/Demuxer/Audio", diff --git a/gst/asfmux/gstasfmux.c b/gst/asfmux/gstasfmux.c index 44f7f1625..e7184f601 100644 --- a/gst/asfmux/gstasfmux.c +++ b/gst/asfmux/gstasfmux.c @@ -136,13 +136,13 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", ); static GstStaticPadTemplate video_sink_factory = -GST_STATIC_PAD_TEMPLATE ("video_%d", +GST_STATIC_PAD_TEMPLATE ("video_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/x-wmv, wmvversion = (int) [1,3]")); static GstStaticPadTemplate audio_sink_factory = - GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_STATIC_PAD_TEMPLATE ("audio_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/x-wma, wmaversion = (int) [1,3]; " @@ -165,7 +165,7 @@ static GstStateChangeReturn gst_asf_mux_change_state (GstElement * element, static gboolean gst_asf_mux_sink_event (GstPad * pad, GstEvent * event); static void gst_asf_mux_pad_reset (GstAsfPad * data); -static GstFlowReturn gst_asf_mux_collected (GstCollectPads2 * collect, +static GstFlowReturn gst_asf_mux_collected (GstCollectPads * collect, gpointer data); static GstElementClass *parent_class = NULL; @@ -238,11 +238,12 @@ gst_asf_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &audio_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_factory)); gst_element_class_set_details_simple (element_class, "ASF muxer", "Codec/Muxer", diff --git a/gst/asfmux/gstasfparse.c b/gst/asfmux/gstasfparse.c index 4f7bc59ba..ab1f69152 100644 --- a/gst/asfmux/gstasfparse.c +++ b/gst/asfmux/gstasfparse.c @@ -469,8 +469,10 @@ gst_asf_parse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "ASF parser", "Parser", "Parses ASF", "Thiago Santos <thiagoss@embedded.ufcg.edu.br>"); diff --git a/gst/asfmux/gstrtpasfpay.c b/gst/asfmux/gstrtpasfpay.c index 22ad431e3..157533f92 100644 --- a/gst/asfmux/gstrtpasfpay.c +++ b/gst/asfmux/gstrtpasfpay.c @@ -85,10 +85,10 @@ gst_rtp_asf_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_asf_pay_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_asf_pay_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_asf_pay_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_asf_pay_src_template)); gst_element_class_set_details_simple (element_class, "RTP ASF payloader", "Codec/Payloader/Network", "Payload-encodes ASF into RTP packets (MS_RTSP)", diff --git a/gst/audiobuffer/gstaudioringbuffer.c b/gst/audiobuffer/gstaudioringbuffer.c index 6d87df2a4..e3bc47a56 100644 --- a/gst/audiobuffer/gstaudioringbuffer.c +++ b/gst/audiobuffer/gstaudioringbuffer.c @@ -320,10 +320,10 @@ gst_audio_ringbuffer_class_init (GstAudioRingbufferClass * klass) G_MAXINT64, DEFAULT_SEGMENT_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - gst_element_class_add_static_pad_template (gstelement_class, - &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, - &sinktemplate); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (gstelement_class, "AudioRingbuffer", "Generic", diff --git a/gst/audiovisualizers/Makefile.am b/gst/audiovisualizers/Makefile.am index f6ee5299d..c83f84a35 100644 --- a/gst/audiovisualizers/Makefile.am +++ b/gst/audiovisualizers/Makefile.am @@ -9,11 +9,11 @@ libgstaudiovisualizers_la_SOURCES = plugin.c \ libgstaudiovisualizers_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) + $(GST_CFLAGS) libgstaudiovisualizers_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ -lgstvideo-$(GST_MAJORMINOR) -lgstfft-$(GST_MAJORMINOR) \ - $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(LIBM) + $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstaudiovisualizers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaudiovisualizers_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/audiovisualizers/gstbaseaudiovisualizer.c b/gst/audiovisualizers/gstbaseaudiovisualizer.c index 6d42b7dc5..0c8ba7df0 100644 --- a/gst/audiovisualizers/gstbaseaudiovisualizer.c +++ b/gst/audiovisualizers/gstbaseaudiovisualizer.c @@ -33,7 +33,6 @@ #include "config.h" #endif #include <string.h> -#include <gst/controller/gstcontroller.h> #include "gstbaseaudiovisualizer.h" @@ -64,13 +63,24 @@ static void gst_base_audio_visualizer_dispose (GObject * object); static gboolean gst_base_audio_visualizer_src_negotiate (GstBaseAudioVisualizer * scope); -static gboolean gst_base_audio_visualizer_src_setcaps (GstPad * pad, - GstCaps * caps); -static gboolean gst_base_audio_visualizer_sink_setcaps (GstPad * pad, - GstCaps * caps); +static gboolean gst_base_audio_visualizer_src_setcaps (GstBaseAudioVisualizer * + scope, GstCaps * caps); +static gboolean gst_base_audio_visualizer_sink_setcaps (GstBaseAudioVisualizer * + scope, GstCaps * caps); static GstFlowReturn gst_base_audio_visualizer_chain (GstPad * pad, - GstBuffer * buffer); + GstObject * parent, GstBuffer * buffer); + +static gboolean gst_base_audio_visualizer_src_event (GstPad * pad, + GstObject * parent, GstEvent * event); +static gboolean gst_base_audio_visualizer_sink_event (GstPad * pad, + GstObject * parent, GstEvent * event); + +static gboolean gst_base_audio_visualizer_src_query (GstPad * pad, + GstObject * parent, GstQuery * query); +static gboolean gst_base_audio_visualizer_sink_query (GstPad * pad, + GstObject * parent, GstQuery * query); + static GstStateChangeReturn gst_base_audio_visualizer_change_state (GstElement * element, GstStateChange transition); @@ -456,16 +466,20 @@ gst_base_audio_visualizer_init (GstBaseAudioVisualizer * scope, scope->sinkpad = gst_pad_new_from_template (pad_template, "sink"); gst_pad_set_chain_function (scope->sinkpad, GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_chain)); - gst_pad_set_setcaps_function (scope->sinkpad, - GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_sink_setcaps)); + gst_pad_set_event_function (scope->sinkpad, + GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_sink_event)); + gst_pad_set_query_function (scope->sinkpad, + GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_sink_query)); gst_element_add_pad (GST_ELEMENT (scope), scope->sinkpad); pad_template = gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src"); g_return_if_fail (pad_template != NULL); scope->srcpad = gst_pad_new_from_template (pad_template, "src"); - gst_pad_set_setcaps_function (scope->srcpad, - GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_src_setcaps)); + gst_pad_set_event_function (scope->srcpad, + GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_src_event)); + gst_pad_set_query_function (scope->srcpad, + GST_DEBUG_FUNCPTR (gst_base_audio_visualizer_src_query)); gst_element_add_pad (GST_ELEMENT (scope), scope->srcpad); scope->adapter = gst_adapter_new (); @@ -487,8 +501,6 @@ gst_base_audio_visualizer_init (GstBaseAudioVisualizer * scope, scope->rate = GST_AUDIO_DEF_RATE; scope->channels = 2; - scope->next_ts = GST_CLOCK_TIME_NONE; - scope->config_lock = g_mutex_new (); } @@ -555,16 +567,27 @@ gst_base_audio_visualizer_dispose (GObject * object) G_OBJECT_CLASS (parent_class)->dispose (object); } +static void +gst_base_audio_visualizer_reset (GstBaseAudioVisualizer * scope) +{ + gst_adapter_clear (scope->adapter); + gst_segment_init (&scope->segment, GST_FORMAT_UNDEFINED); + + GST_OBJECT_LOCK (scope); + scope->proportion = 1.0; + scope->earliest_time = -1; + GST_OBJECT_UNLOCK (scope); +} + static gboolean -gst_base_audio_visualizer_sink_setcaps (GstPad * pad, GstCaps * caps) +gst_base_audio_visualizer_sink_setcaps (GstBaseAudioVisualizer * scope, + GstCaps * caps) { - GstBaseAudioVisualizer *scope; GstStructure *structure; gint channels; gint rate; gboolean res = TRUE; - scope = GST_BASE_AUDIO_VISUALIZER (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "channels", &channels) || @@ -584,7 +607,6 @@ gst_base_audio_visualizer_sink_setcaps (GstPad * pad, GstCaps * caps) scope->channels, scope->rate); done: - gst_object_unref (scope); return res; /* Errors */ @@ -610,27 +632,81 @@ wrong_rate: } static gboolean +gst_base_audio_visualizer_src_setcaps (GstBaseAudioVisualizer * scope, + GstCaps * caps) +{ + GstBaseAudioVisualizerClass *klass; + GstStructure *structure; + gboolean res; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "width", &scope->width) || + !gst_structure_get_int (structure, "height", &scope->height) || + !gst_structure_get_fraction (structure, "framerate", &scope->fps_n, + &scope->fps_d)) + goto error; + + klass = GST_BASE_AUDIO_VISUALIZER_CLASS (G_OBJECT_GET_CLASS (scope)); + + //scope->video_format = format; ?? + + scope->frame_duration = gst_util_uint64_scale_int (GST_SECOND, + scope->fps_d, scope->fps_n); + scope->spf = gst_util_uint64_scale_int (scope->rate, + scope->fps_d, scope->fps_n); + scope->req_spf = scope->spf; + + scope->bpf = scope->width * scope->height * 4; + + if (scope->pixelbuf) + g_free (scope->pixelbuf); + scope->pixelbuf = g_malloc0 (scope->bpf); + + if (klass->setup) + res = klass->setup (scope); + + GST_DEBUG_OBJECT (scope, "video: dimension %dx%d, framerate %d/%d", + scope->width, scope->height, scope->fps_n, scope->fps_d); + GST_DEBUG_OBJECT (scope, "blocks: spf %u, req_spf %u", + scope->spf, scope->req_spf); + + res = gst_pad_push_event (scope->srcpad, gst_event_new_caps (caps)); + + return res; + + /* ERRORS */ +error: + { + GST_DEBUG_OBJECT (scope, "error parsing caps"); + return FALSE; + } +} + +static gboolean gst_base_audio_visualizer_src_negotiate (GstBaseAudioVisualizer * scope) { - GstCaps *othercaps, *target, *intersect; + GstCaps *othercaps, *target; GstStructure *structure; - const GstCaps *templ; + GstCaps *templ; + GstQuery *query; + GstBufferPool *pool = NULL; + guint size, min, max, prefix, alignment; templ = gst_pad_get_pad_template_caps (scope->srcpad); GST_DEBUG_OBJECT (scope, "performing negotiation"); /* see what the peer can do */ - othercaps = gst_pad_peer_get_caps (scope->srcpad); + othercaps = gst_pad_peer_query_caps (scope->srcpad, NULL); if (othercaps) { - intersect = gst_caps_intersect (othercaps, templ); + target = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); + gst_caps_unref (templ); - if (gst_caps_is_empty (intersect)) + if (gst_caps_is_empty (target)) goto no_format; - target = gst_caps_copy_nth (intersect, 0); - gst_caps_unref (intersect); + gst_caps_truncate (target); } else { target = gst_caps_ref ((GstCaps *) templ); } @@ -643,95 +719,84 @@ gst_base_audio_visualizer_src_negotiate (GstBaseAudioVisualizer * scope) GST_DEBUG_OBJECT (scope, "final caps are %" GST_PTR_FORMAT, target); - gst_pad_set_caps (scope->srcpad, target); - gst_caps_unref (target); + gst_base_audio_visualizer_src_setcaps (scope, target); - return TRUE; + /* try to get a bufferpool now */ + /* find a pool for the negotiated caps now */ + query = gst_query_new_allocation (target, TRUE); -no_format: - { - gst_caps_unref (intersect); - return FALSE; + if (gst_pad_peer_query (scope->srcpad, query)) { + /* we got configuration from our peer, parse them */ + gst_query_parse_allocation_params (query, &size, &min, &max, &prefix, + &alignment, &pool); + } else { + size = scope->bpf; + min = max = 0; + prefix = 0; + alignment = 0; } -} -static gboolean -gst_base_audio_visualizer_src_setcaps (GstPad * pad, GstCaps * caps) -{ - GstBaseAudioVisualizer *scope; - GstBaseAudioVisualizerClass *klass; - gint w, h; - gint num, denom; - GstVideoFormat format; - gboolean res = TRUE; + if (pool == NULL) { + GstStructure *config; - scope = GST_BASE_AUDIO_VISUALIZER (gst_pad_get_parent (pad)); - klass = GST_BASE_AUDIO_VISUALIZER_CLASS (G_OBJECT_GET_CLASS (scope)); + /* we did not get a pool, make one ourselves then */ + pool = gst_buffer_pool_new (); - if (!gst_video_format_parse_caps (caps, &format, &w, &h)) { - goto missing_caps_details; - } - if (!gst_video_parse_caps_framerate (caps, &num, &denom)) { - goto missing_caps_details; + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set (config, target, size, min, max, prefix, + alignment); + gst_buffer_pool_set_config (pool, config); } - g_mutex_lock (scope->config_lock); - - scope->width = w; - scope->height = h; - scope->fps_n = num; - scope->fps_d = denom; - scope->video_format = format; - - scope->frame_duration = gst_util_uint64_scale_int (GST_SECOND, - scope->fps_d, scope->fps_n); - scope->spf = gst_util_uint64_scale_int (scope->rate, - scope->fps_d, scope->fps_n); - scope->req_spf = scope->spf; + if (scope->pool) + gst_object_unref (scope->pool); + scope->pool = pool; - scope->bpf = w * h * 4; + /* and activate */ + gst_buffer_pool_set_active (pool, TRUE); - if (scope->pixelbuf) - g_free (scope->pixelbuf); - scope->pixelbuf = g_malloc0 (scope->bpf); + gst_caps_unref (target); - if (klass->setup) - res = klass->setup (scope); + return TRUE; - GST_DEBUG_OBJECT (scope, "video: dimension %dx%d, framerate %d/%d", - scope->width, scope->height, scope->fps_n, scope->fps_d); - GST_DEBUG_OBJECT (scope, "blocks: spf %u, req_spf %u", - scope->spf, scope->req_spf); +no_format: + { + gst_caps_unref (target); + return FALSE; + } +} - g_mutex_unlock (scope->config_lock); +/* make sure we are negotiated */ +static GstFlowReturn +gst_base_audio_visualizer_ensure_negotiated (GstBaseAudioVisualizer * scope) +{ + gboolean reconfigure; -done: - gst_object_unref (scope); - return res; + reconfigure = gst_pad_check_reconfigure (scope->srcpad); - /* Errors */ -missing_caps_details: - { - GST_WARNING_OBJECT (scope, - "missing width, height or framerate in the caps"); - res = FALSE; - goto done; + /* we don't know an output format yet, pick one */ + if (reconfigure || !gst_pad_has_current_caps (scope->srcpad)) { + if (!gst_base_audio_visualizer_src_negotiate (scope)) + return GST_FLOW_NOT_NEGOTIATED; } + return GST_FLOW_OK; } static GstFlowReturn -gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) +gst_base_audio_visualizer_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; GstBaseAudioVisualizer *scope; GstBaseAudioVisualizerClass *klass; GstBuffer *inbuf; + guint64 dist, ts; guint avail, sbpf; - guint8 *adata; + gpointer adata, vdata; gboolean (*render) (GstBaseAudioVisualizer * scope, GstBuffer * audio, GstBuffer * video); - scope = GST_BASE_AUDIO_VISUALIZER (gst_pad_get_parent (pad)); + scope = GST_BASE_AUDIO_VISUALIZER (parent); klass = GST_BASE_AUDIO_VISUALIZER_CLASS (G_OBJECT_GET_CLASS (scope)); render = klass->render; @@ -740,18 +805,19 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) /* resync on DISCONT */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { - scope->next_ts = GST_CLOCK_TIME_NONE; gst_adapter_clear (scope->adapter); } - if (GST_PAD_CAPS (scope->srcpad) == NULL) { - if (!gst_base_audio_visualizer_src_negotiate (scope)) - return GST_FLOW_NOT_NEGOTIATED; + if (scope->bps == 0) { + ret = GST_FLOW_NOT_NEGOTIATED; + goto beach; + } + /* Make sure have an output format */ + ret = gst_base_audio_visualizer_ensure_negotiated (scope); + if (ret != GST_FLOW_OK) { + gst_buffer_unref (buffer); + goto beach; } - - /* Match timestamps from the incoming audio */ - if (GST_BUFFER_TIMESTAMP (buffer) != GST_CLOCK_TIME_NONE) - scope->next_ts = GST_BUFFER_TIMESTAMP (buffer); gst_adapter_push (scope->adapter, buffer); @@ -762,7 +828,7 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) inbuf = scope->inbuf; /* FIXME: the timestamp in the adapter would be different */ - gst_buffer_copy_metadata (inbuf, buffer, GST_BUFFER_COPY_ALL); + gst_buffer_copy_into (inbuf, buffer, GST_BUFFER_COPY_METADATA, 0, -1); /* this is what we have */ avail = gst_adapter_available (scope->adapter); @@ -770,10 +836,37 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) while (avail >= sbpf) { GstBuffer *outbuf; + /* get timestamp of the current adapter content */ + ts = gst_adapter_prev_timestamp (scope->adapter, &dist); + if (GST_CLOCK_TIME_IS_VALID (ts)) { + /* convert bytes to time */ + dist /= scope->bps; + ts += gst_util_uint64_scale_int (dist, GST_SECOND, scope->rate); + } + + if (GST_CLOCK_TIME_IS_VALID (ts)) { + gint64 qostime; + gboolean need_skip; + + qostime = + gst_segment_to_running_time (&scope->segment, GST_FORMAT_TIME, ts) + + scope->frame_duration; + + GST_OBJECT_LOCK (scope); + /* check for QoS, don't compute buffers that are known to be late */ + need_skip = scope->earliest_time != -1 && qostime <= scope->earliest_time; + GST_OBJECT_UNLOCK (scope); + + if (need_skip) { + GST_WARNING_OBJECT (scope, + "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, + GST_TIME_ARGS (qostime), GST_TIME_ARGS (scope->earliest_time)); + goto skip; + } + } + g_mutex_unlock (scope->config_lock); - ret = gst_pad_alloc_buffer_and_set_caps (scope->srcpad, - GST_BUFFER_OFFSET_NONE, - scope->bpf, GST_PAD_CAPS (scope->srcpad), &outbuf); + ret = gst_buffer_pool_acquire_buffer (scope->pool, &outbuf, NULL); g_mutex_lock (scope->config_lock); /* recheck as the value could have changed */ sbpf = scope->req_spf * scope->channels * sizeof (gint16); @@ -783,22 +876,25 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) break; /* sync controlled properties */ - gst_object_sync_values (G_OBJECT (scope), scope->next_ts); + gst_object_sync_values (GST_OBJECT (scope), ts); - GST_BUFFER_TIMESTAMP (outbuf) = scope->next_ts; + GST_BUFFER_TIMESTAMP (outbuf) = ts; GST_BUFFER_DURATION (outbuf) = scope->frame_duration; + + vdata = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE); if (scope->shader) { - memcpy (GST_BUFFER_DATA (outbuf), scope->pixelbuf, scope->bpf); + memcpy (vdata, scope->pixelbuf, scope->bpf); } else { - memset (GST_BUFFER_DATA (outbuf), 0, scope->bpf); + memset (vdata, 0, scope->bpf); } /* this can fail as the data size we need could have changed */ - if (!(adata = (guint8 *) gst_adapter_peek (scope->adapter, sbpf))) + if (!(adata = (gpointer) gst_adapter_map (scope->adapter, sbpf))) break; - GST_BUFFER_DATA (inbuf) = adata; - GST_BUFFER_SIZE (inbuf) = sbpf; + gst_buffer_take_memory (inbuf, -1, + gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, adata, NULL, sbpf, 0, + sbpf)); /* call class->render() vmethod */ if (render) { @@ -807,59 +903,231 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) } else { /* run various post processing (shading and geometri transformation */ if (scope->shader) { - scope->shader (scope, GST_BUFFER_DATA (outbuf), scope->pixelbuf); + scope->shader (scope, vdata, scope->pixelbuf); } } } + gst_buffer_unmap (outbuf, vdata, scope->bpf); + g_mutex_unlock (scope->config_lock); ret = gst_pad_push (scope->srcpad, outbuf); outbuf = NULL; g_mutex_lock (scope->config_lock); + skip: /* recheck as the value could have changed */ sbpf = scope->req_spf * scope->channels * sizeof (gint16); GST_LOG_OBJECT (scope, "avail: %u, bpf: %u", avail, sbpf); /* we want to take less or more, depending on spf : req_spf */ if (avail - sbpf >= sbpf) { gst_adapter_flush (scope->adapter, sbpf); + gst_adapter_unmap (scope->adapter); } else if (avail - sbpf >= 0) { /* just flush a bit and stop */ gst_adapter_flush (scope->adapter, (avail - sbpf)); + gst_adapter_unmap (scope->adapter); break; } avail = gst_adapter_available (scope->adapter); if (ret != GST_FLOW_OK) break; - - if (scope->next_ts != GST_CLOCK_TIME_NONE) - scope->next_ts += scope->frame_duration; } g_mutex_unlock (scope->config_lock); - gst_object_unref (scope); - +beach: return ret; } +static gboolean +gst_base_audio_visualizer_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + gboolean res; + GstBaseAudioVisualizer *scope; + + scope = GST_BASE_AUDIO_VISUALIZER (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_QOS: + { + gdouble proportion; + GstClockTimeDiff diff; + GstClockTime timestamp; + + gst_event_parse_qos (event, NULL, &proportion, &diff, ×tamp); + + /* save stuff for the _chain() function */ + GST_OBJECT_LOCK (scope); + scope->proportion = proportion; + if (diff >= 0) + /* we're late, this is a good estimate for next displayable + * frame (see part-qos.txt) */ + scope->earliest_time = timestamp + 2 * diff + scope->frame_duration; + else + scope->earliest_time = timestamp + diff; + GST_OBJECT_UNLOCK (scope); + + res = gst_pad_push_event (scope->sinkpad, event); + break; + } + default: + res = gst_pad_push_event (scope->sinkpad, event); + break; + } + + return res; +} + +static gboolean +gst_base_audio_visualizer_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + gboolean res; + GstBaseAudioVisualizer *scope; + + scope = GST_BASE_AUDIO_VISUALIZER (parent); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_base_audio_visualizer_sink_setcaps (scope, caps); + break; + } + case GST_EVENT_FLUSH_START: + res = gst_pad_push_event (scope->srcpad, event); + break; + case GST_EVENT_FLUSH_STOP: + gst_base_audio_visualizer_reset (scope); + res = gst_pad_push_event (scope->srcpad, event); + break; + case GST_EVENT_SEGMENT: + { + /* the newsegment values are used to clip the input samples + * and to convert the incomming timestamps to running time so + * we can do QoS */ + gst_event_copy_segment (event, &scope->segment); + + res = gst_pad_push_event (scope->srcpad, event); + break; + } + default: + res = gst_pad_push_event (scope->srcpad, event); + break; + } + + return res; +} + +static gboolean +gst_base_audio_visualizer_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + gboolean res = FALSE; + GstBaseAudioVisualizer *scope; + + scope = GST_BASE_AUDIO_VISUALIZER (parent); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + /* We need to send the query upstream and add the returned latency to our + * own */ + GstClockTime min_latency, max_latency; + gboolean us_live; + GstClockTime our_latency; + guint max_samples; + + if (scope->rate == 0) + break; + + if ((res = gst_pad_peer_query (scope->sinkpad, query))) { + gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); + + GST_DEBUG_OBJECT (scope, "Peer latency: min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + /* the max samples we must buffer buffer */ + max_samples = MAX (scope->req_spf, scope->spf); + our_latency = + gst_util_uint64_scale_int (max_samples, GST_SECOND, scope->rate); + + GST_DEBUG_OBJECT (scope, "Our latency: %" GST_TIME_FORMAT, + GST_TIME_ARGS (our_latency)); + + /* we add some latency but only if we need to buffer more than what + * upstream gives us */ + min_latency += our_latency; + if (max_latency != -1) + max_latency += our_latency; + + GST_DEBUG_OBJECT (scope, "Calculated total latency : min %" + GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, TRUE, min_latency, max_latency); + } + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + +static gboolean +gst_base_audio_visualizer_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + return res; +} + static GstStateChangeReturn gst_base_audio_visualizer_change_state (GstElement * element, GstStateChange transition) { + GstStateChangeReturn ret; GstBaseAudioVisualizer *scope; scope = GST_BASE_AUDIO_VISUALIZER (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: - scope->next_ts = GST_CLOCK_TIME_NONE; - gst_adapter_clear (scope->adapter); + gst_base_audio_visualizer_reset (scope); break; default: break; } - return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + if (scope->pool) { + gst_buffer_pool_set_active (scope->pool, FALSE); + gst_object_replace ((GstObject **) & scope->pool, NULL); + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return ret; } diff --git a/gst/audiovisualizers/gstbaseaudiovisualizer.h b/gst/audiovisualizers/gstbaseaudiovisualizer.h index 42a4c0733..0bd7687b8 100644 --- a/gst/audiovisualizers/gstbaseaudiovisualizer.h +++ b/gst/audiovisualizers/gstbaseaudiovisualizer.h @@ -74,6 +74,7 @@ struct _GstBaseAudioVisualizer /* pads */ GstPad *srcpad, *sinkpad; + GstBufferPool *pool; GstAdapter *adapter; GstBuffer *inbuf; guint8 *pixelbuf; @@ -82,7 +83,6 @@ struct _GstBaseAudioVisualizer GstBaseAudioVisualizerShaderFunc shader; guint32 shade_amount; - guint64 next_ts; /* the timestamp of the next frame */ guint64 frame_duration; guint bpf; /* bytes per frame */ guint bps; /* bytes per sample */ @@ -94,14 +94,20 @@ struct _GstBaseAudioVisualizer gint fps_n, fps_d; gint width; gint height; - gint channels; /* audio state */ gint sample_rate; + gint channels; gint rate; /* configuration mutex */ GMutex *config_lock; + + /* QoS stuff *//* with LOCK */ + gdouble proportion; + GstClockTime earliest_time; + + GstSegment segment; }; struct _GstBaseAudioVisualizerClass diff --git a/gst/audiovisualizers/gstspacescope.c b/gst/audiovisualizers/gstspacescope.c index 7d44d338d..b9efaf08a 100644 --- a/gst/audiovisualizers/gstspacescope.c +++ b/gst/audiovisualizers/gstspacescope.c @@ -42,14 +42,20 @@ static GstStaticPadTemplate gst_space_scope_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) +#if G_BYTE_ORDER == G_BIG_ENDIAN + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB")) +#else + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx")) +#endif ); static GstStaticPadTemplate gst_space_scope_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 2") ); @@ -109,30 +115,24 @@ static gboolean gst_space_scope_render (GstBaseAudioVisualizer * scope, GstBuffer * audio, GstBuffer * video); -GST_BOILERPLATE (GstSpaceScope, gst_space_scope, GstBaseAudioVisualizer, - GST_TYPE_BASE_AUDIO_VISUALIZER); +G_DEFINE_TYPE (GstSpaceScope, gst_space_scope, GST_TYPE_BASE_AUDIO_VISUALIZER); static void -gst_space_scope_base_init (gpointer g_class) +gst_space_scope_class_init (GstSpaceScopeClass * g_class) { - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GObjectClass *gobject_class = (GObjectClass *) g_class; + GstElementClass *element_class = (GstElementClass *) g_class; + GstBaseAudioVisualizerClass *scope_class = + (GstBaseAudioVisualizerClass *) g_class; gst_element_class_set_details_simple (element_class, "Stereo visualizer", "Visualization", "Simple stereo visualizer", "Stefan Kost <ensonic@users.sf.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_space_scope_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_space_scope_sink_template); -} - -static void -gst_space_scope_class_init (GstSpaceScopeClass * g_class) -{ - GObjectClass *gobject_class = (GObjectClass *) g_class; - GstBaseAudioVisualizerClass *scope_class = - (GstBaseAudioVisualizerClass *) g_class; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_space_scope_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_space_scope_sink_template)); gobject_class->set_property = gst_space_scope_set_property; gobject_class->get_property = gst_space_scope_get_property; @@ -147,7 +147,7 @@ gst_space_scope_class_init (GstSpaceScopeClass * g_class) } static void -gst_space_scope_init (GstSpaceScope * scope, GstSpaceScopeClass * g_class) +gst_space_scope_init (GstSpaceScope * scope) { /* do nothing */ } @@ -427,12 +427,16 @@ gst_space_scope_render (GstBaseAudioVisualizer * base, GstBuffer * audio, GstBuffer * video) { GstSpaceScope *scope = GST_SPACE_SCOPE (base); - guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video); - gint16 *adata = (gint16 *) GST_BUFFER_DATA (audio); + gsize asize; + guint32 *vdata = + (guint32 *) gst_buffer_map (video, NULL, NULL, GST_MAP_WRITE); + gint16 *adata = (gint16 *) gst_buffer_map (audio, &asize, NULL, GST_MAP_READ); guint num_samples; - num_samples = GST_BUFFER_SIZE (audio) / (base->channels * sizeof (gint16)); + num_samples = asize / (base->channels * sizeof (gint16)); scope->process (base, vdata, adata, num_samples); + gst_buffer_unmap (video, vdata, -1); + gst_buffer_unmap (audio, adata, -1); return TRUE; } diff --git a/gst/audiovisualizers/gstspectrascope.c b/gst/audiovisualizers/gstspectrascope.c index 1b61f567f..d79675ac4 100644 --- a/gst/audiovisualizers/gstspectrascope.c +++ b/gst/audiovisualizers/gstspectrascope.c @@ -42,14 +42,20 @@ static GstStaticPadTemplate gst_spectra_scope_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) +#if G_BYTE_ORDER == G_BIG_ENDIAN + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB")) +#else + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx")) +#endif ); static GstStaticPadTemplate gst_spectra_scope_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 2") ); @@ -63,39 +69,34 @@ static gboolean gst_spectra_scope_render (GstBaseAudioVisualizer * scope, GstBuffer * audio, GstBuffer * video); -GST_BOILERPLATE (GstSpectraScope, gst_spectra_scope, GstBaseAudioVisualizer, +G_DEFINE_TYPE (GstSpectraScope, gst_spectra_scope, GST_TYPE_BASE_AUDIO_VISUALIZER); static void -gst_spectra_scope_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, - "Frequency spectrum scope", "Visualization", - "Simple frequency spectrum scope", "Stefan Kost <ensonic@users.sf.net>"); - - gst_element_class_add_static_pad_template (element_class, - &gst_spectra_scope_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_spectra_scope_sink_template); -} - -static void gst_spectra_scope_class_init (GstSpectraScopeClass * g_class) { GObjectClass *gobject_class = (GObjectClass *) g_class; + GstElementClass *element_class = (GstElementClass *) g_class; GstBaseAudioVisualizerClass *scope_class = (GstBaseAudioVisualizerClass *) g_class; gobject_class->finalize = gst_spectra_scope_finalize; + gst_element_class_set_details_simple (element_class, + "Frequency spectrum scope", "Visualization", + "Simple frequency spectrum scope", "Stefan Kost <ensonic@users.sf.net>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_spectra_scope_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_spectra_scope_sink_template)); + scope_class->setup = GST_DEBUG_FUNCPTR (gst_spectra_scope_setup); scope_class->render = GST_DEBUG_FUNCPTR (gst_spectra_scope_render); } static void -gst_spectra_scope_init (GstSpectraScope * scope, GstSpectraScopeClass * g_class) +gst_spectra_scope_init (GstSpectraScope * scope) { /* do nothing */ } @@ -114,7 +115,7 @@ gst_spectra_scope_finalize (GObject * object) scope->freq_data = NULL; } - G_OBJECT_CLASS (parent_class)->finalize (object); + G_OBJECT_CLASS (gst_spectra_scope_parent_class)->finalize (object); } static gboolean @@ -164,9 +165,11 @@ gst_spectra_scope_render (GstBaseAudioVisualizer * bscope, GstBuffer * audio, GstBuffer * video) { GstSpectraScope *scope = GST_SPECTRA_SCOPE (bscope); - guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video); - gint16 *adata = (gint16 *) g_memdup (GST_BUFFER_DATA (audio), - GST_BUFFER_SIZE (audio)); + gsize asize; + guint32 *vdata = + (guint32 *) gst_buffer_map (video, NULL, NULL, GST_MAP_WRITE); + gint16 *adata = (gint16 *) gst_buffer_map (audio, &asize, NULL, GST_MAP_READ); + gint16 *mono_adata = (gint16 *) g_memdup (adata, asize); GstFFTS16Complex *fdata = scope->freq_data; guint x, y, off; guint l, h = bscope->height - 1; @@ -175,22 +178,22 @@ gst_spectra_scope_render (GstBaseAudioVisualizer * bscope, GstBuffer * audio, if (bscope->channels > 1) { guint ch = bscope->channels; - guint num_samples = GST_BUFFER_SIZE (audio) / (ch * sizeof (gint16)); + guint num_samples = asize / (ch * sizeof (gint16)); guint i, c, v, s = 0; /* deinterleave and mixdown adata */ for (i = 0; i < num_samples; i++) { v = 0; for (c = 0; c < ch; c++) { - v += adata[s++]; + v += mono_adata[s++]; } - adata[i] = v / ch; + mono_adata[i] = v / ch; } } /* run fft */ - gst_fft_s16_window (scope->fft_ctx, adata, GST_FFT_WINDOW_HAMMING); - gst_fft_s16_fft (scope->fft_ctx, adata, fdata); + gst_fft_s16_window (scope->fft_ctx, mono_adata, GST_FFT_WINDOW_HAMMING); + gst_fft_s16_fft (scope->fft_ctx, mono_adata, fdata); g_free (adata); /* draw lines */ @@ -210,6 +213,8 @@ gst_spectra_scope_render (GstBaseAudioVisualizer * bscope, GstBuffer * audio, add_pixel (&vdata[off], 0x007F7F7F); } } + gst_buffer_unmap (video, vdata, -1); + gst_buffer_unmap (audio, adata, -1); return TRUE; } diff --git a/gst/audiovisualizers/gstsynaescope.c b/gst/audiovisualizers/gstsynaescope.c index 7364b8f93..3754c00e0 100644 --- a/gst/audiovisualizers/gstsynaescope.c +++ b/gst/audiovisualizers/gstsynaescope.c @@ -41,14 +41,20 @@ static GstStaticPadTemplate gst_synae_scope_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) +#if G_BYTE_ORDER == G_BIG_ENDIAN + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB")) +#else + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx")) +#endif ); static GstStaticPadTemplate gst_synae_scope_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 2") ); @@ -62,40 +68,34 @@ static gboolean gst_synae_scope_render (GstBaseAudioVisualizer * scope, GstBuffer * audio, GstBuffer * video); -GST_BOILERPLATE (GstSynaeScope, gst_synae_scope, GstBaseAudioVisualizer, - GST_TYPE_BASE_AUDIO_VISUALIZER); - -static void -gst_synae_scope_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, "Synaescope", - "Visualization", - "Creates video visualizations of audio input, using stereo and pitch information", - "Stefan Kost <ensonic@users.sf.net>"); - - gst_element_class_add_static_pad_template (element_class, - &gst_synae_scope_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_synae_scope_sink_template); -} +G_DEFINE_TYPE (GstSynaeScope, gst_synae_scope, GST_TYPE_BASE_AUDIO_VISUALIZER); static void gst_synae_scope_class_init (GstSynaeScopeClass * g_class) { GObjectClass *gobject_class = (GObjectClass *) g_class; + GstElementClass *element_class = (GstElementClass *) g_class; GstBaseAudioVisualizerClass *scope_class = (GstBaseAudioVisualizerClass *) g_class; gobject_class->finalize = gst_synae_scope_finalize; + gst_element_class_set_details_simple (element_class, "Synaescope", + "Visualization", + "Creates video visualizations of audio input, using stereo and pitch information", + "Stefan Kost <ensonic@users.sf.net>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_synae_scope_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_synae_scope_sink_template)); + scope_class->setup = GST_DEBUG_FUNCPTR (gst_synae_scope_setup); scope_class->render = GST_DEBUG_FUNCPTR (gst_synae_scope_render); } static void -gst_synae_scope_init (GstSynaeScope * scope, GstSynaeScopeClass * g_class) +gst_synae_scope_init (GstSynaeScope * scope) { guint32 *colors = scope->colors; guint *shade = scope->shade; @@ -144,7 +144,7 @@ gst_synae_scope_finalize (GObject * object) scope->adata_r = NULL; } - G_OBJECT_CLASS (parent_class)->finalize (object); + G_OBJECT_CLASS (gst_synae_scope_parent_class)->finalize (object); } static gboolean @@ -203,8 +203,10 @@ gst_synae_scope_render (GstBaseAudioVisualizer * bscope, GstBuffer * audio, GstBuffer * video) { GstSynaeScope *scope = GST_SYNAE_SCOPE (bscope); - guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video); - gint16 *adata = (gint16 *) GST_BUFFER_DATA (audio); + gsize asize; + guint32 *vdata = + (guint32 *) gst_buffer_map (video, NULL, NULL, GST_MAP_WRITE); + gint16 *adata = (gint16 *) gst_buffer_map (audio, &asize, NULL, GST_MAP_READ); gint16 *adata_l = scope->adata_l; gint16 *adata_r = scope->adata_r; GstFFTS16Complex *fdata_l = scope->freq_data_l; @@ -217,7 +219,7 @@ gst_synae_scope_render (GstBaseAudioVisualizer * bscope, GstBuffer * audio, guint *shade = scope->shade; //guint w2 = w /2; guint ch = bscope->channels; - guint num_samples = GST_BUFFER_SIZE (audio) / (ch * sizeof (gint16)); + guint num_samples = asize / (ch * sizeof (gint16)); gint i, j, b; gint br, br1, br2; gint clarity; diff --git a/gst/audiovisualizers/gstwavescope.c b/gst/audiovisualizers/gstwavescope.c index a2ee51f0c..cd93a2683 100644 --- a/gst/audiovisualizers/gstwavescope.c +++ b/gst/audiovisualizers/gstwavescope.c @@ -42,14 +42,20 @@ static GstStaticPadTemplate gst_wave_scope_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) +#if G_BYTE_ORDER == G_BIG_ENDIAN + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB")) +#else + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRx")) +#endif ); static GstStaticPadTemplate gst_wave_scope_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 2") ); @@ -110,29 +116,14 @@ static gboolean gst_wave_scope_setup (GstBaseAudioVisualizer * scope); static gboolean gst_wave_scope_render (GstBaseAudioVisualizer * base, GstBuffer * audio, GstBuffer * video); - -GST_BOILERPLATE (GstWaveScope, gst_wave_scope, GstBaseAudioVisualizer, - GST_TYPE_BASE_AUDIO_VISUALIZER); - -static void -gst_wave_scope_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, "Waveform oscilloscope", - "Visualization", - "Simple waveform oscilloscope", "Stefan Kost <ensonic@users.sf.net>"); - - gst_element_class_add_static_pad_template (element_class, - &gst_wave_scope_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_wave_scope_sink_template); -} +#define gst_wave_scope_parent_class parent_class +G_DEFINE_TYPE (GstWaveScope, gst_wave_scope, GST_TYPE_BASE_AUDIO_VISUALIZER); static void gst_wave_scope_class_init (GstWaveScopeClass * g_class) { GObjectClass *gobject_class = (GObjectClass *) g_class; + GstElementClass *gstelement_class = (GstElementClass *) g_class; GstBaseAudioVisualizerClass *scope_class = (GstBaseAudioVisualizerClass *) g_class; @@ -148,10 +139,21 @@ gst_wave_scope_class_init (GstWaveScopeClass * g_class) "Drawing styles for the wave form display.", GST_TYPE_WAVE_SCOPE_STYLE, STYLE_DOTS, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_set_details_simple (gstelement_class, + "Waveform oscilloscope", "Visualization", "Simple waveform oscilloscope", + "Stefan Kost <ensonic@users.sf.net>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_wave_scope_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_wave_scope_sink_template)); + + scope_class->render = GST_DEBUG_FUNCPTR (gst_wave_scope_render); } static void -gst_wave_scope_init (GstWaveScope * scope, GstWaveScopeClass * g_class) +gst_wave_scope_init (GstWaveScope * scope) { /* do nothing */ } @@ -403,12 +405,20 @@ gst_wave_scope_render (GstBaseAudioVisualizer * base, GstBuffer * audio, GstBuffer * video) { GstWaveScope *scope = GST_WAVE_SCOPE (base); - guint32 *vdata = (guint32 *) GST_BUFFER_DATA (video); - gint16 *adata = (gint16 *) GST_BUFFER_DATA (audio); + guint32 *vdata; + gsize asize; + gint16 *adata; guint num_samples; - num_samples = GST_BUFFER_SIZE (audio) / (base->channels * sizeof (gint16)); + adata = gst_buffer_map (audio, &asize, NULL, GST_MAP_READ); + vdata = gst_buffer_map (video, NULL, NULL, GST_MAP_WRITE); + + num_samples = asize / (base->channels * sizeof (gint16)); scope->process (base, vdata, adata, num_samples); + + gst_buffer_unmap (video, vdata, -1); + gst_buffer_unmap (audio, adata, -1); + return TRUE; } diff --git a/gst/audiovisualizers/plugin.c b/gst/audiovisualizers/plugin.c index 4130f9725..e3ad7cb07 100644 --- a/gst/audiovisualizers/plugin.c +++ b/gst/audiovisualizers/plugin.c @@ -22,7 +22,6 @@ #include "config.h" #endif #include <gst/gst.h> -#include <gst/controller/gstcontroller.h> #include "gstspacescope.h" #include "gstspectrascope.h" @@ -34,9 +33,6 @@ plugin_init (GstPlugin * plugin) { gboolean res = TRUE; - /* initialize gst controller library */ - gst_controller_init (NULL, NULL); - res &= gst_space_scope_plugin_init (plugin); res &= gst_spectra_scope_plugin_init (plugin); res &= gst_synae_scope_plugin_init (plugin); diff --git a/gst/autoconvert/gstautoconvert.c b/gst/autoconvert/gstautoconvert.c index 43a7cc9fb..ef88c7038 100644 --- a/gst/autoconvert/gstautoconvert.c +++ b/gst/autoconvert/gstautoconvert.c @@ -168,8 +168,10 @@ gst_auto_convert_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &srctemplate); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Select convertor based on caps", "Generic/Bin", diff --git a/gst/autoconvert/gstautovideoconvert.c b/gst/autoconvert/gstautovideoconvert.c index cf35bb96d..00ee6db47 100644 --- a/gst/autoconvert/gstautovideoconvert.c +++ b/gst/autoconvert/gstautovideoconvert.c @@ -133,8 +133,10 @@ gst_auto_video_convert_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &srctemplate); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Select color space convertor based on caps", "Generic/Bin", diff --git a/gst/bayer/gstbayer2rgb.c b/gst/bayer/gstbayer2rgb.c index 388ee2ea1..8c2e31b14 100644 --- a/gst/bayer/gstbayer2rgb.c +++ b/gst/bayer/gstbayer2rgb.c @@ -111,10 +111,9 @@ struct _GstBayer2RGB GstBaseTransform basetransform; /* < private > */ + GstVideoInfo info; int width; int height; - int stride; - int pixsize; /* bytes per pixel */ int r_off; /* offset for red */ int g_off; /* offset for green */ int b_off; /* offset for blue */ @@ -127,14 +126,7 @@ struct _GstBayer2RGBClass }; #define SRC_CAPS \ - GST_VIDEO_CAPS_RGBx ";" \ - GST_VIDEO_CAPS_xRGB ";" \ - GST_VIDEO_CAPS_BGRx ";" \ - GST_VIDEO_CAPS_xBGR ";" \ - GST_VIDEO_CAPS_RGBA ";" \ - GST_VIDEO_CAPS_ARGB ";" \ - GST_VIDEO_CAPS_BGRA ";" \ - GST_VIDEO_CAPS_ABGR + GST_VIDEO_CAPS_MAKE ("{ RGBx, xRGB, BGRx, xBGR, RGBA, ARGB, BGRA, ABGR }") #define SINK_CAPS "video/x-raw-bayer,format=(string){bggr,grbg,gbrg,rggb}," \ "width=(int)[1,MAX],height=(int)[1,MAX],framerate=(fraction)[0/1,MAX]" @@ -144,12 +136,10 @@ enum PROP_0 }; -#define DEBUG_INIT(bla) \ - GST_DEBUG_CATEGORY_INIT (gst_bayer2rgb_debug, "bayer2rgb", 0, "bayer2rgb element"); - GType gst_bayer2rgb_get_type (void); -GST_BOILERPLATE_FULL (GstBayer2RGB, gst_bayer2rgb, GstBaseTransform, - GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); + +#define gst_bayer2rgb_parent_class parent_class +G_DEFINE_TYPE (GstBayer2RGB, gst_bayer2rgb, GST_TYPE_BASE_TRANSFORM); static void gst_bayer2rgb_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -162,43 +152,35 @@ static GstFlowReturn gst_bayer2rgb_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); static void gst_bayer2rgb_reset (GstBayer2RGB * filter); static GstCaps *gst_bayer2rgb_transform_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps); + GstPadDirection direction, GstCaps * caps, GstCaps * filter); static gboolean gst_bayer2rgb_get_unit_size (GstBaseTransform * base, - GstCaps * caps, guint * size); + GstCaps * caps, gsize * size); static void -gst_bayer2rgb_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstPadTemplate *pad_template; - - gst_element_class_set_details_simple (element_class, - "Bayer to RGB decoder for cameras", "Filter/Converter/Video", - "Converts video/x-raw-bayer to video/x-raw-rgb", - "William Brack <wbrack@mmm.com.hk>"); - - pad_template = - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_caps_from_string (SRC_CAPS)); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); - pad_template = - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - gst_caps_from_string (SINK_CAPS)); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); -} - -static void gst_bayer2rgb_class_init (GstBayer2RGBClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gobject_class->set_property = gst_bayer2rgb_set_property; gobject_class->get_property = gst_bayer2rgb_get_property; + gst_element_class_set_details_simple (gstelement_class, + "Bayer to RGB decoder for cameras", "Filter/Converter/Video", + "Converts video/x-raw-bayer to video/x-raw", + "William Brack <wbrack@mmm.com.hk>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_caps_from_string (SRC_CAPS))); + gst_element_class_add_pad_template (gstelement_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_caps_from_string (SINK_CAPS))); + GST_BASE_TRANSFORM_CLASS (klass)->transform_caps = GST_DEBUG_FUNCPTR (gst_bayer2rgb_transform_caps); GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size = @@ -207,10 +189,13 @@ gst_bayer2rgb_class_init (GstBayer2RGBClass * klass) GST_DEBUG_FUNCPTR (gst_bayer2rgb_set_caps); GST_BASE_TRANSFORM_CLASS (klass)->transform = GST_DEBUG_FUNCPTR (gst_bayer2rgb_transform); + + GST_DEBUG_CATEGORY_INIT (gst_bayer2rgb_debug, "bayer2rgb", 0, + "bayer2rgb element"); } static void -gst_bayer2rgb_init (GstBayer2RGB * filter, GstBayer2RGBClass * klass) +gst_bayer2rgb_init (GstBayer2RGB * filter) { gst_bayer2rgb_reset (filter); gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); @@ -241,35 +226,14 @@ gst_bayer2rgb_get_property (GObject * object, guint prop_id, } } -/* Routine to convert colormask value into relative byte offset */ -static int -get_pix_offset (int mask, int bpp) -{ - int bpp32 = (bpp / 8) - 3; - - switch (mask) { - case 255: - return 2 + bpp32; - case 65280: - return 1 + bpp32; - case 16711680: - return 0 + bpp32; - case -16777216: - return 0; - default: - GST_ERROR ("Invalid color mask 0x%08x", mask); - return -1; - } -} - static gboolean gst_bayer2rgb_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstBayer2RGB *bayer2rgb = GST_BAYER2RGB (base); GstStructure *structure; - int val, bpp; const char *format; + GstVideoInfo info; GST_DEBUG ("in caps %" GST_PTR_FORMAT " out caps %" GST_PTR_FORMAT, incaps, outcaps); @@ -278,7 +242,6 @@ gst_bayer2rgb_set_caps (GstBaseTransform * base, GstCaps * incaps, gst_structure_get_int (structure, "width", &bayer2rgb->width); gst_structure_get_int (structure, "height", &bayer2rgb->height); - bayer2rgb->stride = GST_ROUND_UP_4 (bayer2rgb->width); format = gst_structure_get_string (structure, "format"); if (g_str_equal (format, "bggr")) { @@ -294,15 +257,12 @@ gst_bayer2rgb_set_caps (GstBaseTransform * base, GstCaps * incaps, } /* To cater for different RGB formats, we need to set params for later */ - structure = gst_caps_get_structure (outcaps, 0); - gst_structure_get_int (structure, "bpp", &bpp); - bayer2rgb->pixsize = bpp / 8; - gst_structure_get_int (structure, "red_mask", &val); - bayer2rgb->r_off = get_pix_offset (val, bpp); - gst_structure_get_int (structure, "green_mask", &val); - bayer2rgb->g_off = get_pix_offset (val, bpp); - gst_structure_get_int (structure, "blue_mask", &val); - bayer2rgb->b_off = get_pix_offset (val, bpp); + gst_video_info_from_caps (&info, outcaps); + bayer2rgb->r_off = GST_VIDEO_INFO_COMP_OFFSET (&info, 0); + bayer2rgb->g_off = GST_VIDEO_INFO_COMP_OFFSET (&info, 1); + bayer2rgb->b_off = GST_VIDEO_INFO_COMP_OFFSET (&info, 2); + + bayer2rgb->info = info; return TRUE; } @@ -312,16 +272,15 @@ gst_bayer2rgb_reset (GstBayer2RGB * filter) { filter->width = 0; filter->height = 0; - filter->stride = 0; - filter->pixsize = 0; filter->r_off = 0; filter->g_off = 0; filter->b_off = 0; + gst_video_info_init (&filter->info); } static GstCaps * gst_bayer2rgb_transform_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps) + GstPadDirection direction, GstCaps * caps, GstCaps * filter) { GstStructure *structure; GstCaps *newcaps; @@ -335,7 +294,7 @@ gst_bayer2rgb_transform_caps (GstBaseTransform * base, newcaps = gst_caps_from_string ("video/x-raw-bayer," "format=(string){bggr,grbg,gbrg,rggb}"); } else { - newcaps = gst_caps_new_simple ("video/x-raw-rgb", NULL); + newcaps = gst_caps_new_empty_simple ("video/x-raw"); } newstruct = gst_caps_get_structure (newcaps, 0); @@ -353,12 +312,11 @@ gst_bayer2rgb_transform_caps (GstBaseTransform * base, static gboolean gst_bayer2rgb_get_unit_size (GstBaseTransform * base, GstCaps * caps, - guint * size) + gsize * size) { GstStructure *structure; int width; int height; - int pixsize; const char *name; structure = gst_caps_get_structure (caps, 0); @@ -367,15 +325,13 @@ gst_bayer2rgb_get_unit_size (GstBaseTransform * base, GstCaps * caps, gst_structure_get_int (structure, "height", &height)) { name = gst_structure_get_name (structure); /* Our name must be either video/x-raw-bayer video/x-raw-rgb */ - if (strcmp (name, "video/x-raw-rgb")) { + if (strcmp (name, "video/x-raw")) { *size = GST_ROUND_UP_4 (width) * height; return TRUE; } else { - /* For output, calculate according to format */ - if (gst_structure_get_int (structure, "bpp", &pixsize)) { - *size = width * height * (pixsize / 8); - return TRUE; - } + /* For output, calculate according to format (always 32 bits) */ + *size = width * height * 4; + return TRUE; } } @@ -492,20 +448,17 @@ gst_bayer2rgb_transform (GstBaseTransform * base, GstBuffer * inbuf, { GstBayer2RGB *filter = GST_BAYER2RGB (base); uint8_t *input, *output; - - /* - * We need to lock our filter params to prevent changing - * caps in the middle of a transformation (nice way to get - * segfaults) - */ - GST_OBJECT_LOCK (filter); + GstVideoFrame frame; GST_DEBUG ("transforming buffer"); - input = (uint8_t *) GST_BUFFER_DATA (inbuf); - output = (uint8_t *) GST_BUFFER_DATA (outbuf); + input = gst_buffer_map (inbuf, NULL, NULL, GST_MAP_READ); + gst_video_frame_map (&frame, &filter->info, inbuf, GST_MAP_WRITE); + + output = GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); gst_bayer2rgb_process (filter, output, filter->width * 4, input, filter->width); + gst_video_frame_unmap (&frame); + gst_buffer_unmap (inbuf, input, -1); - GST_OBJECT_UNLOCK (filter); return GST_FLOW_OK; } diff --git a/gst/bayer/gstrgb2bayer.c b/gst/bayer/gstrgb2bayer.c index fb7e9cbba..69aedb908 100644 --- a/gst/bayer/gstrgb2bayer.c +++ b/gst/bayer/gstrgb2bayer.c @@ -30,31 +30,24 @@ #define GST_CAT_DEFAULT gst_rgb2bayer_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); -static void gst_rgb2bayer_dispose (GObject * object); static void gst_rgb2bayer_finalize (GObject * object); static GstCaps *gst_rgb2bayer_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps); + GstPadDirection direction, GstCaps * caps, GstCaps * filter); static gboolean gst_rgb2bayer_get_unit_size (GstBaseTransform * trans, GstCaps * caps, - guint * size); + gsize * size); static gboolean gst_rgb2bayer_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps); -static gboolean gst_rgb2bayer_start (GstBaseTransform * trans); -static gboolean gst_rgb2bayer_stop (GstBaseTransform * trans); -static gboolean gst_rgb2bayer_event (GstBaseTransform * trans, - GstEvent * event); static GstFlowReturn gst_rgb2bayer_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); -static gboolean gst_rgb2bayer_src_event (GstBaseTransform * trans, - GstEvent * event); static GstStaticPadTemplate gst_rgb2bayer_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_ARGB) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("ARGB")) ); #if 0 @@ -81,65 +74,48 @@ GST_STATIC_PAD_TEMPLATE ("src", /* class initialization */ -#define DEBUG_INIT(bla) \ - GST_DEBUG_CATEGORY_INIT (gst_rgb2bayer_debug, "rgb2bayer", 0, "rgb2bayer element"); - -GST_BOILERPLATE_FULL (GstRGB2Bayer, gst_rgb2bayer, GstBaseTransform, - GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); +#define gst_rgb2bayer_parent_class parent_class +G_DEFINE_TYPE (GstRGB2Bayer, gst_rgb2bayer, GST_TYPE_BASE_TRANSFORM); static void -gst_rgb2bayer_base_init (gpointer g_class) +gst_rgb2bayer_class_init (GstRGB2BayerClass * klass) { - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *base_transform_class = + GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->finalize = gst_rgb2bayer_finalize; - gst_element_class_add_static_pad_template (element_class, - &gst_rgb2bayer_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_rgb2bayer_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rgb2bayer_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rgb2bayer_sink_template)); gst_element_class_set_details_simple (element_class, "RGB to Bayer converter", "Filter/Converter/Video", - "Converts video/x-raw-rgb to video/x-raw-bayer", + "Converts video/x-raw to video/x-raw-bayer", "David Schleef <ds@entropywave.com>"); -} -static void -gst_rgb2bayer_class_init (GstRGB2BayerClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstBaseTransformClass *base_transform_class = - GST_BASE_TRANSFORM_CLASS (klass); - - gobject_class->dispose = gst_rgb2bayer_dispose; - gobject_class->finalize = gst_rgb2bayer_finalize; base_transform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_rgb2bayer_transform_caps); base_transform_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_rgb2bayer_get_unit_size); base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_rgb2bayer_set_caps); - base_transform_class->start = GST_DEBUG_FUNCPTR (gst_rgb2bayer_start); - base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_rgb2bayer_stop); - base_transform_class->event = GST_DEBUG_FUNCPTR (gst_rgb2bayer_event); base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_rgb2bayer_transform); - base_transform_class->src_event = GST_DEBUG_FUNCPTR (gst_rgb2bayer_src_event); + GST_DEBUG_CATEGORY_INIT (gst_rgb2bayer_debug, "rgb2bayer", 0, + "rgb2bayer element"); } static void -gst_rgb2bayer_init (GstRGB2Bayer * rgb2bayer, - GstRGB2BayerClass * rgb2bayer_class) +gst_rgb2bayer_init (GstRGB2Bayer * rgb2bayer) { } void -gst_rgb2bayer_dispose (GObject * object) -{ - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -void gst_rgb2bayer_finalize (GObject * object) { G_OBJECT_CLASS (parent_class)->finalize (object); @@ -148,7 +124,7 @@ gst_rgb2bayer_finalize (GObject * object) static GstCaps * gst_rgb2bayer_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps) + GstPadDirection direction, GstCaps * caps, GstCaps * filter) { GstStructure *structure; GstStructure *new_structure; @@ -160,9 +136,9 @@ gst_rgb2bayer_transform_caps (GstBaseTransform * trans, structure = gst_caps_get_structure (caps, 0); if (direction == GST_PAD_SRC) { - newcaps = gst_caps_new_simple ("video/x-raw-rgb", NULL); + newcaps = gst_caps_new_empty_simple ("video/x-raw"); } else { - newcaps = gst_caps_new_simple ("video/x-raw-bayer", NULL); + newcaps = gst_caps_new_empty_simple ("video/x-raw-bayer"); } new_structure = gst_caps_get_structure (newcaps, 0); @@ -183,12 +159,11 @@ gst_rgb2bayer_transform_caps (GstBaseTransform * trans, static gboolean gst_rgb2bayer_get_unit_size (GstBaseTransform * trans, GstCaps * caps, - guint * size) + gsize * size) { GstStructure *structure; int width; int height; - int pixsize; const char *name; structure = gst_caps_get_structure (caps, 0); @@ -196,16 +171,14 @@ gst_rgb2bayer_get_unit_size (GstBaseTransform * trans, GstCaps * caps, if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { name = gst_structure_get_name (structure); - /* Our name must be either video/x-raw-bayer video/x-raw-rgb */ + /* Our name must be either video/x-raw-bayer video/x-raw */ if (g_str_equal (name, "video/x-raw-bayer")) { *size = width * height; return TRUE; } else { /* For output, calculate according to format */ - if (gst_structure_get_int (structure, "bpp", &pixsize)) { - *size = width * height * (pixsize / 8); - return TRUE; - } + *size = width * height * 4; + return TRUE; } } @@ -220,10 +193,16 @@ gst_rgb2bayer_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstRGB2Bayer *rgb2bayer = GST_RGB_2_BAYER (trans); GstStructure *structure; const char *format; + GstVideoInfo info; GST_DEBUG ("in caps %" GST_PTR_FORMAT " out caps %" GST_PTR_FORMAT, incaps, outcaps); + if (!gst_video_info_from_caps (&info, incaps)) + return FALSE; + + rgb2bayer->info = info; + structure = gst_caps_get_structure (outcaps, 0); gst_structure_get_int (structure, "width", &rgb2bayer->width); @@ -245,27 +224,6 @@ gst_rgb2bayer_set_caps (GstBaseTransform * trans, GstCaps * incaps, return TRUE; } -static gboolean -gst_rgb2bayer_start (GstBaseTransform * trans) -{ - - return TRUE; -} - -static gboolean -gst_rgb2bayer_stop (GstBaseTransform * trans) -{ - - return TRUE; -} - -static gboolean -gst_rgb2bayer_event (GstBaseTransform * trans, GstEvent * event) -{ - - return TRUE; -} - static GstFlowReturn gst_rgb2bayer_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) @@ -276,9 +234,12 @@ gst_rgb2bayer_transform (GstBaseTransform * trans, GstBuffer * inbuf, int i, j; int height = rgb2bayer->height; int width = rgb2bayer->width; + GstVideoFrame frame; + + gst_video_frame_map (&frame, &rgb2bayer->info, inbuf, GST_MAP_READ); - dest = GST_BUFFER_DATA (outbuf); - src = GST_BUFFER_DATA (inbuf); + dest = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_READ); + src = GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); for (j = 0; j < height; j++) { guint8 *dest_line = dest + width * j; @@ -295,13 +256,8 @@ gst_rgb2bayer_transform (GstBaseTransform * trans, GstBuffer * inbuf, } } } + gst_buffer_unmap (outbuf, dest, -1); + gst_video_frame_unmap (&frame); return GST_FLOW_OK; } - -static gboolean -gst_rgb2bayer_src_event (GstBaseTransform * trans, GstEvent * event) -{ - - return TRUE; -} diff --git a/gst/bayer/gstrgb2bayer.h b/gst/bayer/gstrgb2bayer.h index 7b7f073ee..cf37872d2 100644 --- a/gst/bayer/gstrgb2bayer.h +++ b/gst/bayer/gstrgb2bayer.h @@ -22,6 +22,7 @@ #include <gst/gst.h> #include <gst/base/gstbasetransform.h> +#include <gst/video/video.h> G_BEGIN_DECLS @@ -45,6 +46,7 @@ struct _GstRGB2Bayer { GstBaseTransform base_rgb2bayer; + GstVideoInfo info; int width, height; int format; }; diff --git a/gst/camerabin/camerabinimage.c b/gst/camerabin/camerabinimage.c index c69a5c339..ab82b4071 100644 --- a/gst/camerabin/camerabinimage.c +++ b/gst/camerabin/camerabinimage.c @@ -102,7 +102,8 @@ gst_camerabin_image_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (eklass, &sink_template); + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (eklass, "Image capture bin for camerabin", "Bin/Image", "Process and store image data", @@ -216,9 +217,10 @@ gst_camerabin_image_dispose (GstCameraBinImage * img) taken by bin and therefore gst_object_sink is called for these elements (they may still be in floating state and not unreffed properly without sinking first) + FIXME, something else is wrong if you have to sink here */ if (img->app_enc) { - gst_object_sink (img->app_enc); + //gst_object_ref_sink (img->app_enc); GST_LOG_OBJECT (img, "disposing %s with refcount %d", GST_ELEMENT_NAME (img->app_enc), GST_OBJECT_REFCOUNT_VALUE (img->app_enc)); @@ -227,7 +229,7 @@ gst_camerabin_image_dispose (GstCameraBinImage * img) } if (img->post) { - gst_object_sink (img->post); + //gst_object_ref_sink (img->post); GST_LOG_OBJECT (img, "disposing %s with refcount %d", GST_ELEMENT_NAME (img->post), GST_OBJECT_REFCOUNT_VALUE (img->post)); gst_object_unref (img->post); diff --git a/gst/camerabin/camerabinvideo.c b/gst/camerabin/camerabinvideo.c index a98807b2d..0a81e0ccb 100644 --- a/gst/camerabin/camerabinvideo.c +++ b/gst/camerabin/camerabinvideo.c @@ -118,8 +118,10 @@ gst_camerabin_video_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (eklass, &sink_template); - gst_element_class_add_static_pad_template (eklass, &src_template); + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (eklass, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (eklass, "Video capture bin for camerabin", "Bin/Video", "Process and store video data", @@ -215,33 +217,34 @@ gst_camerabin_video_dispose (GstCameraBinVideo * vid) taken by bin and therefore gst_object_sink is called for these elements (they may still be in floating state and not unreffed properly without sinking first) + FIXME, something else is wrong when you have to sink here */ if (vid->app_post) { - gst_object_sink (vid->app_post); + //gst_object_sink (vid->app_post); gst_object_unref (vid->app_post); vid->app_post = NULL; } if (vid->app_vid_enc) { - gst_object_sink (vid->app_vid_enc); + //gst_object_sink (vid->app_vid_enc); gst_object_unref (vid->app_vid_enc); vid->app_vid_enc = NULL; } if (vid->app_aud_enc) { - gst_object_sink (vid->app_aud_enc); + //gst_object_sink (vid->app_aud_enc); gst_object_unref (vid->app_aud_enc); vid->app_aud_enc = NULL; } if (vid->app_aud_src) { - gst_object_sink (vid->app_aud_src); + //gst_object_sink (vid->app_aud_src); gst_object_unref (vid->app_aud_src); vid->app_aud_src = NULL; } if (vid->app_mux) { - gst_object_sink (vid->app_mux); + //gst_object_sink (vid->app_mux); gst_object_unref (vid->app_mux); vid->app_mux = NULL; } @@ -506,7 +509,7 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid) gst_object_unref (vid_sinkpad); /* Add queue element for video */ - vid->tee_video_srcpad = gst_element_get_request_pad (vid->tee, "src%d"); + vid->tee_video_srcpad = gst_element_get_request_pad (vid->tee, "src_%u"); vid->video_queue = gst_element_factory_make ("queue", "video-queue"); if (!gst_camerabin_add_element (vidbin, vid->video_queue)) { @@ -617,7 +620,7 @@ gst_camerabin_video_create_elements (GstCameraBinVideo * vid) } } /* Add queue leading out of the video bin and to view finder */ - vid->tee_vf_srcpad = gst_element_get_request_pad (vid->tee, "src%d"); + vid->tee_vf_srcpad = gst_element_get_request_pad (vid->tee, "src_%u"); queue = gst_element_factory_make ("queue", "viewfinder-queue"); if (!gst_camerabin_add_element (vidbin, queue)) { goto error; diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c index be13b65d7..39cd2b91b 100644 --- a/gst/camerabin/gstcamerabin.c +++ b/gst/camerabin/gstcamerabin.c @@ -768,7 +768,7 @@ camerabin_create_elements (GstCameraBin * camera) } camera->pad_src_img = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); + gst_element_get_request_pad (camera->src_out_sel, "src_%u"); gst_pad_add_data_probe (camera->pad_src_img, G_CALLBACK (gst_camerabin_have_img_buffer), camera); @@ -797,7 +797,7 @@ camerabin_create_elements (GstCameraBin * camera) } camera->pad_src_view = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); + gst_element_get_request_pad (camera->src_out_sel, "src_%u"); /* Create view finder elements */ if (!camerabin_create_view_elements (camera)) { @@ -811,7 +811,7 @@ camerabin_create_elements (GstCameraBin * camera) /* Add video bin */ camera->pad_src_vid = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); + gst_element_get_request_pad (camera->src_out_sel, "src_%u"); if (!gst_camerabin_add_element (GST_BIN (camera), camera->vidbin)) { goto done; } @@ -821,7 +821,7 @@ camerabin_create_elements (GstCameraBin * camera) /* Link video bin ! view finder */ unconnected_pad = gst_bin_find_unlinked_pad (GST_BIN (camera), GST_PAD_SRC); camera->pad_view_vid = - gst_element_get_request_pad (camera->view_in_sel, "sink%d"); + gst_element_get_request_pad (camera->view_in_sel, "sink_%u"); link_ret = gst_pad_link_full (unconnected_pad, camera->pad_view_vid, GST_PAD_LINK_CHECK_CAPS); diff --git a/gst/camerabin/gstcamerabincolorbalance.c b/gst/camerabin/gstcamerabincolorbalance.c index 73a325d35..54899fabf 100644 --- a/gst/camerabin/gstcamerabincolorbalance.c +++ b/gst/camerabin/gstcamerabincolorbalance.c @@ -71,7 +71,7 @@ gst_camerabin_color_balance_get_value (GstColorBalance * cb, */ void -gst_camerabin_color_balance_init (GstColorBalanceClass * iface) +gst_camerabin_color_balance_init (GstColorBalanceInterface * iface) { /* FIXME: to get the same type as v4l2src */ GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_HARDWARE; diff --git a/gst/camerabin/gstcamerabincolorbalance.h b/gst/camerabin/gstcamerabincolorbalance.h index 442a23bc9..81984e7f3 100644 --- a/gst/camerabin/gstcamerabincolorbalance.h +++ b/gst/camerabin/gstcamerabincolorbalance.h @@ -23,6 +23,6 @@ #include <gst/interfaces/colorbalance.h> -extern void gst_camerabin_color_balance_init (GstColorBalanceClass * iface); +extern void gst_camerabin_color_balance_init (GstColorBalanceInterface * iface); #endif /* #ifndef __GST_CAMERA_COLOR_BALANCE_H__ */ diff --git a/gst/camerabin/gstinputselector.c b/gst/camerabin/gstinputselector.c index 62ee38044..8fe8c0f02 100644 --- a/gst/camerabin/gstinputselector.c +++ b/gst/camerabin/gstinputselector.c @@ -42,7 +42,7 @@ GST_DEBUG_CATEGORY_STATIC (input_selector_debug); #define GST_CAT_DEFAULT input_selector_debug static GstStaticPadTemplate gst_input_selector_sink_factory = -GST_STATIC_PAD_TEMPLATE ("sink%d", +GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); @@ -745,10 +745,10 @@ gst_input_selector_base_init (GstInputSelectorClass * klass) "Julien Moutte <julien@moutte.net>, " "Jan Schmidt <thaytan@mad.scientist.com>, " "Wim Taymans <wim.taymans@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_input_selector_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &gst_input_selector_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_input_selector_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_input_selector_src_factory)); } static void @@ -1298,7 +1298,7 @@ gst_input_selector_request_new_pad (GstElement * element, GST_INPUT_SELECTOR_LOCK (sel); GST_LOG_OBJECT (sel, "Creating new pad %d", sel->padcount); - name = g_strdup_printf ("sink%d", sel->padcount++); + name = g_strdup_printf ("sink_%u", sel->padcount++); sinkpad = g_object_new (GST_TYPE_SELECTOR_PAD, "name", name, "direction", templ->direction, "template", templ, NULL); g_free (name); diff --git a/gst/camerabin2/camerabingeneral.c b/gst/camerabin2/camerabingeneral.c index 046ccd7da..25b057e49 100644 --- a/gst/camerabin2/camerabingeneral.c +++ b/gst/camerabin2/camerabingeneral.c @@ -230,19 +230,19 @@ void gst_camerabin_remove_elements_from_bin (GstBin * bin) { GstIterator *iter = NULL; - gpointer data = NULL; + GValue value = { 0 }; GstElement *elem = NULL; gboolean done = FALSE; iter = gst_bin_iterate_elements (bin); while (!done) { - switch (gst_iterator_next (iter, &data)) { + switch (gst_iterator_next (iter, &value)) { case GST_ITERATOR_OK: - elem = GST_ELEMENT (data); + elem = (GstElement *) g_value_get_object (&value); gst_bin_remove (bin, elem); gst_element_set_state (GST_ELEMENT (elem), GST_STATE_NULL); /* Iterator increased the element refcount, so unref */ - gst_object_unref (elem); + g_value_unset (&value); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (iter); diff --git a/gst/camerabin2/gstcamerabin2.c b/gst/camerabin2/gstcamerabin2.c index 073cb6f67..12c52b0a2 100644 --- a/gst/camerabin2/gstcamerabin2.c +++ b/gst/camerabin2/gstcamerabin2.c @@ -350,7 +350,7 @@ static GstEvent * gst_camera_bin_new_event_renegotiate (void) { return gst_event_new_custom (GST_EVENT_CUSTOM_BOTH, - gst_structure_new ("renegotiate", NULL)); + gst_structure_new_empty ("renegotiate")); } static GstEvent * @@ -755,7 +755,7 @@ gst_camera_bin_class_init (GstCameraBin2Class * klass) GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (object_class, PROP_VIDEO_ENCODING_PROFILE, - gst_param_spec_mini_object ("video-profile", "Video Profile", + g_param_spec_boxed ("video-profile", "Video Profile", "The GstEncodingProfile to use for video recording. Audio is enabled " "when this profile supports audio.", GST_TYPE_ENCODING_PROFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -828,7 +828,7 @@ gst_camera_bin_class_init (GstCameraBin2Class * klass) * getting the 2nd buffer. */ g_object_class_install_property (object_class, PROP_IMAGE_ENCODING_PROFILE, - gst_param_spec_mini_object ("image-profile", "Image Profile", + g_param_spec_boxed ("image-profile", "Image Profile", "The GstEncodingProfile to use for image captures.", GST_TYPE_ENCODING_PROFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -948,7 +948,7 @@ gst_video_capture_bin_post_video_done (GstCameraBin2 * camera) GstMessage *msg; msg = gst_message_new_element (GST_OBJECT_CAST (camera), - gst_structure_new ("video-done", NULL)); + gst_structure_new_empty ("video-done")); if (!gst_element_post_message (GST_ELEMENT_CAST (camera), msg)) GST_WARNING_OBJECT (camera, "Failed to post video-done message"); @@ -1189,17 +1189,19 @@ encodebin_element_added (GstElement * encodebin, GstElement * new_element, GstElementFactory *factory = gst_element_get_factory (new_element); if (factory != NULL) { - if (strcmp (GST_PLUGIN_FEATURE_NAME (factory), "audiorate") == 0 || - strcmp (GST_PLUGIN_FEATURE_NAME (factory), "videorate") == 0) { + if (strcmp (GST_OBJECT_NAME (factory), "audiorate") == 0 || + strcmp (GST_OBJECT_NAME (factory), "videorate") == 0) { g_object_set (new_element, "skip-to-first", TRUE, NULL); } } - if (gst_element_implements_interface (new_element, GST_TYPE_TAG_SETTER)) { - GstTagSetter *tagsetter = GST_TAG_SETTER (new_element); + /* TODO porting + if (gst_element_implements_interface (new_element, GST_TYPE_TAG_SETTER)) { + GstTagSetter *tagsetter = GST_TAG_SETTER (new_element); - gst_tag_setter_set_tag_merge_mode (tagsetter, GST_TAG_MERGE_REPLACE); - } + gst_tag_setter_set_tag_merge_mode (tagsetter, GST_TAG_MERGE_REPLACE); + } + */ } #define VIDEO_PAD 1 @@ -1208,6 +1210,7 @@ static GstPad * encodebin_find_pad (GstCameraBin2 * camera, GstElement * encodebin, gint pad_type) { + GValue value = { 0 }; GstPad *pad = NULL; GstIterator *iter; gboolean done; @@ -1218,8 +1221,10 @@ encodebin_find_pad (GstCameraBin2 * camera, GstElement * encodebin, iter = gst_element_iterate_sink_pads (encodebin); done = FALSE; while (!done) { - switch (gst_iterator_next (iter, (gpointer *) & pad)) { + switch (gst_iterator_next (iter, &value)) { case GST_ITERATOR_OK: + pad = g_value_dup_object (&value); + g_value_unset (&value); if (pad_type == VIDEO_PAD) { if (strstr (GST_PAD_NAME (pad), "video") != NULL) { GST_DEBUG_OBJECT (camera, "Found video pad %s", GST_PAD_NAME (pad)); @@ -1340,11 +1345,11 @@ gst_camera_bin_src_notify_zoom_cb (GObject * self, GParamSpec * pspec, g_object_notify (G_OBJECT (camera), "zoom"); } -static gboolean -gst_camera_bin_image_src_buffer_probe (GstPad * pad, GstBuffer * buf, +static GstPadProbeReturn +gst_camera_bin_image_src_buffer_probe (GstPad * pad, GstPadProbeInfo * info, gpointer data) { - gboolean ret = TRUE; + GstPadProbeReturn ret = GST_PAD_PROBE_OK; GstCameraBin2 *camerabin = data; GstEvent *evt; gchar *location = NULL; @@ -1394,7 +1399,7 @@ gst_camera_bin_image_src_buffer_probe (GstPad * pad, GstBuffer * buf, } else { /* This means we don't have to encode the capture, it is used for * signaling the application just wants the preview */ - ret = FALSE; + ret = GST_PAD_PROBE_DROP; GST_CAMERA_BIN2_PROCESSING_DEC (camerabin); } @@ -1402,11 +1407,12 @@ gst_camera_bin_image_src_buffer_probe (GstPad * pad, GstBuffer * buf, } -static gboolean -gst_camera_bin_image_sink_event_probe (GstPad * pad, GstEvent * event, +static GstPadProbeReturn +gst_camera_bin_image_sink_event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GstCameraBin2 *camerabin = data; + GstEvent *event = GST_EVENT (info->data); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_DOWNSTREAM:{ @@ -1432,21 +1438,22 @@ gst_camera_bin_image_sink_event_probe (GstPad * pad, GstEvent * event, break; } - return TRUE; + return GST_PAD_PROBE_OK; } -static gboolean -gst_camera_bin_audio_src_data_probe (GstPad * pad, GstMiniObject * obj, +static GstPadProbeReturn +gst_camera_bin_audio_src_data_probe (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GstCameraBin2 *camera = data; - gboolean ret = TRUE; + gboolean ret = GST_PAD_PROBE_OK; - if (GST_IS_BUFFER (obj)) { + if (GST_IS_BUFFER (data)) { if (G_UNLIKELY (camera->audio_send_newseg)) { - GstBuffer *buf = GST_BUFFER_CAST (obj); + GstBuffer *buf = GST_BUFFER_CAST (data); GstClockTime ts = GST_BUFFER_TIMESTAMP (buf); GstPad *peer; + GstSegment segment; if (!GST_CLOCK_TIME_IS_VALID (ts)) { ts = 0; @@ -1455,27 +1462,28 @@ gst_camera_bin_audio_src_data_probe (GstPad * pad, GstMiniObject * obj, peer = gst_pad_get_peer (pad); g_return_val_if_fail (peer != NULL, TRUE); - gst_pad_send_event (peer, gst_event_new_new_segment (FALSE, 1.0, - GST_FORMAT_TIME, ts, -1, 0)); + gst_segment_init (&segment, GST_FORMAT_TIME); + segment.start = ts; + gst_pad_send_event (peer, gst_event_new_segment (&segment)); gst_object_unref (peer); camera->audio_send_newseg = FALSE; } } else { - GstEvent *event = GST_EVENT_CAST (obj); + GstEvent *event = GST_EVENT_CAST (data); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { /* we only let an EOS pass when the user is stopping a capture */ if (camera->audio_drop_eos) { - ret = FALSE; + ret = GST_PAD_PROBE_DROP; } else { camera->audio_drop_eos = TRUE; /* should already be false, but reinforce in case no buffers get * pushed */ camera->audio_send_newseg = FALSE; } - } else if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { - ret = FALSE; + } else if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) { + ret = GST_PAD_PROBE_DROP; } } @@ -1540,12 +1548,12 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) GstEncodingContainerProfile *prof; GstCaps *caps; - caps = gst_caps_new_simple ("application/ogg", NULL); + caps = gst_caps_new_empty_simple ("application/ogg"); prof = gst_encoding_container_profile_new ("ogg", "theora+vorbis+ogg", caps, NULL); gst_caps_unref (caps); - caps = gst_caps_new_simple ("video/x-theora", NULL); + caps = gst_caps_new_empty_simple ("video/x-theora"); if (!gst_encoding_container_profile_add_profile (prof, (GstEncodingProfile *) gst_encoding_video_profile_new (caps, NULL, NULL, 1))) { @@ -1553,7 +1561,7 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) } gst_caps_unref (caps); - caps = gst_caps_new_simple ("audio/x-vorbis", NULL); + caps = gst_caps_new_empty_simple ("audio/x-vorbis"); if (!gst_encoding_container_profile_add_profile (prof, (GstEncodingProfile *) gst_encoding_audio_profile_new (caps, NULL, NULL, 1))) { @@ -1592,7 +1600,7 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) GstEncodingVideoProfile *vprof; GstCaps *caps; - caps = gst_caps_new_simple ("image/jpeg", NULL); + caps = gst_caps_new_empty_simple ("image/jpeg"); vprof = gst_encoding_video_profile_new (caps, NULL, NULL, 1); gst_encoding_video_profile_set_variableframerate (vprof, TRUE); @@ -1639,8 +1647,9 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) srcpad = gst_element_get_static_pad (camera->image_encodebin, "src"); - gst_pad_add_event_probe (srcpad, - (GCallback) gst_camera_bin_image_sink_event_probe, camera); + gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, + gst_camera_bin_image_sink_event_probe, gst_object_ref (camera), + gst_object_unref); gst_object_unref (srcpad); } @@ -1768,8 +1777,9 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) goto fail; } - gst_pad_add_buffer_probe (imgsrc, - (GCallback) gst_camera_bin_image_src_buffer_probe, camera); + gst_pad_add_probe (imgsrc, GST_PAD_PROBE_TYPE_BUFFER, + gst_camera_bin_image_src_buffer_probe, gst_object_ref (camera), + gst_object_unref); gst_object_unref (imgsrc); } @@ -1831,11 +1841,11 @@ gst_camera_bin_create_elements (GstCameraBin2 * camera) srcpad = gst_element_get_static_pad (camera->audio_src, "src"); - /* 1) drop EOS for audiosrc elements that push them on state_changes - * (basesrc does this) - * 2) Fix newsegment events to have start time = first buffer ts */ - gst_pad_add_data_probe (srcpad, - (GCallback) gst_camera_bin_audio_src_data_probe, camera); + /* drop EOS for audiosrc elements that push them on state_changes + * (basesrc does this) */ + gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM, + gst_camera_bin_audio_src_data_probe, gst_object_ref (camera), + gst_object_unref); gst_object_unref (srcpad); } @@ -2171,8 +2181,7 @@ gst_camera_bin_set_property (GObject * object, guint prop_id, case PROP_VIDEO_ENCODING_PROFILE: if (camera->video_profile) gst_encoding_profile_unref (camera->video_profile); - camera->video_profile = - (GstEncodingProfile *) gst_value_dup_mini_object (value); + camera->video_profile = (GstEncodingProfile *) g_value_dup_boxed (value); camera->video_profile_switch = TRUE; break; case PROP_IMAGE_FILTER: @@ -2228,8 +2237,7 @@ gst_camera_bin_set_property (GObject * object, guint prop_id, case PROP_IMAGE_ENCODING_PROFILE: if (camera->image_profile) gst_encoding_profile_unref (camera->image_profile); - camera->image_profile = - (GstEncodingProfile *) gst_value_dup_mini_object (value); + camera->image_profile = (GstEncodingProfile *) g_value_dup_boxed (value); camera->image_profile_switch = TRUE; break; case PROP_FLAGS: @@ -2300,7 +2308,7 @@ gst_camera_bin_get_property (GObject * object, guint prop_id, * won't negotiate. Need to take care on the special case of the * pad being unlinked. */ - caps = gst_pad_get_caps_reffed (pad); + caps = gst_pad_query_caps (pad, NULL); if (caps) { gst_value_set_caps (value, caps); gst_caps_unref (caps); @@ -2366,8 +2374,7 @@ gst_camera_bin_get_property (GObject * object, guint prop_id, break; case PROP_VIDEO_ENCODING_PROFILE: if (camera->video_profile) { - gst_value_set_mini_object (value, - (GstMiniObject *) camera->video_profile); + g_value_set_boxed (value, camera->video_profile); } break; case PROP_VIDEO_FILTER: @@ -2405,8 +2412,7 @@ gst_camera_bin_get_property (GObject * object, guint prop_id, break; case PROP_IMAGE_ENCODING_PROFILE: if (camera->image_profile) { - gst_value_set_mini_object (value, - (GstMiniObject *) camera->image_profile); + g_value_set_boxed (value, camera->image_profile); } break; case PROP_IDLE: diff --git a/gst/camerabin2/gstviewfinderbin.c b/gst/camerabin2/gstviewfinderbin.c index abf996bba..90c78d5ab 100644 --- a/gst/camerabin2/gstviewfinderbin.c +++ b/gst/camerabin2/gstviewfinderbin.c @@ -61,8 +61,8 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", ); /* class initialization */ - -GST_BOILERPLATE (GstViewfinderBin, gst_viewfinder_bin, GstBin, GST_TYPE_BIN); +#define gst_viewfinder_bin_parent_class parent_class +G_DEFINE_TYPE (GstViewfinderBin, gst_viewfinder_bin, GST_TYPE_BIN); static void gst_viewfinder_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * spec); @@ -96,19 +96,6 @@ gst_viewfinder_bin_dispose (GObject * object) } static void -gst_viewfinder_bin_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &sink_template); - - gst_element_class_set_details_simple (element_class, "Viewfinder Bin", - "Sink/Video", "Viewfinder Bin used in camerabin2", - "Thiago Santos <thiago.sousa.santos@collabora.co.uk>"); -} - -static void gst_viewfinder_bin_class_init (GstViewfinderBinClass * klass) { GObjectClass *gobject_klass; @@ -134,11 +121,17 @@ gst_viewfinder_bin_class_init (GstViewfinderBinClass * klass) "If video converters should be disabled (must be set on NULL)", DEFAULT_DISABLE_CONVERTERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_details_simple (element_class, "Viewfinder Bin", + "Sink/Video", "Viewfinder Bin used in camerabin2", + "Thiago Santos <thiago.sousa.santos@collabora.com>"); } static void -gst_viewfinder_bin_init (GstViewfinderBin * viewfinderbin, - GstViewfinderBinClass * viewfinderbin_class) +gst_viewfinder_bin_init (GstViewfinderBin * viewfinderbin) { GstPadTemplate *templ = gst_static_pad_template_get (&sink_template); viewfinderbin->ghostpad = gst_ghost_pad_new_no_target_from_template ("sink", diff --git a/gst/camerabin2/gstwrappercamerabinsrc.c b/gst/camerabin2/gstwrappercamerabinsrc.c index 1fc71c0b2..e0f52df40 100644 --- a/gst/camerabin2/gstwrappercamerabinsrc.c +++ b/gst/camerabin2/gstwrappercamerabinsrc.c @@ -1,7 +1,7 @@ /* * GStreamer * Copyright (C) 2010 Texas Instruments, Inc - * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk> + * Copyright (C) 2011 Thiago Santos <thiago.sousa.santos@collabora.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -46,8 +46,9 @@ enum GST_DEBUG_CATEGORY (wrapper_camera_bin_src_debug); #define GST_CAT_DEFAULT wrapper_camera_bin_src_debug -GST_BOILERPLATE (GstWrapperCameraBinSrc, gst_wrapper_camera_bin_src, - GstBaseCameraSrc, GST_TYPE_BASE_CAMERA_SRC); +#define gst_wrapper_camera_bin_src_parent_class parent_class +G_DEFINE_TYPE (GstWrapperCameraBinSrc, gst_wrapper_camera_bin_src, + GST_TYPE_BIN); static void set_capsfilter_caps (GstWrapperCameraBinSrc * self, GstCaps * new_caps); @@ -167,13 +168,14 @@ gst_wrapper_camera_bin_reset_video_src_caps (GstWrapperCameraBinSrc * self, if (GST_IS_BIN (self->src_vid_src)) { GstIterator *it = gst_bin_iterate_elements (GST_BIN (self->src_vid_src)); - gpointer item = NULL; + GValue item = { 0 }; gboolean done = FALSE; while (!done) { switch (gst_iterator_next (it, &item)) { case GST_ITERATOR_OK: - gst_element_set_base_time (GST_ELEMENT (item), base_time); - gst_object_unref (item); + gst_element_set_base_time (GST_ELEMENT (g_value_get_object + (&item)), base_time); + g_value_unset (&item); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (it); @@ -199,20 +201,21 @@ gst_wrapper_camera_bin_reset_video_src_caps (GstWrapperCameraBinSrc * self, * * Buffer probe called before sending each buffer to image queue. */ -static gboolean -gst_wrapper_camera_bin_src_imgsrc_probe (GstPad * pad, GstBuffer * buffer, +static GstPadProbeReturn +gst_wrapper_camera_bin_src_imgsrc_probe (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GstWrapperCameraBinSrc *self = GST_WRAPPER_CAMERA_BIN_SRC (data); GstBaseCameraSrc *camerasrc = GST_BASE_CAMERA_SRC (data); - gboolean ret = FALSE; + GstBuffer *buffer = GST_BUFFER (info->data); + GstPadProbeReturn ret = GST_PAD_PROBE_DROP; GST_LOG_OBJECT (self, "Image probe, mode %d, capture count %d", camerasrc->mode, self->image_capture_count); g_mutex_lock (camerasrc->capturing_mutex); if (self->image_capture_count > 0) { - ret = TRUE; + ret = GST_PAD_PROBE_OK; self->image_capture_count--; /* post preview */ @@ -234,13 +237,14 @@ gst_wrapper_camera_bin_src_imgsrc_probe (GstPad * pad, GstBuffer * buffer, * * Buffer probe called before sending each buffer to image queue. */ -static gboolean -gst_wrapper_camera_bin_src_vidsrc_probe (GstPad * pad, GstBuffer * buffer, +static GstPadProbeReturn +gst_wrapper_camera_bin_src_vidsrc_probe (GstPad * pad, GstPadProbeInfo * info, gpointer data) { GstWrapperCameraBinSrc *self = GST_WRAPPER_CAMERA_BIN_SRC (data); GstBaseCameraSrc *camerasrc = GST_BASE_CAMERA_SRC_CAST (self); - gboolean ret = FALSE; + GstPadProbeReturn ret = GST_PAD_PROBE_DROP; + GstBuffer *buffer = GST_BUFFER (info->data); GST_LOG_OBJECT (self, "Video probe, mode %d, capture status %d", camerasrc->mode, self->video_rec_status); @@ -256,6 +260,7 @@ gst_wrapper_camera_bin_src_vidsrc_probe (GstPad * pad, GstBuffer * buffer, /* NOP */ } else if (self->video_rec_status == GST_VIDEO_RECORDING_STATUS_STARTING) { GstClockTime ts; + GstSegment segment; GST_DEBUG_OBJECT (self, "Starting video recording"); self->video_rec_status = GST_VIDEO_RECORDING_STATUS_RUNNING; @@ -263,14 +268,15 @@ gst_wrapper_camera_bin_src_vidsrc_probe (GstPad * pad, GstBuffer * buffer, ts = GST_BUFFER_TIMESTAMP (buffer); if (!GST_CLOCK_TIME_IS_VALID (ts)) ts = 0; - gst_pad_push_event (self->vidsrc, gst_event_new_new_segment (FALSE, 1.0, - GST_FORMAT_TIME, ts, -1, 0)); + gst_segment_init (&segment, GST_FORMAT_TIME); + segment.start = ts; + gst_pad_push_event (self->vidsrc, gst_event_new_segment (&segment)); /* post preview */ GST_DEBUG_OBJECT (self, "Posting preview for video"); gst_base_camera_src_post_preview (camerasrc, buffer); - ret = TRUE; + ret = GST_PAD_PROBE_OK; } else if (self->video_rec_status == GST_VIDEO_RECORDING_STATUS_FINISHING) { /* send eos */ GST_DEBUG_OBJECT (self, "Finishing video recording, pushing eos"); @@ -278,14 +284,15 @@ gst_wrapper_camera_bin_src_vidsrc_probe (GstPad * pad, GstBuffer * buffer, self->video_rec_status = GST_VIDEO_RECORDING_STATUS_DONE; gst_base_camera_src_finish_capture (camerasrc); } else { - ret = TRUE; + ret = GST_PAD_PROBE_OK; } g_mutex_unlock (camerasrc->capturing_mutex); return ret; } static gboolean -gst_wrapper_camera_bin_src_event (GstPad * pad, GstEvent * event) +gst_wrapper_camera_bin_src_event (GstPad * pad, GstObject * parent, + GstEvent * event) { GstWrapperCameraBinSrc *src = GST_WRAPPER_CAMERA_BIN_SRC (GST_PAD_PARENT (pad)); @@ -302,25 +309,27 @@ gst_wrapper_camera_bin_src_event (GstPad * pad, GstEvent * event) src->video_renegotiate = TRUE; } } - - return src->srcpad_event_func (pad, event); + //TODO porting + //return src->srcpad_event_func (pad, event); + return TRUE; } -static gboolean -gst_wrapper_camera_src_src_event_probe (GstPad * pad, GstEvent * evt, +static GstPadProbeReturn +gst_wrapper_camera_src_src_event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer udata) { - gboolean ret = TRUE; + GstPadProbeReturn ret = GST_PAD_PROBE_OK; GstWrapperCameraBinSrc *self = udata; + GstEvent *evt = GST_EVENT (info->data); switch (GST_EVENT_TYPE (evt)) { case GST_EVENT_EOS: /* drop */ - ret = FALSE; + ret = GST_PAD_PROBE_DROP; break; - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: if (self->drop_newseg) { - ret = FALSE; + ret = GST_PAD_PROBE_DROP; self->drop_newseg = FALSE; } break; @@ -343,7 +352,7 @@ gst_wrapper_camera_bin_src_caps_cb (GObject * gobject, GParamSpec * pspec, /* get the new caps that were set on the capsfilter that configures the * source */ src_caps_src_pad = gst_element_get_static_pad (self->src_filter, "src"); - caps = gst_pad_get_caps_reffed (src_caps_src_pad); + caps = gst_pad_query_caps (src_caps_src_pad, NULL); gst_object_unref (src_caps_src_pad); GST_DEBUG_OBJECT (self, "src-filter caps changed to %s", gst_caps_to_string (caps)); @@ -439,8 +448,10 @@ gst_wrapper_camera_bin_src_construct_pipeline (GstBaseCameraSrc * bcamsrc) GstPad *pad; pad = gst_element_get_static_pad (self->src_vid_src, "src"); - self->src_event_probe_id = gst_pad_add_event_probe (pad, - (GCallback) gst_wrapper_camera_src_src_event_probe, self); + self->src_event_probe_id = + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, + gst_wrapper_camera_src_src_event_probe, gst_object_ref (self), + gst_object_unref); gst_object_unref (pad); } @@ -480,13 +491,13 @@ gst_wrapper_camera_bin_src_construct_pipeline (GstBaseCameraSrc * bcamsrc) goto done; /* viewfinder pad */ - vf_pad = gst_element_get_request_pad (tee, "src%d"); + vf_pad = gst_element_get_request_pad (tee, "src_%u"); g_object_set (tee, "alloc-pad", vf_pad, NULL); gst_ghost_pad_set_target (GST_GHOST_PAD (self->vfsrc), vf_pad); gst_object_unref (vf_pad); /* image/video pad from tee */ - tee_capture_pad = gst_element_get_request_pad (tee, "src%d"); + tee_capture_pad = gst_element_get_request_pad (tee, "src_%u"); self->output_selector = gst_element_factory_make ("output-selector", "outsel"); @@ -503,17 +514,19 @@ gst_wrapper_camera_bin_src_construct_pipeline (GstBaseCameraSrc * bcamsrc) /* Create the 2 output pads for video and image */ self->outsel_vidpad = - gst_element_get_request_pad (self->output_selector, "src%d"); + gst_element_get_request_pad (self->output_selector, "src_%u"); self->outsel_imgpad = - gst_element_get_request_pad (self->output_selector, "src%d"); + gst_element_get_request_pad (self->output_selector, "src_%u"); g_assert (self->outsel_vidpad != NULL); g_assert (self->outsel_imgpad != NULL); - gst_pad_add_buffer_probe (self->outsel_imgpad, - G_CALLBACK (gst_wrapper_camera_bin_src_imgsrc_probe), self); - gst_pad_add_buffer_probe (self->outsel_vidpad, - G_CALLBACK (gst_wrapper_camera_bin_src_vidsrc_probe), self); + gst_pad_add_probe (self->outsel_imgpad, GST_PAD_PROBE_TYPE_BUFFER, + gst_wrapper_camera_bin_src_imgsrc_probe, gst_object_ref (self), + gst_object_unref); + gst_pad_add_probe (self->outsel_vidpad, GST_PAD_PROBE_TYPE_BUFFER, + gst_wrapper_camera_bin_src_vidsrc_probe, gst_object_ref (self), + gst_object_unref); gst_ghost_pad_set_target (GST_GHOST_PAD (self->imgsrc), self->outsel_imgpad); gst_ghost_pad_set_target (GST_GHOST_PAD (self->vidsrc), @@ -1062,19 +1075,6 @@ end: } static void -gst_wrapper_camera_bin_src_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - GST_DEBUG_CATEGORY_INIT (wrapper_camera_bin_src_debug, "wrappercamerabinsrc", - 0, "V4l2 camera src"); - - gst_element_class_set_details_simple (gstelement_class, - "V4l2 camera src element for camerabin", "Source/Video", - "V4l2 camera src element for camerabin", "Rob Clark <rob@ti.com>"); -} - -static void gst_wrapper_camera_bin_src_class_init (GstWrapperCameraBinSrcClass * klass) { GObjectClass *gobject_class; @@ -1111,11 +1111,18 @@ gst_wrapper_camera_bin_src_class_init (GstWrapperCameraBinSrcClass * klass) gst_wrapper_camera_bin_src_start_capture; gstbasecamerasrc_class->stop_capture = gst_wrapper_camera_bin_src_stop_capture; + + GST_DEBUG_CATEGORY_INIT (wrapper_camera_bin_src_debug, "wrappercamerabinsrc", + 0, "wrapper camera src"); + + gst_element_class_set_details_simple (gstelement_class, + "Wrapper camera src element for camerabin2", "Source/Video", + "Wrapper camera src element for camerabin2", + "Thiago Santos <thiago.sousa.santos@collabora.com>"); } static void -gst_wrapper_camera_bin_src_init (GstWrapperCameraBinSrc * self, - GstWrapperCameraBinSrcClass * klass) +gst_wrapper_camera_bin_src_init (GstWrapperCameraBinSrc * self) { self->vfsrc = gst_ghost_pad_new_no_target (GST_BASE_CAMERA_SRC_VIEWFINDER_PAD_NAME, diff --git a/gst/cdxaparse/gstcdxaparse.c b/gst/cdxaparse/gstcdxaparse.c index 1f997b7bb..efcda2117 100644 --- a/gst/cdxaparse/gstcdxaparse.c +++ b/gst/cdxaparse/gstcdxaparse.c @@ -71,10 +71,10 @@ gst_cdxa_parse_base_init (gpointer g_class) "Wim Taymans <wim.taymans@tvd.be>"); /* register src pads */ - gst_element_class_add_static_pad_template (element_class, - &sink_template_factory); - gst_element_class_add_static_pad_template (element_class, - &src_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template_factory)); } static void diff --git a/gst/cdxaparse/gstvcdparse.c b/gst/cdxaparse/gstvcdparse.c index 601cb6b59..4bf148b82 100644 --- a/gst/cdxaparse/gstvcdparse.c +++ b/gst/cdxaparse/gstvcdparse.c @@ -55,8 +55,10 @@ gst_vcd_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); gst_element_class_set_details_simple (element_class, "(S)VCD stream parser", "Codec/Parser", "Strip (S)VCD stream from its sync headers", diff --git a/gst/chart/gstchart.c b/gst/chart/gstchart.c index da0a622ff..4e818b62a 100644 --- a/gst/chart/gstchart.c +++ b/gst/chart/gstchart.c @@ -138,8 +138,10 @@ gst_chart_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "Chart drawer", "Visualization", "Takes frames of data and outputs video frames of a chart of data", diff --git a/gst/coloreffects/Makefile.am b/gst/coloreffects/Makefile.am index 2dcbdd8e1..24a8b8062 100644 --- a/gst/coloreffects/Makefile.am +++ b/gst/coloreffects/Makefile.am @@ -6,12 +6,10 @@ libgstcoloreffects_la_SOURCES = \ gstchromahold.c libgstcoloreffects_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstcoloreffects_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ - $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstcoloreffects_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) diff --git a/gst/coloreffects/gstchromahold.c b/gst/coloreffects/gstchromahold.c index e6e7c4028..1c5524af4 100644 --- a/gst/coloreffects/gstchromahold.c +++ b/gst/coloreffects/gstchromahold.c @@ -128,10 +128,10 @@ gst_chroma_hold_base_init (gpointer g_class) "Removes all color information except for one color", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - gst_element_class_add_static_pad_template (element_class, - &gst_chroma_hold_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_chroma_hold_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_chroma_hold_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_chroma_hold_src_template)); GST_DEBUG_CATEGORY_INIT (gst_chroma_hold_debug, "chromahold", 0, "chromahold - Removes all color information except for one color"); @@ -437,7 +437,7 @@ gst_chroma_hold_before_transform (GstBaseTransform * btrans, GstBuffer * buf) GST_BUFFER_TIMESTAMP (buf)); GST_LOG ("Got stream time of %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) - gst_object_sync_values (G_OBJECT (self), timestamp); + gst_object_sync_values (GST_OBJECT (self), timestamp); } static GstFlowReturn diff --git a/gst/coloreffects/gstcoloreffects.c b/gst/coloreffects/gstcoloreffects.c index 0941df195..df78b8660 100644 --- a/gst/coloreffects/gstcoloreffects.c +++ b/gst/coloreffects/gstcoloreffects.c @@ -506,10 +506,10 @@ gst_color_effects_base_init (gpointer g_class) "Color Look-up Table filter", "Filippo Argiolas <filippo.argiolas@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_color_effects_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_color_effects_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_color_effects_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_color_effects_src_template)); } static void diff --git a/gst/colorspace/Makefile.am b/gst/colorspace/Makefile.am deleted file mode 100644 index c5f5bd4cb..000000000 --- a/gst/colorspace/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -plugin_LTLIBRARIES = libgstcolorspace.la - -ORC_SOURCE=gstcolorspaceorc -include $(top_srcdir)/common/orc.mak - -libgstcolorspace_la_SOURCES = gstcolorspace.c colorspace.c -nodist_libgstcolorspace_la_SOURCES = $(ORC_NODIST_SOURCES) -libgstcolorspace_la_CFLAGS = \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CFLAGS) \ - $(ORC_CFLAGS) -libgstcolorspace_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ - $(GST_BASE_LIBS) \ - $(GST_LIBS) \ - $(ORC_LIBS) -libgstcolorspace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstcolorspace_la_LIBTOOLFLAGS = --tag=disable-static - -noinst_HEADERS = gstcolorspace.h colorspace.h - -Android.mk: Makefile.am $(BUILT_SOURCES) - androgenizer \ - -:PROJECT libgstcolorspace -:SHARED libgstcolorspace \ - -:TAGS eng debug \ - -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ - -:SOURCES $(libgstcolorspace_la_SOURCES) \ - $(nodist_libgstcolorspace_la_SOURCES) \ - -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstcolorspace_la_CFLAGS) \ - -:LDFLAGS $(libgstcolorspace_la_LDFLAGS) \ - $(libgstcolorspace_la_LIBADD) \ - -ldl \ - -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ - LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ - > $@ diff --git a/gst/colorspace/colorspace.c b/gst/colorspace/colorspace.c deleted file mode 100644 index 15b6caf41..000000000 --- a/gst/colorspace/colorspace.c +++ /dev/null @@ -1,2474 +0,0 @@ -/* GStreamer - * Copyright (C) 2010 David Schleef <ds@schleef.org> - * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "colorspace.h" -#include <glib.h> -#include <string.h> -#include "gstcolorspaceorc.h" - - -static void colorspace_convert_generic (ColorspaceConvert * convert, - guint8 * dest, const guint8 * src); -static void colorspace_convert_lookup_fastpath (ColorspaceConvert * convert); -static void colorspace_convert_lookup_getput (ColorspaceConvert * convert); -static void colorspace_dither_none (ColorspaceConvert * convert, int j); -static void colorspace_dither_verterr (ColorspaceConvert * convert, int j); -static void colorspace_dither_halftone (ColorspaceConvert * convert, int j); - - -ColorspaceConvert * -colorspace_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec, - GstVideoFormat from_format, ColorSpaceColorSpec from_spec, - int width, int height) -{ - ColorspaceConvert *convert; - int i; - - g_return_val_if_fail (!gst_video_format_is_rgb (to_format) - || to_spec == COLOR_SPEC_RGB, NULL); - g_return_val_if_fail (!gst_video_format_is_yuv (to_format) - || to_spec == COLOR_SPEC_YUV_BT709 - || to_spec == COLOR_SPEC_YUV_BT470_6 - || to_spec == COLOR_SPEC_YUV_JPEG, NULL); - g_return_val_if_fail (gst_video_format_is_rgb (to_format) - || gst_video_format_is_yuv (to_format) - || (gst_video_format_is_gray (to_format) && - to_spec == COLOR_SPEC_GRAY), NULL); - - g_return_val_if_fail (!gst_video_format_is_rgb (from_format) - || from_spec == COLOR_SPEC_RGB, NULL); - g_return_val_if_fail (!gst_video_format_is_yuv (from_format) - || from_spec == COLOR_SPEC_YUV_BT709 - || from_spec == COLOR_SPEC_YUV_BT470_6 - || from_spec == COLOR_SPEC_YUV_JPEG, NULL); - g_return_val_if_fail (gst_video_format_is_rgb (from_format) - || gst_video_format_is_yuv (from_format) - || (gst_video_format_is_gray (from_format) && - from_spec == COLOR_SPEC_GRAY), NULL); - - convert = g_malloc (sizeof (ColorspaceConvert)); - memset (convert, 0, sizeof (ColorspaceConvert)); - - convert->to_format = to_format; - convert->to_spec = to_spec; - convert->from_format = from_format; - convert->from_spec = from_spec; - convert->height = height; - convert->width = width; - convert->convert = colorspace_convert_generic; - convert->dither16 = colorspace_dither_none; - - if (gst_video_format_get_component_depth (to_format, 0) > 8 || - gst_video_format_get_component_depth (from_format, 0) > 8) { - convert->use_16bit = TRUE; - } else { - convert->use_16bit = FALSE; - } - - for (i = 0; i < 4; i++) { - convert->dest_stride[i] = gst_video_format_get_row_stride (to_format, i, - width); - convert->dest_offset[i] = gst_video_format_get_component_offset (to_format, - i, width, height); - if (i == 0) - convert->dest_offset[i] = 0; - - convert->src_stride[i] = gst_video_format_get_row_stride (from_format, i, - width); - convert->src_offset[i] = gst_video_format_get_component_offset (from_format, - i, width, height); - if (i == 0) - convert->src_offset[i] = 0; - - GST_DEBUG ("%d: dest %d %d src %d %d", i, - convert->dest_stride[i], convert->dest_offset[i], - convert->src_stride[i], convert->src_offset[i]); - } - - colorspace_convert_lookup_fastpath (convert); - colorspace_convert_lookup_getput (convert); - - convert->tmpline = g_malloc (sizeof (guint8) * (width + 8) * 4); - convert->tmpline16 = g_malloc (sizeof (guint16) * (width + 8) * 4); - convert->errline = g_malloc (sizeof (guint16) * width * 4); - - if (to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) { - /* build poor man's palette, taken from ffmpegcolorspace */ - static const guint8 pal_value[6] = { 0x00, 0x33, 0x66, 0x99, 0xcc, 0xff }; - guint32 *palette; - gint r, g, b; - - convert->palette = palette = g_new (guint32, 256); - i = 0; - for (r = 0; r < 6; r++) { - for (g = 0; g < 6; g++) { - for (b = 0; b < 6; b++) { - palette[i++] = - (0xffU << 24) | (pal_value[r] << 16) | (pal_value[g] << 8) | - pal_value[b]; - } - } - } - palette[i++] = 0; /* 100% transparent, i == 6*6*6 */ - while (i < 256) - palette[i++] = 0xff000000; - } - - return convert; -} - -void -colorspace_convert_free (ColorspaceConvert * convert) -{ - g_free (convert->palette); - g_free (convert->tmpline); - g_free (convert->tmpline16); - g_free (convert->errline); - - g_free (convert); -} - -void -colorspace_convert_set_interlaced (ColorspaceConvert * convert, - gboolean interlaced) -{ - convert->interlaced = interlaced; -} - -void -colorspace_convert_set_dither (ColorspaceConvert * convert, int type) -{ - switch (type) { - case 0: - default: - convert->dither16 = colorspace_dither_none; - break; - case 1: - convert->dither16 = colorspace_dither_verterr; - break; - case 2: - convert->dither16 = colorspace_dither_halftone; - break; - } -} - -void -colorspace_convert_set_palette (ColorspaceConvert * convert, - const guint32 * palette) -{ - if (convert->palette == NULL) { - convert->palette = g_malloc (sizeof (guint32) * 256); - } - memcpy (convert->palette, palette, sizeof (guint32) * 256); -} - -const guint32 * -colorspace_convert_get_palette (ColorspaceConvert * convert) -{ - return convert->palette; -} - -void -colorspace_convert_convert (ColorspaceConvert * convert, - guint8 * dest, const guint8 * src) -{ - convert->convert (convert, dest, src); -} - -/* Line conversion to AYUV */ - -#define FRAME_GET_LINE(dir, comp, line) \ - ((dir) + convert-> dir ## _offset[(comp)] + convert-> dir ## _stride[(comp)] * (line)) - -static void -getline_I420 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_I420 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j >> 1), - FRAME_GET_LINE (src, 2, j >> 1), convert->width); -} - -static void -putline_I420 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_I420 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j >> 1), - FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2); -} - -static void -getline_YV12 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_I420 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j >> 1), - FRAME_GET_LINE (src, 2, j >> 1), convert->width); -} - -static void -putline_YV12 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_I420 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j >> 1), - FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2); -} - -static void -getline_YUY2 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_YUY2 (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2); -} - -static void -putline_YUY2 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_YUY2 (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2); -} - -static void -getline_UYVY (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_UYVY (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2); -} - -static void -putline_UYVY (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_UYVY (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2); -} - -static void -getline_YVYU (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_YVYU (dest, FRAME_GET_LINE (src, 0, j), convert->width / 2); -} - -static void -putline_YVYU (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_YVYU (FRAME_GET_LINE (dest, 0, j), src, convert->width / 2); -} - -static void -getline_v308 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = srcline[i * 3 + 0]; - dest[i * 4 + 2] = srcline[i * 3 + 1]; - dest[i * 4 + 3] = srcline[i * 3 + 2]; - } -} - -static void -putline_v308 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i * 3 + 0] = src[i * 4 + 1]; - destline[i * 3 + 1] = src[i * 4 + 2]; - destline[i * 3 + 2] = src[i * 4 + 3]; - } -} - -static void -getline_AYUV (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - memcpy (dest, FRAME_GET_LINE (src, 0, j), convert->width * 4); -} - -static void -putline_AYUV (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - memcpy (FRAME_GET_LINE (dest, 0, j), src, convert->width * 4); -} - -#if 0 -static void -getline_v410 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = GST_READ_UINT16_LE (srcline + i * 8 + 0); - dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 8 + 2); - dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + i * 8 + 4); - dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + i * 8 + 6); - } -} -#endif - -static void -getline_v210 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - - for (i = 0; i < convert->width; i += 6) { - guint32 a0, a1, a2, a3; - guint16 y0, y1, y2, y3, y4, y5; - guint16 u0, u2, u4; - guint16 v0, v2, v4; - - a0 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 0); - a1 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 4); - a2 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 8); - a3 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 12); - - u0 = ((a0 >> 0) & 0x3ff) >> 2; - y0 = ((a0 >> 10) & 0x3ff) >> 2; - v0 = ((a0 >> 20) & 0x3ff) >> 2; - y1 = ((a1 >> 0) & 0x3ff) >> 2; - - u2 = ((a1 >> 10) & 0x3ff) >> 2; - y2 = ((a1 >> 20) & 0x3ff) >> 2; - v2 = ((a2 >> 0) & 0x3ff) >> 2; - y3 = ((a2 >> 10) & 0x3ff) >> 2; - - u4 = ((a2 >> 20) & 0x3ff) >> 2; - y4 = ((a3 >> 0) & 0x3ff) >> 2; - v4 = ((a3 >> 10) & 0x3ff) >> 2; - y5 = ((a3 >> 20) & 0x3ff) >> 2; - - dest[4 * (i + 0) + 0] = 0xff; - dest[4 * (i + 0) + 1] = y0; - dest[4 * (i + 0) + 2] = u0; - dest[4 * (i + 0) + 3] = v0; - - dest[4 * (i + 1) + 0] = 0xff; - dest[4 * (i + 1) + 1] = y1; - dest[4 * (i + 1) + 2] = u0; - dest[4 * (i + 1) + 3] = v0; - - dest[4 * (i + 2) + 0] = 0xff; - dest[4 * (i + 2) + 1] = y2; - dest[4 * (i + 2) + 2] = u2; - dest[4 * (i + 2) + 3] = v2; - - dest[4 * (i + 3) + 0] = 0xff; - dest[4 * (i + 3) + 1] = y3; - dest[4 * (i + 3) + 2] = u2; - dest[4 * (i + 3) + 3] = v2; - - dest[4 * (i + 4) + 0] = 0xff; - dest[4 * (i + 4) + 1] = y4; - dest[4 * (i + 4) + 2] = u4; - dest[4 * (i + 4) + 3] = v4; - - dest[4 * (i + 5) + 0] = 0xff; - dest[4 * (i + 5) + 1] = y5; - dest[4 * (i + 5) + 2] = u4; - dest[4 * (i + 5) + 3] = v4; - - } - -} - -static void -putline_v210 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - - for (i = 0; i < convert->width + 5; i += 6) { - guint32 a0, a1, a2, a3; - guint16 y0, y1, y2, y3, y4, y5; - guint16 u0, u1, u2; - guint16 v0, v1, v2; - - y0 = src[4 * (i + 0) + 1] << 2; - y1 = src[4 * (i + 1) + 1] << 2; - y2 = src[4 * (i + 2) + 1] << 2; - y3 = src[4 * (i + 3) + 1] << 2; - y4 = src[4 * (i + 4) + 1] << 2; - y5 = src[4 * (i + 5) + 1] << 2; - - u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2]) << 1; - u1 = (src[4 * (i + 2) + 2] + src[4 * (i + 3) + 2]) << 1; - u2 = (src[4 * (i + 4) + 2] + src[4 * (i + 5) + 2]) << 1; - - v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3]) << 1; - v1 = (src[4 * (i + 2) + 3] + src[4 * (i + 3) + 3]) << 1; - v2 = (src[4 * (i + 4) + 3] + src[4 * (i + 5) + 3]) << 1; - - a0 = u0 | (y0 << 10) | (v0 << 20); - a1 = y1 | (u1 << 10) | (y2 << 20); - a2 = v1 | (y3 << 10) | (u2 << 20); - a3 = y4 | (v2 << 10) | (y5 << 20); - - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 0, a0); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 4, a1); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 8, a2); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 12, a3); - } -} - -static void -getline16_v210 (ColorspaceConvert * convert, guint16 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - - for (i = 0; i < convert->width; i += 6) { - guint32 a0, a1, a2, a3; - guint16 y0, y1, y2, y3, y4, y5; - guint16 u0, u2, u4; - guint16 v0, v2, v4; - - a0 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 0); - a1 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 4); - a2 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 8); - a3 = GST_READ_UINT32_LE (srcline + (i / 6) * 16 + 12); - - u0 = ((a0 >> 0) & 0x3ff) << 6; - y0 = ((a0 >> 10) & 0x3ff) << 6; - v0 = ((a0 >> 20) & 0x3ff) << 6; - y1 = ((a1 >> 0) & 0x3ff) << 6; - - u2 = ((a1 >> 10) & 0x3ff) << 6; - y2 = ((a1 >> 20) & 0x3ff) << 6; - v2 = ((a2 >> 0) & 0x3ff) << 6; - y3 = ((a2 >> 10) & 0x3ff) << 6; - - u4 = ((a2 >> 20) & 0x3ff) << 6; - y4 = ((a3 >> 0) & 0x3ff) << 6; - v4 = ((a3 >> 10) & 0x3ff) << 6; - y5 = ((a3 >> 20) & 0x3ff) << 6; - - dest[4 * (i + 0) + 0] = 0xffff; - dest[4 * (i + 0) + 1] = y0; - dest[4 * (i + 0) + 2] = u0; - dest[4 * (i + 0) + 3] = v0; - - dest[4 * (i + 1) + 0] = 0xffff; - dest[4 * (i + 1) + 1] = y1; - dest[4 * (i + 1) + 2] = u0; - dest[4 * (i + 1) + 3] = v0; - - dest[4 * (i + 2) + 0] = 0xffff; - dest[4 * (i + 2) + 1] = y2; - dest[4 * (i + 2) + 2] = u2; - dest[4 * (i + 2) + 3] = v2; - - dest[4 * (i + 3) + 0] = 0xffff; - dest[4 * (i + 3) + 1] = y3; - dest[4 * (i + 3) + 2] = u2; - dest[4 * (i + 3) + 3] = v2; - - dest[4 * (i + 4) + 0] = 0xffff; - dest[4 * (i + 4) + 1] = y4; - dest[4 * (i + 4) + 2] = u4; - dest[4 * (i + 4) + 3] = v4; - - dest[4 * (i + 5) + 0] = 0xffff; - dest[4 * (i + 5) + 1] = y5; - dest[4 * (i + 5) + 2] = u4; - dest[4 * (i + 5) + 3] = v4; - - } -} - -static void -putline16_v210 (ColorspaceConvert * convert, guint8 * dest, const guint16 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - - for (i = 0; i < convert->width + 5; i += 6) { - guint32 a0, a1, a2, a3; - guint16 y0, y1, y2, y3, y4, y5; - guint16 u0, u1, u2; - guint16 v0, v1, v2; - - y0 = src[4 * (i + 0) + 1] >> 6; - y1 = src[4 * (i + 1) + 1] >> 6; - y2 = src[4 * (i + 2) + 1] >> 6; - y3 = src[4 * (i + 3) + 1] >> 6; - y4 = src[4 * (i + 4) + 1] >> 6; - y5 = src[4 * (i + 5) + 1] >> 6; - - u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2] + 1) >> 7; - u1 = (src[4 * (i + 2) + 2] + src[4 * (i + 3) + 2] + 1) >> 7; - u2 = (src[4 * (i + 4) + 2] + src[4 * (i + 5) + 2] + 1) >> 7; - - v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3] + 1) >> 7; - v1 = (src[4 * (i + 2) + 3] + src[4 * (i + 3) + 3] + 1) >> 7; - v2 = (src[4 * (i + 4) + 3] + src[4 * (i + 5) + 3] + 1) >> 7; - - a0 = u0 | (y0 << 10) | (v0 << 20); - a1 = y1 | (u1 << 10) | (y2 << 20); - a2 = v1 | (y3 << 10) | (u2 << 20); - a3 = y4 | (v2 << 10) | (y5 << 20); - - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 0, a0); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 4, a1); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 8, a2); - GST_WRITE_UINT32_LE (destline + (i / 6) * 16 + 12, a3); - } -} - -static void -getline_v216 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 4 + 2) >> 8; - dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 0) >> 8; - dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 4) >> 8; - } -} - -static void -putline_v216 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width / 2; i++) { - GST_WRITE_UINT16_LE (destline + i * 8 + 0, src[(i * 2 + 0) * 4 + 2] << 8); - GST_WRITE_UINT16_LE (destline + i * 8 + 2, src[(i * 2 + 0) * 4 + 1] << 8); - GST_WRITE_UINT16_LE (destline + i * 8 + 4, src[(i * 2 + 1) * 4 + 3] << 8); - GST_WRITE_UINT16_LE (destline + i * 8 + 8, src[(i * 2 + 0) * 4 + 1] << 8); - } -} - -static void -getline16_v216 (ColorspaceConvert * convert, guint16 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xffff; - dest[i * 4 + 1] = GST_READ_UINT16_LE (srcline + i * 4 + 2); - dest[i * 4 + 2] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 0); - dest[i * 4 + 3] = GST_READ_UINT16_LE (srcline + (i >> 1) * 8 + 4); - } -} - -static void -putline16_v216 (ColorspaceConvert * convert, guint8 * dest, const guint16 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width / 2; i++) { - GST_WRITE_UINT16_LE (destline + i * 8 + 0, src[(i * 2 + 0) * 4 + 2]); - GST_WRITE_UINT16_LE (destline + i * 8 + 2, src[(i * 2 + 0) * 4 + 1]); - GST_WRITE_UINT16_LE (destline + i * 8 + 4, src[(i * 2 + 1) * 4 + 3]); - GST_WRITE_UINT16_LE (destline + i * 8 + 8, src[(i * 2 + 0) * 4 + 1]); - } -} - -static void -getline_Y41B (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_YUV9 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j), FRAME_GET_LINE (src, 2, j), - convert->width / 2); -} - -static void -putline_Y41B (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destlineY = FRAME_GET_LINE (dest, 0, j); - guint8 *destlineU = FRAME_GET_LINE (dest, 1, j); - guint8 *destlineV = FRAME_GET_LINE (dest, 2, j); - - for (i = 0; i < convert->width - 3; i += 4) { - destlineY[i] = src[i * 4 + 1]; - destlineY[i + 1] = src[i * 4 + 5]; - destlineY[i + 2] = src[i * 4 + 9]; - destlineY[i + 3] = src[i * 4 + 13]; - - destlineU[i >> 2] = - (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 + 14] + - 2) >> 2; - destlineV[i >> 2] = - (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 + 15] + - 2) >> 2; - } - - if (i == convert->width - 3) { - destlineY[i] = src[i * 4 + 1]; - destlineY[i + 1] = src[i * 4 + 5]; - destlineY[i + 2] = src[i * 4 + 9]; - - destlineU[i >> 2] = - (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + 1) / 3; - destlineV[i >> 2] = - (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + 1) / 3; - } else if (i == convert->width - 2) { - destlineY[i] = src[i * 4 + 1]; - destlineY[i + 1] = src[i * 4 + 5]; - - destlineU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6] + 1) >> 1; - destlineV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7] + 1) >> 1; - } else if (i == convert->width - 1) { - destlineY[i + 1] = src[i * 4 + 5]; - - destlineU[i >> 2] = src[i * 4 + 2]; - destlineV[i >> 2] = src[i * 4 + 3]; - } -} - -static void -getline_Y42B (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_Y42B (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j), - FRAME_GET_LINE (src, 2, j), convert->width / 2); -} - -static void -putline_Y42B (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_Y42B (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j), - FRAME_GET_LINE (dest, 2, j), src, convert->width / 2); -} - -static void -getline_Y444 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_Y444 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j), FRAME_GET_LINE (src, 2, j), convert->width); -} - -static void -putline_Y444 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_Y444 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j), - FRAME_GET_LINE (dest, 2, j), src, convert->width); -} - -static void -getline_Y800 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_Y800 (dest, FRAME_GET_LINE (src, 0, j), convert->width); -} - -static void -putline_Y800 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_Y800 (FRAME_GET_LINE (dest, 0, j), src, convert->width); -} - -static void -getline_Y16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_Y16 (dest, FRAME_GET_LINE (src, 0, j), convert->width); -} - -static void -putline_Y16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_Y16 (FRAME_GET_LINE (dest, 0, j), src, convert->width); -} - -static void -getline_RGB16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = ((srcline[i] >> 11) & 0x1f) << 3; - dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x3f) << 2; - dest[i * 4 + 3] = ((srcline[i]) & 0x1f) << 3; - } -} - -static void -putline_RGB16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i] = - ((src[i * 4 + 1] >> 3) << 11) | ((src[i * 4 + - 2] >> 2) << 5) | (src[i * 4 + 3] >> 3); - } -} - -static void -getline_BGR16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 3] = ((srcline[i] >> 11) & 0x1f) << 3; - dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x3f) << 2; - dest[i * 4 + 1] = ((srcline[i]) & 0x1f) << 3; - } -} - -static void -putline_BGR16 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i] = - ((src[i * 4 + 3] >> 3) << 11) | ((src[i * 4 + - 2] >> 2) << 5) | (src[i * 4 + 1] >> 3); - } -} - -static void -getline_RGB15 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = ((srcline[i] >> 10) & 0x1f) << 3; - dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x1f) << 3; - dest[i * 4 + 3] = ((srcline[i]) & 0x1f) << 3; - } -} - -static void -putline_RGB15 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i] = - ((src[i * 4 + 1] >> 3) << 10) | ((src[i * 4 + - 2] >> 3) << 5) | (src[i * 4 + 3] >> 3); - } -} - -static void -getline_BGR15 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 3] = ((srcline[i] >> 10) & 0x1f) << 3; - dest[i * 4 + 2] = ((srcline[i] >> 5) & 0x1f) << 3; - dest[i * 4 + 1] = ((srcline[i]) & 0x1f) << 3; - } -} - -static void -putline_BGR15 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i] = - ((src[i * 4 + 3] >> 3) << 10) | ((src[i * 4 + - 2] >> 3) << 5) | (src[i * 4 + 1] >> 3); - } -} - -static void -getline_BGRA (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_BGRA (dest, FRAME_GET_LINE (src, 0, j), convert->width); -} - -static void -putline_BGRA (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_BGRA (FRAME_GET_LINE (dest, 0, j), src, convert->width); -} - -static void -getline_ABGR (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_ABGR (dest, FRAME_GET_LINE (src, 0, j), convert->width); -} - -static void -putline_ABGR (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_ABGR (FRAME_GET_LINE (dest, 0, j), src, convert->width); -} - -static void -getline_RGBA (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_RGBA (dest, FRAME_GET_LINE (src, 0, j), convert->width); -} - -static void -putline_RGBA (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_RGBA (FRAME_GET_LINE (dest, 0, j), src, convert->width); -} - -static void -getline_RGB (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = srcline[i * 3 + 0]; - dest[i * 4 + 2] = srcline[i * 3 + 1]; - dest[i * 4 + 3] = srcline[i * 3 + 2]; - } -} - -static void -putline_RGB (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i * 3 + 0] = src[i * 4 + 1]; - destline[i * 3 + 1] = src[i * 4 + 2]; - destline[i * 3 + 2] = src[i * 4 + 3]; - } -} - -static void -getline_BGR (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = srcline[i * 3 + 2]; - dest[i * 4 + 2] = srcline[i * 3 + 1]; - dest[i * 4 + 3] = srcline[i * 3 + 0]; - } -} - -static void -putline_BGR (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - destline[i * 3 + 0] = src[i * 4 + 3]; - destline[i * 3 + 1] = src[i * 4 + 2]; - destline[i * 3 + 2] = src[i * 4 + 1]; - } -} - -static void -getline_NV12 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_NV12 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j >> 1), convert->width / 2); -} - -static void -putline_NV12 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_NV12 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j >> 1), src, convert->width / 2); -} - -static void -getline_NV21 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_NV21 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 2, j >> 1), convert->width / 2); -} - -static void -putline_NV21 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_NV21 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 2, j >> 1), src, convert->width / 2); -} - -static void -getline_UYVP (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - - for (i = 0; i < convert->width; i += 2) { - guint16 y0, y1; - guint16 u0; - guint16 v0; - - u0 = (src[(i / 2) * 5 + 0] << 2) | (src[(i / 2) * 5 + 1] >> 6); - y0 = ((src[(i / 2) * 5 + 1] & 0x3f) << 4) | (src[(i / 2) * 5 + 2] >> 4); - v0 = ((src[(i / 2) * 5 + 2] & 0x0f) << 6) | (src[(i / 2) * 5 + 3] >> 2); - y1 = ((src[(i / 2) * 5 + 3] & 0x03) << 8) | src[(i / 2) * 5 + 4]; - - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = y0 >> 2; - dest[i * 4 + 2] = u0 >> 2; - dest[i * 4 + 3] = v0 >> 2; - dest[i * 4 + 4] = 0xff; - dest[i * 4 + 5] = y1 >> 2; - dest[i * 4 + 6] = u0 >> 2; - dest[i * 4 + 7] = v0 >> 2; - } -} - -static void -putline_UYVP (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - - for (i = 0; i < convert->width; i += 2) { - guint16 y0, y1; - guint16 u0; - guint16 v0; - - y0 = src[4 * (i + 0) + 1]; - y1 = src[4 * (i + 1) + 1]; - u0 = (src[4 * (i + 0) + 2] + src[4 * (i + 1) + 2] + 1) >> 1; - v0 = (src[4 * (i + 0) + 3] + src[4 * (i + 1) + 3] + 1) >> 1; - - dest[(i / 2) * 5 + 0] = u0; - dest[(i / 2) * 5 + 1] = y0 >> 2; - dest[(i / 2) * 5 + 2] = (y0 << 6) | (v0 >> 4); - dest[(i / 2) * 5 + 3] = (v0 << 4) | (y1 >> 2); - dest[(i / 2) * 5 + 4] = (y1 << 2); - } -} - -static void -getline_A420 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_A420 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j >> 1), - FRAME_GET_LINE (src, 2, j >> 1), - FRAME_GET_LINE (src, 3, j), convert->width); -} - -static void -putline_A420 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_putline_A420 (FRAME_GET_LINE (dest, 0, j), - FRAME_GET_LINE (dest, 1, j >> 1), - FRAME_GET_LINE (dest, 2, j >> 1), - FRAME_GET_LINE (dest, 3, j), src, convert->width / 2); -} - -static void -getline_RGB8P (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - guint32 v = convert->palette[srcline[i]]; - dest[i * 4 + 0] = (v >> 24) & 0xff; - dest[i * 4 + 1] = (v >> 16) & 0xff; - dest[i * 4 + 2] = (v >> 8) & 0xff; - dest[i * 4 + 3] = (v) & 0xff; - } -} - -static void -putline_RGB8P (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - /* Use our poor man's palette, taken from ffmpegcolorspace too */ - for (i = 0; i < convert->width; i++) { - /* crude approximation for alpha ! */ - if (src[i * 4 + 0] < 0x80) - destline[i] = 6 * 6 * 6; - else - destline[i] = - ((((src[i * 4 + 1]) / 47) % 6) * 6 * 6 + (((src[i * 4 + - 2]) / 47) % 6) * 6 + (((src[i * 4 + 3]) / 47) % 6)); - } -} - - -static void -getline_YUV9 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - cogorc_getline_YUV9 (dest, - FRAME_GET_LINE (src, 0, j), - FRAME_GET_LINE (src, 1, j >> 2), - FRAME_GET_LINE (src, 2, j >> 2), convert->width / 2); -} - -static void -putline_YUV9 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destY = FRAME_GET_LINE (dest, 0, j); - guint8 *destU = FRAME_GET_LINE (dest, 1, j >> 2); - guint8 *destV = FRAME_GET_LINE (dest, 2, j >> 2); - - for (i = 0; i < convert->width - 3; i += 4) { - destY[i] = src[i * 4 + 1]; - destY[i + 1] = src[i * 4 + 5]; - destY[i + 2] = src[i * 4 + 9]; - destY[i + 3] = src[i * 4 + 13]; - if (j % 4 == 0) { - destU[i >> 2] = - (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 + - 14]) >> 2; - destV[i >> 2] = - (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 + - 15]) >> 2; - } - } - - if (i == convert->width - 3) { - destY[i] = src[i * 4 + 1]; - destY[i + 1] = src[i * 4 + 5]; - destY[i + 2] = src[i * 4 + 9]; - if (j % 4 == 0) { - destU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10]) / 3; - destV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11]) / 3; - } - } else if (i == convert->width - 2) { - destY[i] = src[i * 4 + 1]; - destY[i + 1] = src[i * 4 + 5]; - if (j % 4 == 0) { - destU[i >> 2] = (src[i * 4 + 2] + src[i * 4 + 6]) >> 1; - destV[i >> 2] = (src[i * 4 + 3] + src[i * 4 + 7]) >> 1; - } - } else if (i == convert->width - 1) { - destY[i] = src[i * 4 + 1]; - destU[i >> 2] = src[i * 4 + 2]; - destV[i >> 2] = src[i * 4 + 3]; - } -} - -static void -getline_IYU1 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - - for (i = 0; i < convert->width - 3; i += 4) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 4] = 0xff; - dest[i * 4 + 8] = 0xff; - dest[i * 4 + 12] = 0xff; - dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1]; - dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2]; - dest[i * 4 + 9] = srcline[(i >> 2) * 6 + 4]; - dest[i * 4 + 13] = srcline[(i >> 2) * 6 + 5]; - dest[i * 4 + 2] = dest[i * 4 + 6] = dest[i * 4 + 10] = dest[i * 4 + 14] = - srcline[(i >> 2) * 6 + 0]; - dest[i * 4 + 3] = dest[i * 4 + 7] = dest[i * 4 + 11] = dest[i * 4 + 15] = - srcline[(i >> 2) * 6 + 3]; - } - - if (i == convert->width - 3) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 4] = 0xff; - dest[i * 4 + 8] = 0xff; - dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1]; - dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2]; - dest[i * 4 + 9] = srcline[(i >> 2) * 6 + 4]; - dest[i * 4 + 2] = dest[i * 4 + 6] = dest[i * 4 + 10] = - srcline[(i >> 2) * 6 + 0]; - dest[i * 4 + 3] = dest[i * 4 + 7] = dest[i * 4 + 11] = - srcline[(i >> 2) * 6 + 3]; - } else if (i == convert->width - 2) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 4] = 0xff; - dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1]; - dest[i * 4 + 5] = srcline[(i >> 2) * 6 + 2]; - dest[i * 4 + 2] = dest[i * 4 + 6] = srcline[(i >> 2) * 6 + 0]; - dest[i * 4 + 3] = dest[i * 4 + 7] = srcline[(i >> 2) * 6 + 3]; - } else if (i == convert->width - 1) { - dest[i * 4 + 0] = 0xff; - dest[i * 4 + 1] = srcline[(i >> 2) * 6 + 1]; - dest[i * 4 + 2] = srcline[(i >> 2) * 6 + 0]; - dest[i * 4 + 3] = srcline[(i >> 2) * 6 + 3]; - } -} - -static void -putline_IYU1 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - - for (i = 0; i < convert->width - 3; i += 4) { - destline[(i >> 2) * 6 + 1] = src[i * 4 + 1]; - destline[(i >> 2) * 6 + 2] = src[i * 4 + 5]; - destline[(i >> 2) * 6 + 4] = src[i * 4 + 9]; - destline[(i >> 2) * 6 + 5] = src[i * 4 + 13]; - destline[(i >> 2) * 6 + 0] = - (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10] + src[i * 4 + - 14]) >> 2; - destline[(i >> 2) * 6 + 3] = - (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11] + src[i * 4 + - 15]) >> 2; - } - - if (i == convert->width - 3) { - destline[(i >> 2) * 6 + 1] = src[i * 4 + 1]; - destline[(i >> 2) * 6 + 2] = src[i * 4 + 5]; - destline[(i >> 2) * 6 + 4] = src[i * 4 + 9]; - destline[(i >> 2) * 6 + 0] = - (src[i * 4 + 2] + src[i * 4 + 6] + src[i * 4 + 10]) / 3; - destline[(i >> 2) * 6 + 3] = - (src[i * 4 + 3] + src[i * 4 + 7] + src[i * 4 + 11]) / 3; - } else if (i == convert->width - 2) { - destline[(i >> 2) * 6 + 1] = src[i * 4 + 1]; - destline[(i >> 2) * 6 + 2] = src[i * 4 + 5]; - destline[(i >> 2) * 6 + 0] = (src[i * 4 + 2] + src[i * 4 + 6]) >> 1; - destline[(i >> 2) * 6 + 3] = (src[i * 4 + 3] + src[i * 4 + 7]) >> 1; - } else if (i == convert->width - 1) { - destline[(i >> 2) * 6 + 1] = src[i * 4 + 1]; - destline[(i >> 2) * 6 + 0] = src[i * 4 + 2]; - destline[(i >> 2) * 6 + 3] = src[i * 4 + 3]; - } -} - -static void -getline_AY64 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint16 *srcline = (const guint16 *) FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width * 4; i++) { - dest[i] = srcline[i] >> 8; - } -} - -static void -putline_AY64 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint16 *destline = (guint16 *) FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width * 4; i++) { - destline[i] = src[i] << 8; - } -} - -static void -getline16_AY64 (ColorspaceConvert * convert, guint16 * dest, const guint8 * src, - int j) -{ - memcpy (dest, FRAME_GET_LINE (src, 0, j), convert->width * 8); -} - -static void -putline16_AY64 (ColorspaceConvert * convert, guint8 * dest, const guint16 * src, - int j) -{ - memcpy (FRAME_GET_LINE (dest, 0, j), src, convert->width * 8); -} - -static void -getline_r210 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - guint8 x; - dest[i * 4 + 0] = 0xff; - x = GST_READ_UINT32_BE (srcline + i * 4); - dest[i * 4 + 1] = (x >> 22) & 0xff; - dest[i * 4 + 2] = (x >> 12) & 0xff; - dest[i * 4 + 3] = (x >> 2) & 0xff; - } -} - -static void -putline_r210 (ColorspaceConvert * convert, guint8 * dest, const guint8 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width / 2; i++) { - guint32 x = 0; - x |= src[i * 4 + 1] << 22; - x |= (src[i * 4 + 1] & 0xc0) << 14; - x |= src[i * 4 + 2] << 12; - x |= (src[i * 4 + 2] & 0xc0) << 10; - x |= src[i * 4 + 3] << 2; - x |= (src[i * 4 + 3] & 0xc0) >> 6; - GST_WRITE_UINT32_BE (destline + i * 4, x); - } -} - -static void -getline16_r210 (ColorspaceConvert * convert, guint16 * dest, const guint8 * src, - int j) -{ - int i; - const guint8 *srcline = FRAME_GET_LINE (src, 0, j); - for (i = 0; i < convert->width; i++) { - guint32 x; - dest[i * 4 + 0] = 0xffff; - x = GST_READ_UINT32_BE (srcline + i * 4); - dest[i * 4 + 1] = ((x >> 14) & 0xffc0) | (x >> 24); - dest[i * 4 + 2] = ((x >> 4) & 0xffc0) | ((x >> 14) & 0x3f); - dest[i * 4 + 3] = ((x << 6) & 0xffc0) | ((x >> 4) & 0x3f); - } -} - -static void -putline16_r210 (ColorspaceConvert * convert, guint8 * dest, const guint16 * src, - int j) -{ - int i; - guint8 *destline = FRAME_GET_LINE (dest, 0, j); - for (i = 0; i < convert->width; i++) { - guint32 x = 0; - x |= (src[i * 4 + 1] & 0xffc0) << 14; - x |= (src[i * 4 + 2] & 0xffc0) << 4; - x |= (src[i * 4 + 3] & 0xffc0) >> 6; - GST_WRITE_UINT32_BE (destline + i * 4, x); - } -} - -static void -getline16_convert (ColorspaceConvert * convert, guint16 * dest, - const guint8 * src, int j) -{ - int i; - convert->getline (convert, convert->tmpline, src, j); - for (i = 0; i < convert->width * 4; i++) { - dest[i] = convert->tmpline[i] << 8; - } -} - -static void -putline16_convert (ColorspaceConvert * convert, guint8 * dest, - const guint16 * src, int j) -{ - int i; - for (i = 0; i < convert->width * 4; i++) { - convert->tmpline[i] = src[i] >> 8; - } - convert->putline (convert, dest, convert->tmpline, j); -} - -typedef struct -{ - GstVideoFormat format; - void (*getline) (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src, int j); - void (*putline) (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src, int j); - void (*getline16) (ColorspaceConvert * convert, guint16 * dest, - const guint8 * src, int j); - void (*putline16) (ColorspaceConvert * convert, guint8 * dest, - const guint16 * src, int j); -} ColorspaceLine; -static const ColorspaceLine lines[] = { - {GST_VIDEO_FORMAT_I420, getline_I420, putline_I420}, - {GST_VIDEO_FORMAT_YV12, getline_YV12, putline_YV12}, - {GST_VIDEO_FORMAT_YUY2, getline_YUY2, putline_YUY2}, - {GST_VIDEO_FORMAT_UYVY, getline_UYVY, putline_UYVY}, - {GST_VIDEO_FORMAT_AYUV, getline_AYUV, putline_AYUV}, - {GST_VIDEO_FORMAT_RGBx, getline_RGBA, putline_RGBA}, - {GST_VIDEO_FORMAT_BGRx, getline_BGRA, putline_BGRA}, - {GST_VIDEO_FORMAT_xRGB, getline_AYUV, putline_AYUV}, - {GST_VIDEO_FORMAT_xBGR, getline_ABGR, putline_ABGR}, - {GST_VIDEO_FORMAT_RGBA, getline_RGBA, putline_RGBA}, - {GST_VIDEO_FORMAT_BGRA, getline_BGRA, putline_BGRA}, - {GST_VIDEO_FORMAT_ARGB, getline_AYUV, putline_AYUV}, - {GST_VIDEO_FORMAT_ABGR, getline_ABGR, putline_ABGR}, - {GST_VIDEO_FORMAT_RGB, getline_RGB, putline_RGB}, - {GST_VIDEO_FORMAT_BGR, getline_BGR, putline_BGR}, - {GST_VIDEO_FORMAT_Y41B, getline_Y41B, putline_Y41B}, - {GST_VIDEO_FORMAT_Y42B, getline_Y42B, putline_Y42B}, - {GST_VIDEO_FORMAT_YVYU, getline_YVYU, putline_YVYU}, - {GST_VIDEO_FORMAT_Y444, getline_Y444, putline_Y444}, - {GST_VIDEO_FORMAT_v210, getline_v210, putline_v210, - getline16_v210, putline16_v210}, - {GST_VIDEO_FORMAT_v216, getline_v216, putline_v216, - getline16_v216, putline16_v216}, - {GST_VIDEO_FORMAT_NV12, getline_NV12, putline_NV12}, - {GST_VIDEO_FORMAT_NV21, getline_NV21, putline_NV21}, - //{GST_VIDEO_FORMAT_GRAY8, getline_GRAY8, putline_GRAY8}, - //{GST_VIDEO_FORMAT_GRAY16_BE, getline_GRAY16_BE, putline_GRAY16_BE}, - //{GST_VIDEO_FORMAT_GRAY16_LE, getline_GRAY16_LE, putline_GRAY16_LE}, - {GST_VIDEO_FORMAT_v308, getline_v308, putline_v308}, - {GST_VIDEO_FORMAT_Y800, getline_Y800, putline_Y800}, - {GST_VIDEO_FORMAT_Y16, getline_Y16, putline_Y16}, - {GST_VIDEO_FORMAT_RGB16, getline_RGB16, putline_RGB16}, - {GST_VIDEO_FORMAT_BGR16, getline_BGR16, putline_BGR16}, - {GST_VIDEO_FORMAT_RGB15, getline_RGB15, putline_RGB15}, - {GST_VIDEO_FORMAT_BGR15, getline_BGR15, putline_BGR15}, - {GST_VIDEO_FORMAT_UYVP, getline_UYVP, putline_UYVP}, - {GST_VIDEO_FORMAT_A420, getline_A420, putline_A420} - , {GST_VIDEO_FORMAT_RGB8_PALETTED, getline_RGB8P, putline_RGB8P}, - {GST_VIDEO_FORMAT_YUV9, getline_YUV9, putline_YUV9}, - {GST_VIDEO_FORMAT_YVU9, getline_YUV9, putline_YUV9}, /* alias */ - {GST_VIDEO_FORMAT_IYU1, getline_IYU1, putline_IYU1}, - {GST_VIDEO_FORMAT_ARGB64, getline_AY64, putline_AY64, getline16_AY64, - putline16_AY64}, - {GST_VIDEO_FORMAT_AYUV64, getline_AY64, putline_AY64, getline16_AY64, - putline16_AY64}, - {GST_VIDEO_FORMAT_r210, getline_r210, putline_r210, getline16_r210, - putline16_r210} -}; - -static void -matrix_rgb_to_yuv_bt470_6 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - r = tmpline[i * 4 + 1]; - g = tmpline[i * 4 + 2]; - b = tmpline[i * 4 + 3]; - - y = (66 * r + 129 * g + 25 * b + 4096) >> 8; - u = (-38 * r - 74 * g + 112 * b + 32768) >> 8; - v = (112 * r - 94 * g - 18 * b + 32768) >> 8; - - tmpline[i * 4 + 1] = CLAMP (y, 0, 255); - tmpline[i * 4 + 2] = CLAMP (u, 0, 255); - tmpline[i * 4 + 3] = CLAMP (v, 0, 255); - } -} - -static void -matrix_rgb_to_yuv_bt709 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - r = tmpline[i * 4 + 1]; - g = tmpline[i * 4 + 2]; - b = tmpline[i * 4 + 3]; - - y = (47 * r + 157 * g + 16 * b + 4096) >> 8; - u = (-26 * r - 87 * g + 112 * b + 32768) >> 8; - v = (112 * r - 102 * g - 10 * b + 32768) >> 8; - - tmpline[i * 4 + 1] = CLAMP (y, 0, 255); - tmpline[i * 4 + 2] = CLAMP (u, 0, 255); - tmpline[i * 4 + 3] = CLAMP (v, 0, 255); - } -} - -static void -matrix_yuv_bt470_6_to_rgb (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (298 * y + 409 * v - 57068) >> 8; - g = (298 * y - 100 * u - 208 * v + 34707) >> 8; - b = (298 * y + 516 * u - 70870) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 255); - tmpline[i * 4 + 2] = CLAMP (g, 0, 255); - tmpline[i * 4 + 3] = CLAMP (b, 0, 255); - } -} - -static void -matrix_yuv_bt709_to_rgb (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (298 * y + 459 * v - 63514) >> 8; - g = (298 * y - 55 * u - 136 * v + 19681) >> 8; - b = (298 * y + 541 * u - 73988) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 255); - tmpline[i * 4 + 2] = CLAMP (g, 0, 255); - tmpline[i * 4 + 3] = CLAMP (b, 0, 255); - } -} - -static void -matrix_yuv_bt709_to_yuv_bt470_6 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (256 * y + 25 * u + 49 * v - 9536) >> 8; - g = (253 * u - 28 * v + 3958) >> 8; - b = (-19 * u + 252 * v + 2918) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 255); - tmpline[i * 4 + 2] = CLAMP (g, 0, 255); - tmpline[i * 4 + 3] = CLAMP (b, 0, 255); - } -} - -static void -matrix_yuv_bt470_6_to_yuv_bt709 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint8 *tmpline = convert->tmpline; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (256 * y - 30 * u - 53 * v + 10600) >> 8; - g = (261 * u + 29 * v - 4367) >> 8; - b = (19 * u + 262 * v - 3289) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 255); - tmpline[i * 4 + 2] = CLAMP (g, 0, 255); - tmpline[i * 4 + 3] = CLAMP (b, 0, 255); - } -} - -static void -matrix_identity (ColorspaceConvert * convert) -{ - /* do nothing */ -} - -static void -matrix16_rgb_to_yuv_bt470_6 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - r = tmpline[i * 4 + 1]; - g = tmpline[i * 4 + 2]; - b = tmpline[i * 4 + 3]; - - y = (66 * r + 129 * g + 25 * b + 4096 * 256) >> 8; - u = (-38 * r - 74 * g + 112 * b + 32768 * 256) >> 8; - v = (112 * r - 94 * g - 18 * b + 32768 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (y, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (u, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (v, 0, 65535); - } -} - -static void -matrix16_rgb_to_yuv_bt709 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - r = tmpline[i * 4 + 1]; - g = tmpline[i * 4 + 2]; - b = tmpline[i * 4 + 3]; - - y = (47 * r + 157 * g + 16 * b + 4096 * 256) >> 8; - u = (-26 * r - 87 * g + 112 * b + 32768 * 256) >> 8; - v = (112 * r - 102 * g - 10 * b + 32768 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (y, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (u, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (v, 0, 65535); - } -} - -static void -matrix16_yuv_bt470_6_to_rgb (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (298 * y + 409 * v - 57068 * 256) >> 8; - g = (298 * y - 100 * u - 208 * v + 34707 * 256) >> 8; - b = (298 * y + 516 * u - 70870 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (g, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (b, 0, 65535); - } -} - -static void -matrix16_yuv_bt709_to_rgb (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (298 * y + 459 * v - 63514 * 256) >> 8; - g = (298 * y - 55 * u - 136 * v + 19681 * 256) >> 8; - b = (298 * y + 541 * u - 73988 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (g, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (b, 0, 65535); - } -} - -static void -matrix16_yuv_bt709_to_yuv_bt470_6 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (256 * y + 25 * u + 49 * v - 9536 * 256) >> 8; - g = (253 * u - 28 * v + 3958 * 256) >> 8; - b = (-19 * u + 252 * v + 2918 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (g, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (b, 0, 65535); - } -} - -static void -matrix16_yuv_bt470_6_to_yuv_bt709 (ColorspaceConvert * convert) -{ - int i; - int r, g, b; - int y, u, v; - guint16 *tmpline = convert->tmpline16; - - for (i = 0; i < convert->width; i++) { - y = tmpline[i * 4 + 1]; - u = tmpline[i * 4 + 2]; - v = tmpline[i * 4 + 3]; - - r = (256 * y - 30 * u - 53 * v + 10600 * 256) >> 8; - g = (261 * u + 29 * v - 4367 * 256) >> 8; - b = (19 * u + 262 * v - 3289 * 256) >> 8; - - tmpline[i * 4 + 1] = CLAMP (r, 0, 65535); - tmpline[i * 4 + 2] = CLAMP (g, 0, 65535); - tmpline[i * 4 + 3] = CLAMP (b, 0, 65535); - } -} - -static void -matrix16_identity (ColorspaceConvert * convert) -{ - /* do nothing */ -} - - - -static void -colorspace_convert_lookup_getput (ColorspaceConvert * convert) -{ - int i; - - convert->getline = NULL; - convert->getline16 = NULL; - for (i = 0; i < sizeof (lines) / sizeof (lines[0]); i++) { - if (lines[i].format == convert->from_format) { - convert->getline = lines[i].getline; - convert->getline16 = lines[i].getline16; - break; - } - } - convert->putline = NULL; - convert->putline16 = NULL; - for (i = 0; i < sizeof (lines) / sizeof (lines[0]); i++) { - if (lines[i].format == convert->to_format) { - convert->putline = lines[i].putline; - convert->putline16 = lines[i].putline16; - break; - } - } - GST_DEBUG ("get %p put %p", convert->getline, convert->putline); - - if (convert->getline16 == NULL) { - convert->getline16 = getline16_convert; - } - if (convert->putline16 == NULL) { - convert->putline16 = putline16_convert; - } - - if (convert->from_spec == convert->to_spec) { - convert->matrix = matrix_identity; - convert->matrix16 = matrix16_identity; - } else if (convert->from_spec == COLOR_SPEC_RGB - && convert->to_spec == COLOR_SPEC_YUV_BT470_6) { - convert->matrix = matrix_rgb_to_yuv_bt470_6; - convert->matrix16 = matrix16_rgb_to_yuv_bt470_6; - } else if (convert->from_spec == COLOR_SPEC_RGB - && convert->to_spec == COLOR_SPEC_YUV_BT709) { - convert->matrix = matrix_rgb_to_yuv_bt709; - convert->matrix16 = matrix16_rgb_to_yuv_bt709; - } else if (convert->from_spec == COLOR_SPEC_YUV_BT470_6 - && convert->to_spec == COLOR_SPEC_RGB) { - convert->matrix = matrix_yuv_bt470_6_to_rgb; - convert->matrix16 = matrix16_yuv_bt470_6_to_rgb; - } else if (convert->from_spec == COLOR_SPEC_YUV_BT709 - && convert->to_spec == COLOR_SPEC_RGB) { - convert->matrix = matrix_yuv_bt709_to_rgb; - convert->matrix16 = matrix16_yuv_bt709_to_rgb; - } else if (convert->from_spec == COLOR_SPEC_YUV_BT709 - && convert->to_spec == COLOR_SPEC_YUV_BT470_6) { - convert->matrix = matrix_yuv_bt709_to_yuv_bt470_6; - convert->matrix16 = matrix16_yuv_bt709_to_yuv_bt470_6; - } else if (convert->from_spec == COLOR_SPEC_YUV_BT470_6 - && convert->to_spec == COLOR_SPEC_YUV_BT709) { - convert->matrix = matrix_yuv_bt470_6_to_yuv_bt709; - convert->matrix16 = matrix16_yuv_bt470_6_to_yuv_bt709; - } -} - -static void -colorspace_convert_generic (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int j; - - if (convert->getline == NULL) { - GST_ERROR ("no getline"); - return; - } - - if (convert->putline == NULL) { - GST_ERROR ("no putline"); - return; - } - - if (convert->use_16bit) { - for (j = 0; j < convert->height; j++) { - convert->getline16 (convert, convert->tmpline16, src, j); - convert->matrix16 (convert); - convert->dither16 (convert, j); - convert->putline16 (convert, dest, convert->tmpline16, j); - } - } else { - for (j = 0; j < convert->height; j++) { - convert->getline (convert, convert->tmpline, src, j); - convert->matrix (convert); - convert->putline (convert, dest, convert->tmpline, j); - } - } -} - -static void -colorspace_dither_none (ColorspaceConvert * convert, int j) -{ -} - -static void -colorspace_dither_verterr (ColorspaceConvert * convert, int j) -{ - int i; - guint16 *tmpline = convert->tmpline16; - guint16 *errline = convert->errline; - - for (i = 0; i < 4 * convert->width; i++) { - tmpline[i] += errline[i]; - errline[i] = tmpline[i] & 0xff; - } -} - -static void -colorspace_dither_halftone (ColorspaceConvert * convert, int j) -{ - int i; - guint16 *tmpline = convert->tmpline16; - static guint16 halftone[8][8] = { - {0, 128, 32, 160, 8, 136, 40, 168}, - {192, 64, 224, 96, 200, 72, 232, 104}, - {48, 176, 16, 144, 56, 184, 24, 152}, - {240, 112, 208, 80, 248, 120, 216, 88}, - {12, 240, 44, 172, 4, 132, 36, 164}, - {204, 76, 236, 108, 196, 68, 228, 100}, - {60, 188, 28, 156, 52, 180, 20, 148}, - {252, 142, 220, 92, 244, 116, 212, 84} - }; - - for (i = 0; i < convert->width * 4; i++) { - tmpline[i] += halftone[(i >> 2) & 7][j & 7]; - } -} - -/* Fast paths */ - -static void -convert_I420_YUY2 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i; - - for (i = 0; i < GST_ROUND_DOWN_2 (convert->height); i += 2) { - cogorc_convert_I420_YUY2 (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (dest, 0, i + 1), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 0, i + 1), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2); - } - - /* now handle last line */ - if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_YUY2 (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_I420_UYVY (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i; - - for (i = 0; i < GST_ROUND_DOWN_2 (convert->height); i += 2) { - cogorc_convert_I420_UYVY (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (dest, 0, i + 1), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 0, i + 1), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 2, i >> 1), (convert->width + 1) / 2); - } - - /* now handle last line */ - if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_UYVY (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_I420_AYUV (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i; - - for (i = 0; i < GST_ROUND_DOWN_2 (convert->height); i += 2) { - cogorc_convert_I420_AYUV (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (dest, 0, i + 1), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 0, i + 1), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 2, i >> 1), convert->width); - } - - /* now handle last line */ - if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_I420_Y42B (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_420_422 (FRAME_GET_LINE (dest, 1, 0), - 2 * convert->dest_stride[1], FRAME_GET_LINE (dest, 1, 1), - 2 * convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], (convert->width + 1) / 2, convert->height / 2); - - cogorc_planar_chroma_420_422 (FRAME_GET_LINE (dest, 2, 0), - 2 * convert->dest_stride[2], FRAME_GET_LINE (dest, 2, 1), - 2 * convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height / 2); -} - -static void -convert_I420_Y444 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 1, 0), - 2 * convert->dest_stride[1], FRAME_GET_LINE (dest, 1, 1), - 2 * convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], (convert->width + 1) / 2, convert->height / 2); - - cogorc_planar_chroma_420_444 (FRAME_GET_LINE (dest, 2, 0), - 2 * convert->dest_stride[2], FRAME_GET_LINE (dest, 2, 1), - 2 * convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height / 2); - - /* now handle last line */ - if (convert->height & 1) { - getline_I420 (convert, convert->tmpline, src, convert->height - 1); - putline_Y444 (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_YUY2_I420 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i, h; - - h = convert->height; - if (convert->width & 1) - h--; - - for (i = 0; i < h; i += 2) { - cogorc_convert_YUY2_I420 (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (dest, 0, i + 1), - FRAME_GET_LINE (dest, 1, i >> 1), - FRAME_GET_LINE (dest, 2, i >> 1), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 0, i + 1), (convert->width + 1) / 2); - } - - /* now handle last line */ - if (convert->height & 1) { - getline_YUY2 (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_YUY2_AYUV (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_YUY2_AYUV (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); - - /* now handle last line */ - if (convert->height & 1) { - getline_YUY2 (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_YUY2_Y42B (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_YUY2_Y42B (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, convert->height); -} - -static void -convert_YUY2_Y444 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_YUY2_Y444 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, convert->height); -} - - -static void -convert_UYVY_I420 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i; - - for (i = 0; i < GST_ROUND_DOWN_2 (convert->height); i += 2) { - cogorc_convert_UYVY_I420 (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (dest, 0, i + 1), - FRAME_GET_LINE (dest, 1, i >> 1), - FRAME_GET_LINE (dest, 2, i >> 1), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 0, i + 1), (convert->width + 1) / 2); - } - - /* now handle last line */ - if (convert->height & 1) { - getline_UYVY (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_UYVY_AYUV (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_UYVY_AYUV (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); - - /* now handle last line */ - if (convert->height & 1) { - getline_UYVY (convert, convert->tmpline, src, convert->height - 1); - putline_AYUV (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_UYVY_YUY2 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_UYVY_YUY2 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, convert->height); -} - -static void -convert_UYVY_Y42B (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_UYVY_Y42B (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, convert->height); -} - -static void -convert_UYVY_Y444 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_UYVY_Y444 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, convert->height); -} - -static void -convert_AYUV_I420 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_I420 (FRAME_GET_LINE (dest, 0, 0), - 2 * convert->dest_stride[0], FRAME_GET_LINE (dest, 0, 1), - 2 * convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - 2 * convert->src_stride[0], FRAME_GET_LINE (src, 0, 1), - 2 * convert->src_stride[0], convert->width / 2, convert->height / 2); -} - -static void -convert_AYUV_YUY2 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_YUY2 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width / 2, convert->height); -} - -static void -convert_AYUV_UYVY (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_UYVY (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width / 2, convert->height); -} - -static void -convert_AYUV_Y42B (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_Y42B (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], (convert->width + 1) / 2, - convert->height & 1 ? convert->height - 1 : convert->height); - - /* now handle last line */ - if (convert->height & 1) { - getline_AYUV (convert, convert->tmpline, src, convert->height - 1); - putline_Y42B (convert, dest, convert->tmpline, convert->height - 1); - } - -} - -static void -convert_AYUV_Y444 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_Y444 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width, convert->height); -} - -static void -convert_Y42B_I420 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - 2 * convert->src_stride[1], FRAME_GET_LINE (src, 1, 1), - 2 * convert->src_stride[1], (convert->width + 1) / 2, - convert->height / 2); - - cogorc_planar_chroma_422_420 (FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - 2 * convert->src_stride[2], FRAME_GET_LINE (src, 2, 1), - 2 * convert->src_stride[2], (convert->width + 1) / 2, - convert->height / 2); - - /* now handle last line */ - if (convert->height & 1) { - getline_Y42B (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); - } - -} - -static void -convert_Y42B_Y444 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_422_444 (FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], (convert->width + 1) / 2, convert->height); - - cogorc_planar_chroma_422_444 (FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y42B_YUY2 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y42B_YUY2 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y42B_UYVY (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y42B_UYVY (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y42B_AYUV (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y42B_AYUV (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width) / 2, convert->height); -} - -static void -convert_Y444_I420 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - 2 * convert->src_stride[1], FRAME_GET_LINE (src, 1, 1), - 2 * convert->src_stride[1], (convert->width + 1) / 2, - convert->height / 2); - - cogorc_planar_chroma_444_420 (FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - 2 * convert->src_stride[2], FRAME_GET_LINE (src, 2, 1), - 2 * convert->src_stride[2], (convert->width + 1) / 2, - convert->height / 2); - - /* now handle last line */ - if (convert->height & 1) { - getline_Y444 (convert, convert->tmpline, src, convert->height - 1); - putline_I420 (convert, dest, convert->tmpline, convert->height - 1); - } -} - -static void -convert_Y444_Y42B (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_memcpy_2d (FRAME_GET_LINE (dest, 0, 0), convert->dest_stride[0], - FRAME_GET_LINE (src, 0, 0), convert->src_stride[0], - convert->width, convert->height); - - cogorc_planar_chroma_444_422 (FRAME_GET_LINE (dest, 1, 0), - convert->dest_stride[1], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], (convert->width + 1) / 2, convert->height); - - cogorc_planar_chroma_444_422 (FRAME_GET_LINE (dest, 2, 0), - convert->dest_stride[2], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y444_YUY2 (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y444_YUY2 (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y444_UYVY (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y444_UYVY (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], (convert->width + 1) / 2, convert->height); -} - -static void -convert_Y444_AYUV (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_Y444_AYUV (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], FRAME_GET_LINE (src, 1, 0), - convert->src_stride[1], FRAME_GET_LINE (src, 2, 0), - convert->src_stride[2], convert->width, convert->height); -} - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -static void -convert_AYUV_ARGB (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_ARGB (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width, convert->height); -} - -static void -convert_AYUV_BGRA (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_BGRA (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width, convert->height); -} - -static void -convert_AYUV_ABGR (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_ABGR (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width, convert->height); -} - -static void -convert_AYUV_RGBA (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - cogorc_convert_AYUV_RGBA (FRAME_GET_LINE (dest, 0, 0), - convert->dest_stride[0], FRAME_GET_LINE (src, 0, 0), - convert->src_stride[0], convert->width, convert->height); -} - -static void -convert_I420_BGRA (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src) -{ - int i; - int quality = 0; - - if (quality > 3) { - for (i = 0; i < convert->height; i++) { - if (i & 1) { - cogorc_convert_I420_BGRA_avg (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 1, (i >> 1) + 1), - FRAME_GET_LINE (src, 2, i >> 1), - FRAME_GET_LINE (src, 2, (i >> 1) + 1), convert->width); - } else { - cogorc_convert_I420_BGRA (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 2, i >> 1), convert->width); - } - } - } else { - for (i = 0; i < convert->height; i++) { - cogorc_convert_I420_BGRA (FRAME_GET_LINE (dest, 0, i), - FRAME_GET_LINE (src, 0, i), - FRAME_GET_LINE (src, 1, i >> 1), - FRAME_GET_LINE (src, 2, i >> 1), convert->width); - } - } -} -#endif - - - -/* Fast paths */ - -typedef struct -{ - GstVideoFormat from_format; - ColorSpaceColorSpec from_spec; - GstVideoFormat to_format; - ColorSpaceColorSpec to_spec; - gboolean keeps_color_spec; - void (*convert) (ColorspaceConvert * convert, guint8 * dest, - const guint8 * src); -} ColorspaceTransform; -static const ColorspaceTransform transforms[] = { - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2, - COLOR_SPEC_NONE, TRUE, convert_I420_YUY2}, - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, - COLOR_SPEC_NONE, TRUE, convert_I420_UYVY}, - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV, - COLOR_SPEC_NONE, TRUE, convert_I420_AYUV}, - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B, - COLOR_SPEC_NONE, TRUE, convert_I420_Y42B}, - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444, - COLOR_SPEC_NONE, TRUE, convert_I420_Y444}, - - {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420, - COLOR_SPEC_NONE, TRUE, convert_YUY2_I420}, - {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, TRUE, convert_UYVY_YUY2}, /* alias */ - {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV, - COLOR_SPEC_NONE, TRUE, convert_YUY2_AYUV}, - {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B, - COLOR_SPEC_NONE, TRUE, convert_YUY2_Y42B}, - {GST_VIDEO_FORMAT_YUY2, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444, - COLOR_SPEC_NONE, TRUE, convert_YUY2_Y444}, - - {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420, - COLOR_SPEC_NONE, TRUE, convert_UYVY_I420}, - {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2, - COLOR_SPEC_NONE, TRUE, convert_UYVY_YUY2}, - {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV, - COLOR_SPEC_NONE, TRUE, convert_UYVY_AYUV}, - {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B, - COLOR_SPEC_NONE, TRUE, convert_UYVY_Y42B}, - {GST_VIDEO_FORMAT_UYVY, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444, - COLOR_SPEC_NONE, TRUE, convert_UYVY_Y444}, - - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420, - COLOR_SPEC_NONE, TRUE, convert_AYUV_I420}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2, - COLOR_SPEC_NONE, TRUE, convert_AYUV_YUY2}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, - COLOR_SPEC_NONE, TRUE, convert_AYUV_UYVY}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B, - COLOR_SPEC_NONE, TRUE, convert_AYUV_Y42B}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444, - COLOR_SPEC_NONE, TRUE, convert_AYUV_Y444}, - - {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420, - COLOR_SPEC_NONE, TRUE, convert_Y42B_I420}, - {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2, - COLOR_SPEC_NONE, TRUE, convert_Y42B_YUY2}, - {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, - COLOR_SPEC_NONE, TRUE, convert_Y42B_UYVY}, - {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV, - COLOR_SPEC_NONE, TRUE, convert_Y42B_AYUV}, - {GST_VIDEO_FORMAT_Y42B, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y444, - COLOR_SPEC_NONE, TRUE, convert_Y42B_Y444}, - - {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_I420, - COLOR_SPEC_NONE, TRUE, convert_Y444_I420}, - {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_YUY2, - COLOR_SPEC_NONE, TRUE, convert_Y444_YUY2}, - {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_UYVY, - COLOR_SPEC_NONE, TRUE, convert_Y444_UYVY}, - {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_AYUV, - COLOR_SPEC_NONE, TRUE, convert_Y444_AYUV}, - {GST_VIDEO_FORMAT_Y444, COLOR_SPEC_NONE, GST_VIDEO_FORMAT_Y42B, - COLOR_SPEC_NONE, TRUE, convert_Y444_Y42B}, - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_ARGB, - COLOR_SPEC_RGB, FALSE, convert_AYUV_ARGB}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRA, - COLOR_SPEC_RGB, FALSE, convert_AYUV_BGRA}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_xRGB, COLOR_SPEC_RGB, FALSE, convert_AYUV_ARGB}, /* alias */ - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRx, COLOR_SPEC_RGB, FALSE, convert_AYUV_BGRA}, /* alias */ - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_ABGR, - COLOR_SPEC_RGB, FALSE, convert_AYUV_ABGR}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_RGBA, - COLOR_SPEC_RGB, FALSE, convert_AYUV_RGBA}, - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_xBGR, COLOR_SPEC_RGB, FALSE, convert_AYUV_ABGR}, /* alias */ - {GST_VIDEO_FORMAT_AYUV, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_RGBx, COLOR_SPEC_RGB, FALSE, convert_AYUV_RGBA}, /* alias */ - - {GST_VIDEO_FORMAT_I420, COLOR_SPEC_YUV_BT470_6, GST_VIDEO_FORMAT_BGRA, - COLOR_SPEC_RGB, FALSE, convert_I420_BGRA}, -#endif -}; - -static void -colorspace_convert_lookup_fastpath (ColorspaceConvert * convert) -{ - int i; - - for (i = 0; i < sizeof (transforms) / sizeof (transforms[0]); i++) { - if (transforms[i].to_format == convert->to_format && - transforms[i].from_format == convert->from_format && - (transforms[i].keeps_color_spec || - (transforms[i].from_spec == convert->from_spec && - transforms[i].to_spec == convert->to_spec))) { - convert->convert = transforms[i].convert; - return; - } - } -} diff --git a/gst/colorspace/colorspace.h b/gst/colorspace/colorspace.h deleted file mode 100644 index 7ae889206..000000000 --- a/gst/colorspace/colorspace.h +++ /dev/null @@ -1,98 +0,0 @@ -/* Colorspace conversion functions - * Copyright (C) 2010 David Schleef <ds@schleef.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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __COLORSPACE_H__ -#define __COLORSPACE_H__ - -#include <gst/video/video.h> - -G_BEGIN_DECLS - -typedef struct _ColorspaceConvert ColorspaceConvert; -typedef struct _ColorspaceFrame ColorspaceComponent; - -typedef enum { - COLOR_SPEC_NONE = 0, - COLOR_SPEC_RGB, - COLOR_SPEC_GRAY, - COLOR_SPEC_YUV_BT470_6, - COLOR_SPEC_YUV_BT709, - COLOR_SPEC_YUV_JPEG -} ColorSpaceColorSpec; - -typedef enum { - DITHER_NONE, - DITHER_VERTERR, - DITHER_HALFTONE -} ColorSpaceDitherMethod; - -struct _ColorspaceComponent { - int offset; - int stride; -}; - -struct _ColorspaceConvert { - gint width, height; - gboolean interlaced; - gboolean use_16bit; - gboolean dither; - - GstVideoFormat from_format; - ColorSpaceColorSpec from_spec; - GstVideoFormat to_format; - ColorSpaceColorSpec to_spec; - guint32 *palette; - - guint8 *tmpline; - guint16 *tmpline16; - guint16 *errline; - - int dest_offset[4]; - int dest_stride[4]; - int src_offset[4]; - int src_stride[4]; - - void (*convert) (ColorspaceConvert *convert, guint8 *dest, const guint8 *src); - void (*getline) (ColorspaceConvert *convert, guint8 *dest, const guint8 *src, int j); - void (*putline) (ColorspaceConvert *convert, guint8 *dest, const guint8 *src, int j); - void (*matrix) (ColorspaceConvert *convert); - - void (*getline16) (ColorspaceConvert *convert, guint16 *dest, const guint8 *src, int j); - void (*putline16) (ColorspaceConvert *convert, guint8 *dest, const guint16 *src, int j); - void (*matrix16) (ColorspaceConvert *convert); - void (*dither16) (ColorspaceConvert *convert, int j); -}; - -ColorspaceConvert * colorspace_convert_new (GstVideoFormat to_format, - ColorSpaceColorSpec from_spec, GstVideoFormat from_format, - ColorSpaceColorSpec to_spec, int width, int height); -void colorspace_convert_set_dither (ColorspaceConvert * convert, int type); -void colorspace_convert_set_interlaced (ColorspaceConvert *convert, - gboolean interlaced); -void colorspace_convert_set_palette (ColorspaceConvert *convert, - const guint32 *palette); -const guint32 * colorspace_convert_get_palette (ColorspaceConvert *convert); -void colorspace_convert_free (ColorspaceConvert * convert); -void colorspace_convert_convert (ColorspaceConvert * convert, - guint8 *dest, const guint8 *src); - - -G_END_DECLS - -#endif /* __GST_COLORSPACE_H__ */ diff --git a/gst/colorspace/colorspace.vcproj b/gst/colorspace/colorspace.vcproj deleted file mode 100644 index f6ca6ceb9..000000000 --- a/gst/colorspace/colorspace.vcproj +++ /dev/null @@ -1,154 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="colorspace" - ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D678AB}" - Keyword="Win32Proj"> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="../../win32/Debug" - IntermediateDirectory="../../win32/Debug" - ConfigurationType="2" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;"../../gst-libs";../../../popt/include;../../../libxml2/include/libxml2" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;colorspace_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES" - MinimalRebuild="TRUE" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="TRUE" - DebugInformationFormat="4"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib" - OutputFile="$(OutDir)/gstcolorspace.dll" - LinkIncremental="2" - AdditionalLibraryDirectories="../../../gstreamer/win32/Debug;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib" - ModuleDefinitionFile="" - GenerateDebugInformation="TRUE" - ProgramDatabaseFile="$(OutDir)/colorspace.pdb" - SubSystem="2" - OptimizeReferences="2" - ImportLibrary="$(OutDir)/gstcolorspace.lib" - TargetMachine="1"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCWebDeploymentTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="../../win32/Release" - IntermediateDirectory="../../win32/Release" - ConfigurationType="2" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;"../../gst-libs";../../../popt/include;../../../libxml2/include/libxml2" - PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;colorspace_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES" - RuntimeLibrary="2" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="TRUE" - DebugInformationFormat="3"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib" - OutputFile="$(OutDir)/gstcolorspace.dll" - LinkIncremental="1" - AdditionalLibraryDirectories="../../../gstreamer/win32/Release;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib" - ModuleDefinitionFile="" - GenerateDebugInformation="TRUE" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - ImportLibrary="$(OutDir)/gstcolorspace.lib" - TargetMachine="1"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCWebDeploymentTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> - <File - RelativePath=".\gstcolorspace.c"> - </File> - <File - RelativePath=".\yuv2rgb.c"> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> - <File - RelativePath=".\gstcolorspace.h"> - </File> - <File - RelativePath=".\yuv2rgb.h"> - </File> - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/gst/colorspace/gstcolorspace.c b/gst/colorspace/gstcolorspace.c deleted file mode 100644 index c1d68e72d..000000000 --- a/gst/colorspace/gstcolorspace.c +++ /dev/null @@ -1,597 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * This file: - * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> - * Copyright (C) 2010 David Schleef <ds@schleef.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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:element-colorspace - * - * Convert video frames between a great variety of colorspace formats. - * - * <refsect2> - * <title>Example launch line</title> - * |[ - * gst-launch -v videotestsrc ! video/x-raw-yuv,format=\(fourcc\)YUY2 ! colorspace ! ximagesink - * ]| - * </refsect2> - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "gstcolorspace.h" -#include <gst/video/video.h> - -#include <string.h> - -GST_DEBUG_CATEGORY (colorspace_debug); -#define GST_CAT_DEFAULT colorspace_debug -GST_DEBUG_CATEGORY (colorspace_performance); - -enum -{ - PROP_0, - PROP_DITHER -}; - -#define CSP_VIDEO_CAPS \ - "video/x-raw-yuv, width = "GST_VIDEO_SIZE_RANGE" , " \ - "height="GST_VIDEO_SIZE_RANGE",framerate="GST_VIDEO_FPS_RANGE"," \ - "format= (fourcc) { I420 , NV12 , NV21 , YV12 , YUY2 , Y42B , Y444 , YUV9 , YVU9 , Y41B , Y800 , Y8 , GREY , Y16 , UYVY , YVYU , IYU1 , v308 , AYUV, v210, v216, A420, AY64 } ;" \ - GST_VIDEO_CAPS_RGB";" \ - GST_VIDEO_CAPS_BGR";" \ - GST_VIDEO_CAPS_RGBx";" \ - GST_VIDEO_CAPS_xRGB";" \ - GST_VIDEO_CAPS_BGRx";" \ - GST_VIDEO_CAPS_xBGR";" \ - GST_VIDEO_CAPS_RGBA";" \ - GST_VIDEO_CAPS_ARGB";" \ - GST_VIDEO_CAPS_BGRA";" \ - GST_VIDEO_CAPS_ABGR";" \ - GST_VIDEO_CAPS_RGB_16";" \ - GST_VIDEO_CAPS_BGR_16";" \ - GST_VIDEO_CAPS_RGB_15";" \ - GST_VIDEO_CAPS_BGR_15";" \ - GST_VIDEO_CAPS_RGB8_PALETTED "; " \ - GST_VIDEO_CAPS_GRAY8";" \ - GST_VIDEO_CAPS_GRAY16("BIG_ENDIAN")";" \ - GST_VIDEO_CAPS_GRAY16("LITTLE_ENDIAN")";" \ - GST_VIDEO_CAPS_r210";" \ - GST_VIDEO_CAPS_ARGB_64 - -static GstStaticPadTemplate gst_csp_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (CSP_VIDEO_CAPS) - ); - -static GstStaticPadTemplate gst_csp_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (CSP_VIDEO_CAPS) - ); - -GType gst_csp_get_type (void); - -static void gst_csp_set_property (GObject * object, - guint property_id, const GValue * value, GParamSpec * pspec); -static void gst_csp_get_property (GObject * object, - guint property_id, GValue * value, GParamSpec * pspec); -static void gst_csp_dispose (GObject * object); - -static gboolean gst_csp_set_caps (GstBaseTransform * btrans, - GstCaps * incaps, GstCaps * outcaps); -static gboolean gst_csp_get_unit_size (GstBaseTransform * btrans, - GstCaps * caps, guint * size); -static GstFlowReturn gst_csp_transform (GstBaseTransform * btrans, - GstBuffer * inbuf, GstBuffer * outbuf); - -static GQuark _QRAWRGB; /* "video/x-raw-rgb" */ -static GQuark _QRAWYUV; /* "video/x-raw-yuv" */ -static GQuark _QALPHAMASK; /* "alpha_mask" */ - - -static GType -dither_method_get_type (void) -{ - static GType gtype = 0; - - if (gtype == 0) { - static const GEnumValue values[] = { - {DITHER_NONE, "No dithering (default)", "none"}, - {DITHER_VERTERR, "Vertical error propogation", "verterr"}, - {DITHER_HALFTONE, "Half-tone", "halftone"}, - {0, NULL, NULL} - }; - - gtype = g_enum_register_static ("GstColorspaceDitherMethod", values); - } - return gtype; -} - -/* copies the given caps */ -static GstCaps * -gst_csp_caps_remove_format_info (GstCaps * caps) -{ - GstStructure *yuvst, *rgbst, *grayst; - - /* We know there's only one structure since we're given simple caps */ - caps = gst_caps_copy (caps); - - yuvst = gst_caps_get_structure (caps, 0); - - gst_structure_set_name (yuvst, "video/x-raw-yuv"); - gst_structure_remove_fields (yuvst, "format", "endianness", "depth", - "bpp", "red_mask", "green_mask", "blue_mask", "alpha_mask", - "palette_data", "color-matrix", NULL); - - rgbst = gst_structure_copy (yuvst); - gst_structure_set_name (rgbst, "video/x-raw-rgb"); - gst_structure_remove_fields (rgbst, "color-matrix", "chroma-site", NULL); - - grayst = gst_structure_copy (rgbst); - gst_structure_set_name (grayst, "video/x-raw-gray"); - - gst_caps_append_structure (caps, rgbst); - gst_caps_append_structure (caps, grayst); - - return caps; -} - - -static gboolean -gst_csp_structure_is_alpha (GstStructure * s) -{ - GQuark name; - - name = gst_structure_get_name_id (s); - - if (name == _QRAWRGB) { - return gst_structure_id_has_field (s, _QALPHAMASK); - } else if (name == _QRAWYUV) { - guint32 fourcc; - - if (!gst_structure_get_fourcc (s, "format", &fourcc)) - return FALSE; - - return (fourcc == GST_MAKE_FOURCC ('A', 'Y', 'U', 'V')); - } - - return FALSE; -} - -/* The caps can be transformed into any other caps with format info removed. - * However, we should prefer passthrough, so if passthrough is possible, - * put it first in the list. */ -static GstCaps * -gst_csp_transform_caps (GstBaseTransform * btrans, - GstPadDirection direction, GstCaps * caps) -{ - GstCaps *template; - GstCaps *tmp, *tmp2; - GstCaps *result; - GstStructure *s; - GstCaps *alpha, *non_alpha; - - template = gst_static_pad_template_get_caps (&gst_csp_src_template); - result = gst_caps_copy (caps); - - /* Get all possible caps that we can transform to */ - tmp = gst_csp_caps_remove_format_info (caps); - tmp2 = gst_caps_intersect (tmp, template); - gst_caps_unref (tmp); - tmp = tmp2; - - /* Now move alpha formats to the beginning if caps is an alpha format - * or at the end if caps is no alpha format */ - alpha = gst_caps_new_empty (); - non_alpha = gst_caps_new_empty (); - - while ((s = gst_caps_steal_structure (tmp, 0))) { - if (gst_csp_structure_is_alpha (s)) - gst_caps_append_structure (alpha, s); - else - gst_caps_append_structure (non_alpha, s); - } - - s = gst_caps_get_structure (caps, 0); - gst_caps_unref (tmp); - - if (gst_csp_structure_is_alpha (s)) { - gst_caps_append (alpha, non_alpha); - tmp = alpha; - } else { - gst_caps_append (non_alpha, alpha); - tmp = non_alpha; - } - - gst_caps_append (result, tmp); - - GST_DEBUG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " into %" - GST_PTR_FORMAT, caps, result); - - return result; -} - -static gboolean -gst_csp_set_caps (GstBaseTransform * btrans, GstCaps * incaps, - GstCaps * outcaps) -{ - GstCsp *space; - GstVideoFormat in_format; - GstVideoFormat out_format; - gint in_height, in_width; - gint out_height, out_width; - gint in_fps_n, in_fps_d, in_par_n, in_par_d; - gint out_fps_n, out_fps_d, out_par_n, out_par_d; - gboolean have_in_par, have_out_par; - gboolean have_in_interlaced, have_out_interlaced; - gboolean in_interlaced, out_interlaced; - gboolean ret; - ColorSpaceColorSpec in_spec, out_spec; - - space = GST_CSP (btrans); - - if (space->convert) { - colorspace_convert_free (space->convert); - } - - /* input caps */ - - ret = gst_video_format_parse_caps (incaps, &in_format, &in_width, &in_height); - if (!ret) - goto no_width_height; - - ret = gst_video_parse_caps_framerate (incaps, &in_fps_n, &in_fps_d); - if (!ret) - goto no_framerate; - - have_in_par = gst_video_parse_caps_pixel_aspect_ratio (incaps, - &in_par_n, &in_par_d); - have_in_interlaced = gst_video_format_parse_caps_interlaced (incaps, - &in_interlaced); - - if (gst_video_format_is_rgb (in_format)) { - in_spec = COLOR_SPEC_RGB; - } else if (gst_video_format_is_yuv (in_format)) { - const gchar *matrix = gst_video_parse_caps_color_matrix (incaps); - - if (matrix && g_str_equal (matrix, "hdtv")) - in_spec = COLOR_SPEC_YUV_BT709; - else if (matrix && g_str_equal (matrix, "jpeg")) - in_spec = COLOR_SPEC_YUV_JPEG; - else - in_spec = COLOR_SPEC_YUV_BT470_6; - } else { - in_spec = COLOR_SPEC_GRAY; - } - - /* output caps */ - - ret = - gst_video_format_parse_caps (outcaps, &out_format, &out_width, - &out_height); - if (!ret) - goto no_width_height; - - ret = gst_video_parse_caps_framerate (outcaps, &out_fps_n, &out_fps_d); - if (!ret) - goto no_framerate; - - have_out_par = gst_video_parse_caps_pixel_aspect_ratio (outcaps, - &out_par_n, &out_par_d); - have_out_interlaced = gst_video_format_parse_caps_interlaced (incaps, - &out_interlaced); - - if (gst_video_format_is_rgb (out_format)) { - out_spec = COLOR_SPEC_RGB; - } else if (gst_video_format_is_yuv (out_format)) { - const gchar *matrix = gst_video_parse_caps_color_matrix (outcaps); - - if (matrix && g_str_equal (matrix, "hdtv")) - out_spec = COLOR_SPEC_YUV_BT709; - else if (matrix && g_str_equal (matrix, "jpeg")) - out_spec = COLOR_SPEC_YUV_JPEG; - else - out_spec = COLOR_SPEC_YUV_BT470_6; - } else { - out_spec = COLOR_SPEC_GRAY; - } - - /* these must match */ - if (in_width != out_width || in_height != out_height || - in_fps_n != out_fps_n || in_fps_d != out_fps_d) - goto format_mismatch; - - /* if present, these must match too */ - if (have_in_par && have_out_par && - (in_par_n != out_par_n || in_par_d != out_par_d)) - goto format_mismatch; - - /* if present, these must match too */ - if (have_in_interlaced && have_out_interlaced && - in_interlaced != out_interlaced) - goto format_mismatch; - - space->from_format = in_format; - space->from_spec = in_spec; - space->to_format = out_format; - space->to_spec = out_spec; - space->width = in_width; - space->height = in_height; - space->interlaced = in_interlaced; - - space->convert = colorspace_convert_new (out_format, out_spec, in_format, - in_spec, in_width, in_height); - if (space->convert) { - colorspace_convert_set_interlaced (space->convert, in_interlaced); - } - /* palette, only for from data */ - if (space->from_format == GST_VIDEO_FORMAT_RGB8_PALETTED && - space->to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) { - goto format_mismatch; - } else if (space->from_format == GST_VIDEO_FORMAT_RGB8_PALETTED) { - GstBuffer *palette; - - palette = gst_video_parse_caps_palette (incaps); - - if (!palette || GST_BUFFER_SIZE (palette) < 256 * 4) { - if (palette) - gst_buffer_unref (palette); - goto invalid_palette; - } - colorspace_convert_set_palette (space->convert, - (const guint32 *) GST_BUFFER_DATA (palette)); - gst_buffer_unref (palette); - } else if (space->to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) { - const guint32 *palette; - GstBuffer *p_buf; - - palette = colorspace_convert_get_palette (space->convert); - p_buf = gst_buffer_new_and_alloc (256 * 4); - memcpy (GST_BUFFER_DATA (p_buf), palette, 256 * 4); - gst_caps_set_simple (outcaps, "palette_data", GST_TYPE_BUFFER, p_buf, NULL); - gst_buffer_unref (p_buf); - } - - GST_DEBUG ("reconfigured %d %d", space->from_format, space->to_format); - - return TRUE; - - /* ERRORS */ -no_width_height: - { - GST_ERROR_OBJECT (space, "did not specify width or height"); - space->from_format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; - } -no_framerate: - { - GST_ERROR_OBJECT (space, "did not specify framerate"); - space->from_format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; - } -format_mismatch: - { - GST_ERROR_OBJECT (space, "input and output formats do not match"); - space->from_format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; - } -invalid_palette: - { - GST_ERROR_OBJECT (space, "invalid palette"); - space->from_format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_format = GST_VIDEO_FORMAT_UNKNOWN; - return FALSE; - } -} - -GST_BOILERPLATE (GstCsp, gst_csp, GstVideoFilter, GST_TYPE_VIDEO_FILTER); - -static void -gst_csp_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, - &gst_csp_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_csp_sink_template); - - gst_element_class_set_details_simple (element_class, - " Colorspace converter", "Filter/Converter/Video", - "Converts video from one colorspace to another", - "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>"); - - _QRAWRGB = g_quark_from_string ("video/x-raw-rgb"); - _QRAWYUV = g_quark_from_string ("video/x-raw-yuv"); - _QALPHAMASK = g_quark_from_string ("alpha_mask"); -} - -void -gst_csp_dispose (GObject * object) -{ - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_csp_finalize (GObject * obj) -{ - GstCsp *space = GST_CSP (obj); - - if (space->convert) { - colorspace_convert_free (space->convert); - } - - G_OBJECT_CLASS (parent_class)->finalize (obj); - -} - -static void -gst_csp_class_init (GstCspClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - GstBaseTransformClass *gstbasetransform_class = - (GstBaseTransformClass *) klass; - - gobject_class->set_property = gst_csp_set_property; - gobject_class->get_property = gst_csp_get_property; - gobject_class->dispose = gst_csp_dispose; - gobject_class->finalize = gst_csp_finalize; - - gstbasetransform_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_csp_transform_caps); - gstbasetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_csp_set_caps); - gstbasetransform_class->get_unit_size = - GST_DEBUG_FUNCPTR (gst_csp_get_unit_size); - gstbasetransform_class->transform = GST_DEBUG_FUNCPTR (gst_csp_transform); - - gstbasetransform_class->passthrough_on_same_caps = TRUE; - - g_object_class_install_property (gobject_class, PROP_DITHER, - g_param_spec_enum ("dither", "Dither", "Apply dithering while converting", - dither_method_get_type (), DITHER_NONE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - -} - -static void -gst_csp_init (GstCsp * space, GstCspClass * klass) -{ - space->from_format = GST_VIDEO_FORMAT_UNKNOWN; - space->to_format = GST_VIDEO_FORMAT_UNKNOWN; -} - -void -gst_csp_set_property (GObject * object, guint property_id, - const GValue * value, GParamSpec * pspec) -{ - GstCsp *csp; - - g_return_if_fail (GST_IS_CSP (object)); - csp = GST_CSP (object); - - switch (property_id) { - case PROP_DITHER: - csp->dither = g_value_get_enum (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -void -gst_csp_get_property (GObject * object, guint property_id, - GValue * value, GParamSpec * pspec) -{ - GstCsp *csp; - - g_return_if_fail (GST_IS_CSP (object)); - csp = GST_CSP (object); - - switch (property_id) { - case PROP_DITHER: - g_value_set_enum (value, csp->dither); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static gboolean -gst_csp_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) -{ - gboolean ret = TRUE; - GstVideoFormat format; - gint width, height; - - g_assert (size); - - ret = gst_video_format_parse_caps (caps, &format, &width, &height); - if (ret) { - *size = gst_video_format_get_size (format, width, height); - } - - return ret; -} - -static GstFlowReturn -gst_csp_transform (GstBaseTransform * btrans, GstBuffer * inbuf, - GstBuffer * outbuf) -{ - GstCsp *space; - - space = GST_CSP (btrans); - - GST_DEBUG ("from %d -> to %d", space->from_format, space->to_format); - - if (G_UNLIKELY (space->from_format == GST_VIDEO_FORMAT_UNKNOWN || - space->to_format == GST_VIDEO_FORMAT_UNKNOWN)) - goto unknown_format; - - colorspace_convert_set_dither (space->convert, space->dither); - - colorspace_convert_convert (space->convert, GST_BUFFER_DATA (outbuf), - GST_BUFFER_DATA (inbuf)); - - /* baseclass copies timestamps */ - GST_DEBUG ("from %d -> to %d done", space->from_format, space->to_format); - - return GST_FLOW_OK; - - /* ERRORS */ -unknown_format: - { - GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), - ("attempting to convert colorspaces between unknown formats")); - return GST_FLOW_NOT_NEGOTIATED; - } -#if 0 -not_supported: - { - GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), - ("cannot convert between formats")); - return GST_FLOW_NOT_SUPPORTED; - } -#endif -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (colorspace_debug, "colorspace", 0, - "Colorspace Converter"); - GST_DEBUG_CATEGORY_GET (colorspace_performance, "GST_PERFORMANCE"); - - return gst_element_register (plugin, "colorspace", - GST_RANK_NONE, GST_TYPE_CSP); -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "colorspace", "Colorspace conversion", plugin_init, VERSION, "LGPL", "", "") diff --git a/gst/colorspace/gstcolorspace.h b/gst/colorspace/gstcolorspace.h deleted file mode 100644 index 71245b831..000000000 --- a/gst/colorspace/gstcolorspace.h +++ /dev/null @@ -1,69 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * This file: - * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_COLORSPACE_H__ -#define __GST_COLORSPACE_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/video/gstvideofilter.h> -#include "colorspace.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CSP (gst_csp_get_type()) -#define GST_CSP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CSP,GstCsp)) -#define GST_CSP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CSP,GstCspClass)) -#define GST_IS_CSP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CSP)) -#define GST_IS_CSP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CSP)) - -typedef struct _GstCsp GstCsp; -typedef struct _GstCspClass GstCspClass; - -/** - * GstCsp: - * - * Opaque object data structure. - */ -struct _GstCsp { - GstVideoFilter element; - - gint width, height; - gboolean interlaced; - gfloat fps; - - GstVideoFormat from_format; - ColorSpaceColorSpec from_spec; - GstVideoFormat to_format; - ColorSpaceColorSpec to_spec; - - ColorspaceConvert *convert; - gboolean dither; -}; - -struct _GstCspClass -{ - GstVideoFilterClass parent_class; -}; - -G_END_DECLS - -#endif /* __GST_COLORSPACE_H__ */ diff --git a/gst/colorspace/gstcolorspaceorc-dist.c b/gst/colorspace/gstcolorspaceorc-dist.c deleted file mode 100644 index 06d75b242..000000000 --- a/gst/colorspace/gstcolorspaceorc-dist.c +++ /dev/null @@ -1,19395 +0,0 @@ - -/* autogenerated from gstcolorspaceorc.orc */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include <glib.h> - -#ifndef _ORC_INTEGER_TYPEDEFS_ -#define _ORC_INTEGER_TYPEDEFS_ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include <stdint.h> -typedef int8_t orc_int8; -typedef int16_t orc_int16; -typedef int32_t orc_int32; -typedef int64_t orc_int64; -typedef uint8_t orc_uint8; -typedef uint16_t orc_uint16; -typedef uint32_t orc_uint32; -typedef uint64_t orc_uint64; -#define ORC_UINT64_C(x) UINT64_C(x) -#elif defined(_MSC_VER) -typedef signed __int8 orc_int8; -typedef signed __int16 orc_int16; -typedef signed __int32 orc_int32; -typedef signed __int64 orc_int64; -typedef unsigned __int8 orc_uint8; -typedef unsigned __int16 orc_uint16; -typedef unsigned __int32 orc_uint32; -typedef unsigned __int64 orc_uint64; -#define ORC_UINT64_C(x) (x##Ui64) -#define inline __inline -#else -#include <limits.h> -typedef signed char orc_int8; -typedef short orc_int16; -typedef int orc_int32; -typedef unsigned char orc_uint8; -typedef unsigned short orc_uint16; -typedef unsigned int orc_uint32; -#if INT_MAX == LONG_MAX -typedef long long orc_int64; -typedef unsigned long long orc_uint64; -#define ORC_UINT64_C(x) (x##ULL) -#else -typedef long orc_int64; -typedef unsigned long orc_uint64; -#define ORC_UINT64_C(x) (x##UL) -#endif -#endif -typedef union -{ - orc_int16 i; - orc_int8 x2[2]; -} orc_union16; -typedef union -{ - orc_int32 i; - float f; - orc_int16 x2[2]; - orc_int8 x4[4]; -} orc_union32; -typedef union -{ - orc_int64 i; - double f; - orc_int32 x2[2]; - float x2f[2]; - orc_int16 x4[4]; -} orc_union64; -#endif -#ifndef ORC_RESTRICT -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define ORC_RESTRICT restrict -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define ORC_RESTRICT __restrict__ -#else -#define ORC_RESTRICT -#endif -#endif - -#ifndef DISABLE_ORC -#include <orc/orc.h> -#endif -void cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n); -void orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, - int p2, int n); -void orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, - int p2, int n); -void orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int p4, int n); -void orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int n); -void orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, - int n); -void orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, - int n); -void orc_pack_123x (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n); -void orc_pack_x123 (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n); -void cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, - int p2, int n); -void cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, - guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, - const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, - guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, - const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, - guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, - const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, - guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, - guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n); -void cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m); -void cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m); -void cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, - guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, - guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n); -void cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_convert_I420_BGRA_avg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, - const guint8 * ORC_RESTRICT s5, int n); -void cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, int n); - - -/* begin Orc C target preamble */ -#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) -#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) -#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) -#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) -#define ORC_SB_MAX 127 -#define ORC_SB_MIN (-1-ORC_SB_MAX) -#define ORC_UB_MAX 255 -#define ORC_UB_MIN 0 -#define ORC_SW_MAX 32767 -#define ORC_SW_MIN (-1-ORC_SW_MAX) -#define ORC_UW_MAX 65535 -#define ORC_UW_MIN 0 -#define ORC_SL_MAX 2147483647 -#define ORC_SL_MIN (-1-ORC_SL_MAX) -#define ORC_UL_MAX 4294967295U -#define ORC_UL_MIN 0 -#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) -#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) -#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) -#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) -#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) -#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) -#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) -#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) -#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) -#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) -#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) -#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) -#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) -#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) -#ifndef ORC_RESTRICT -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define ORC_RESTRICT restrict -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define ORC_RESTRICT __restrict__ -#else -#define ORC_RESTRICT -#endif -#endif -/* end Orc C target preamble */ - - - -/* cogorc_memcpy_2d */ -#ifdef DISABLE_ORC -void -cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var32; - orc_int8 var33; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: copyb */ - var33 = var32; - /* 2: storeb */ - ptr0[i] = var33; - } - } - -} - -#else -static void -_backup_cogorc_memcpy_2d (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var32; - orc_int8 var33; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: copyb */ - var33 = var32; - /* 2: storeb */ - ptr0[i] = var33; - } - } - -} - -void -cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_memcpy_2d"); - orc_program_set_backup_function (p, _backup_cogorc_memcpy_2d); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - - orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_horiz_cosite_1tap */ -#ifdef DISABLE_ORC -void -cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union16 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select0wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[0]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -#else -static void -_backup_cogorc_downsample_horiz_cosite_1tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select0wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[0]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -void -cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_horiz_cosite_1tap"); - orc_program_set_backup_function (p, - _backup_cogorc_downsample_horiz_cosite_1tap); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_D1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_horiz_cosite_3tap */ -#ifdef DISABLE_ORC -void -cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_int8 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - - /* 9: loadpw */ - var40.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - /* 13: loadpw */ - var41.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var38 = ptr4[i]; - /* 1: copyw */ - var43.i = var38.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var43.i; - var44 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var43.i; - var45 = _src.x2[1]; - } - /* 4: loadw */ - var39 = ptr5[i]; - /* 5: select0wb */ - { - orc_union16 _src; - _src.i = var39.i; - var46 = _src.x2[0]; - } - /* 6: convubw */ - var47.i = (orc_uint8) var44; - /* 7: convubw */ - var48.i = (orc_uint8) var45; - /* 8: convubw */ - var49.i = (orc_uint8) var46; - /* 10: mullw */ - var50.i = (var48.i * var40.i) & 0xffff; - /* 11: addw */ - var51.i = var47.i + var49.i; - /* 12: addw */ - var52.i = var51.i + var50.i; - /* 14: addw */ - var53.i = var52.i + var41.i; - /* 15: shrsw */ - var54.i = var53.i >> 2; - /* 16: convsuswb */ - var42 = ORC_CLAMP_UB (var54.i); - /* 17: storeb */ - ptr0[i] = var42; - } - -} - -#else -static void -_backup_cogorc_downsample_horiz_cosite_3tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_int8 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - - /* 9: loadpw */ - var40.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - /* 13: loadpw */ - var41.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var38 = ptr4[i]; - /* 1: copyw */ - var43.i = var38.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var43.i; - var44 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var43.i; - var45 = _src.x2[1]; - } - /* 4: loadw */ - var39 = ptr5[i]; - /* 5: select0wb */ - { - orc_union16 _src; - _src.i = var39.i; - var46 = _src.x2[0]; - } - /* 6: convubw */ - var47.i = (orc_uint8) var44; - /* 7: convubw */ - var48.i = (orc_uint8) var45; - /* 8: convubw */ - var49.i = (orc_uint8) var46; - /* 10: mullw */ - var50.i = (var48.i * var40.i) & 0xffff; - /* 11: addw */ - var51.i = var47.i + var49.i; - /* 12: addw */ - var52.i = var51.i + var50.i; - /* 14: addw */ - var53.i = var52.i + var41.i; - /* 15: shrsw */ - var54.i = var53.i >> 2; - /* 16: convsuswb */ - var42 = ORC_CLAMP_UB (var54.i); - /* 17: storeb */ - ptr0[i] = var42; - } - -} - -void -cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_horiz_cosite_3tap"); - orc_program_set_backup_function (p, - _backup_cogorc_downsample_horiz_cosite_3tap); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_constant (p, 4, 0x00000002, "c1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - - orc_program_append_2 (p, "copyw", 0, ORC_VAR_T4, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T5, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_420_jpeg */ -#ifdef DISABLE_ORC -void -cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_int8 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var40.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var40.i; - var41 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var40.i; - var42 = _src.x2[1]; - } - /* 4: avgub */ - var43 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1; - /* 5: loadw */ - var38 = ptr5[i]; - /* 6: copyw */ - var44.i = var38.i; - /* 7: select0wb */ - { - orc_union16 _src; - _src.i = var44.i; - var45 = _src.x2[0]; - } - /* 8: select1wb */ - { - orc_union16 _src; - _src.i = var44.i; - var46 = _src.x2[1]; - } - /* 9: avgub */ - var47 = ((orc_uint8) var45 + (orc_uint8) var46 + 1) >> 1; - /* 10: avgub */ - var39 = ((orc_uint8) var43 + (orc_uint8) var47 + 1) >> 1; - /* 11: storeb */ - ptr0[i] = var39; - } - -} - -#else -static void -_backup_cogorc_downsample_420_jpeg (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_int8 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var40.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var40.i; - var41 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var40.i; - var42 = _src.x2[1]; - } - /* 4: avgub */ - var43 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1; - /* 5: loadw */ - var38 = ptr5[i]; - /* 6: copyw */ - var44.i = var38.i; - /* 7: select0wb */ - { - orc_union16 _src; - _src.i = var44.i; - var45 = _src.x2[0]; - } - /* 8: select1wb */ - { - orc_union16 _src; - _src.i = var44.i; - var46 = _src.x2[1]; - } - /* 9: avgub */ - var47 = ((orc_uint8) var45 + (orc_uint8) var46 + 1) >> 1; - /* 10: avgub */ - var39 = ((orc_uint8) var43 + (orc_uint8) var47 + 1) >> 1; - /* 11: storeb */ - ptr0[i] = var39; - } - -} - -void -cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_420_jpeg"); - orc_program_set_backup_function (p, _backup_cogorc_downsample_420_jpeg); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - - orc_program_append_2 (p, "copyw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T3, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "copyw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T4, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_vert_halfsite_2tap */ -#ifdef DISABLE_ORC -void -cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_cogorc_downsample_vert_halfsite_2tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_vert_halfsite_2tap"); - orc_program_set_backup_function (p, - _backup_cogorc_downsample_vert_halfsite_2tap); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_vert_cosite_3tap */ -#ifdef DISABLE_ORC -void -cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 6: loadpw */ - var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - /* 10: loadpw */ - var39.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var41.i = (orc_uint8) var35; - /* 2: loadb */ - var36 = ptr5[i]; - /* 3: convubw */ - var42.i = (orc_uint8) var36; - /* 4: loadb */ - var37 = ptr6[i]; - /* 5: convubw */ - var43.i = (orc_uint8) var37; - /* 7: mullw */ - var44.i = (var42.i * var38.i) & 0xffff; - /* 8: addw */ - var45.i = var41.i + var43.i; - /* 9: addw */ - var46.i = var45.i + var44.i; - /* 11: addw */ - var47.i = var46.i + var39.i; - /* 12: shrsw */ - var48.i = var47.i >> 2; - /* 13: convsuswb */ - var40 = ORC_CLAMP_UB (var48.i); - /* 14: storeb */ - ptr0[i] = var40; - } - -} - -#else -static void -_backup_cogorc_downsample_vert_cosite_3tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 6: loadpw */ - var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - /* 10: loadpw */ - var39.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var41.i = (orc_uint8) var35; - /* 2: loadb */ - var36 = ptr5[i]; - /* 3: convubw */ - var42.i = (orc_uint8) var36; - /* 4: loadb */ - var37 = ptr6[i]; - /* 5: convubw */ - var43.i = (orc_uint8) var37; - /* 7: mullw */ - var44.i = (var42.i * var38.i) & 0xffff; - /* 8: addw */ - var45.i = var41.i + var43.i; - /* 9: addw */ - var46.i = var45.i + var44.i; - /* 11: addw */ - var47.i = var46.i + var39.i; - /* 12: shrsw */ - var48.i = var47.i >> 2; - /* 13: convsuswb */ - var40 = ORC_CLAMP_UB (var48.i); - /* 14: storeb */ - ptr0[i] = var40; - } - -} - -void -cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_vert_cosite_3tap"); - orc_program_set_backup_function (p, - _backup_cogorc_downsample_vert_cosite_3tap); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 4, 0x00000002, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_downsample_vert_halfsite_4tap */ -#ifdef DISABLE_ORC -void -cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_int8 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - - /* 9: loadpw */ - var40.i = (int) 0x0000001a; /* 26 or 1.28457e-322f */ - /* 12: loadpw */ - var41.i = (int) 0x00000006; /* 6 or 2.96439e-323f */ - /* 15: loadpw */ - var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 2: loadb */ - var37 = ptr5[i]; - /* 3: convubw */ - var45.i = (orc_uint8) var37; - /* 4: loadb */ - var38 = ptr6[i]; - /* 5: convubw */ - var46.i = (orc_uint8) var38; - /* 6: loadb */ - var39 = ptr7[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 8: addw */ - var48.i = var45.i + var46.i; - /* 10: mullw */ - var49.i = (var48.i * var40.i) & 0xffff; - /* 11: addw */ - var50.i = var44.i + var47.i; - /* 13: mullw */ - var51.i = (var50.i * var41.i) & 0xffff; - /* 14: addw */ - var52.i = var49.i + var51.i; - /* 16: addw */ - var53.i = var52.i + var42.i; - /* 17: shrsw */ - var54.i = var53.i >> 6; - /* 18: convsuswb */ - var43 = ORC_CLAMP_UB (var54.i); - /* 19: storeb */ - ptr0[i] = var43; - } - -} - -#else -static void -_backup_cogorc_downsample_vert_halfsite_4tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_int8 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - - /* 9: loadpw */ - var40.i = (int) 0x0000001a; /* 26 or 1.28457e-322f */ - /* 12: loadpw */ - var41.i = (int) 0x00000006; /* 6 or 2.96439e-323f */ - /* 15: loadpw */ - var42.i = (int) 0x00000020; /* 32 or 1.58101e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 2: loadb */ - var37 = ptr5[i]; - /* 3: convubw */ - var45.i = (orc_uint8) var37; - /* 4: loadb */ - var38 = ptr6[i]; - /* 5: convubw */ - var46.i = (orc_uint8) var38; - /* 6: loadb */ - var39 = ptr7[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 8: addw */ - var48.i = var45.i + var46.i; - /* 10: mullw */ - var49.i = (var48.i * var40.i) & 0xffff; - /* 11: addw */ - var50.i = var44.i + var47.i; - /* 13: mullw */ - var51.i = (var50.i * var41.i) & 0xffff; - /* 14: addw */ - var52.i = var49.i + var51.i; - /* 16: addw */ - var53.i = var52.i + var42.i; - /* 17: shrsw */ - var54.i = var53.i >> 6; - /* 18: convsuswb */ - var43 = ORC_CLAMP_UB (var54.i); - /* 19: storeb */ - ptr0[i] = var43; - } - -} - -void -cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_downsample_vert_halfsite_4tap"); - orc_program_set_backup_function (p, - _backup_cogorc_downsample_vert_halfsite_4tap); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_constant (p, 4, 0x0000001a, "c1"); - orc_program_add_constant (p, 4, 0x00000006, "c2"); - orc_program_add_constant (p, 4, 0x00000020, "c3"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T4, ORC_VAR_S4, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_upsample_horiz_cosite_1tap */ -#ifdef DISABLE_ORC -void -cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - orc_int8 var35; - - ptr0 = (orc_union16 *) d1; - ptr4 = (orc_int8 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: copyb */ - var35 = var33; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35; - _dest.x2[1] = var35; - var34.i = _dest.i; - } - /* 3: storew */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_cogorc_upsample_horiz_cosite_1tap (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - orc_int8 var35; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: copyb */ - var35 = var33; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35; - _dest.x2[1] = var35; - var34.i = _dest.i; - } - /* 3: storew */ - ptr0[i] = var34; - } - -} - -void -cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_upsample_horiz_cosite_1tap"); - orc_program_set_backup_function (p, - _backup_cogorc_upsample_horiz_cosite_1tap); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_temporary (p, 1, "t1"); - - orc_program_append_2 (p, "copyb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_upsample_horiz_cosite */ -#ifdef DISABLE_ORC -void -cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_int8 var35; - orc_union16 var36; - orc_int8 var37; - orc_int8 var38; - - ptr0 = (orc_union16 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: copyb */ - var37 = var34; - /* 2: loadb */ - var35 = ptr5[i]; - /* 3: avgub */ - var38 = ((orc_uint8) var37 + (orc_uint8) var35 + 1) >> 1; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37; - _dest.x2[1] = var38; - var36.i = _dest.i; - } - /* 5: storew */ - ptr0[i] = var36; - } - -} - -#else -static void -_backup_cogorc_upsample_horiz_cosite (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_int8 var35; - orc_union16 var36; - orc_int8 var37; - orc_int8 var38; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: copyb */ - var37 = var34; - /* 2: loadb */ - var35 = ptr5[i]; - /* 3: avgub */ - var38 = ((orc_uint8) var37 + (orc_uint8) var35 + 1) >> 1; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37; - _dest.x2[1] = var38; - var36.i = _dest.i; - } - /* 5: storew */ - ptr0[i] = var36; - } - -} - -void -cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_upsample_horiz_cosite"); - orc_program_set_backup_function (p, _backup_cogorc_upsample_horiz_cosite); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - - orc_program_append_2 (p, "copyb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_upsample_vert_avgub */ -#ifdef DISABLE_ORC -void -cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_cogorc_upsample_vert_avgub (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_upsample_vert_avgub"); - orc_program_set_backup_function (p, _backup_cogorc_upsample_vert_avgub); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_yuyv_y */ -#ifdef DISABLE_ORC -void -orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union16 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select0wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[0]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -#else -static void -_backup_orc_unpack_yuyv_y (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select0wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[0]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -void -orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_yuyv_y"); - orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_y); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_D1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_yuyv_u */ -#ifdef DISABLE_ORC -void -orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_orc_unpack_yuyv_u (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_yuyv_u"); - orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_u); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_yuyv_v */ -#ifdef DISABLE_ORC -void -orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select1lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[1]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_orc_unpack_yuyv_v (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select1lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[1]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_yuyv_v"); - orc_program_set_backup_function (p, _backup_orc_unpack_yuyv_v); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "select1lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_pack_yuyv */ -#ifdef DISABLE_ORC -void -orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_int8 var38; - orc_int8 var39; - orc_union32 var40; - orc_union16 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var41.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var41.i; - var42 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var41.i; - var43 = _src.x2[1]; - } - /* 4: loadb */ - var38 = ptr5[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var42; - _dest.x2[1] = var38; - var44.i = _dest.i; - } - /* 6: loadb */ - var39 = ptr6[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43; - _dest.x2[1] = var39; - var45.i = _dest.i; - } - /* 8: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.i; - _dest.x2[1] = var45.i; - var40.i = _dest.i; - } - /* 9: storel */ - ptr0[i] = var40; - } - -} - -#else -static void -_backup_orc_pack_yuyv (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_int8 var38; - orc_int8 var39; - orc_union32 var40; - orc_union16 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var41.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var41.i; - var42 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var41.i; - var43 = _src.x2[1]; - } - /* 4: loadb */ - var38 = ptr5[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var42; - _dest.x2[1] = var38; - var44.i = _dest.i; - } - /* 6: loadb */ - var39 = ptr6[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43; - _dest.x2[1] = var39; - var45.i = _dest.i; - } - /* 8: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.i; - _dest.x2[1] = var45.i; - var40.i = _dest.i; - } - /* 9: storel */ - ptr0[i] = var40; - } - -} - -void -orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_pack_yuyv"); - orc_program_set_backup_function (p, _backup_orc_pack_yuyv); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 2, "t5"); - - orc_program_append_2 (p, "copyw", 0, ORC_VAR_T5, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T5, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T5, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_uyvy_y */ -#ifdef DISABLE_ORC -void -orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union16 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select1wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[1]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -#else -static void -_backup_orc_unpack_uyvy_y (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var32; - orc_int8 var33; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var32 = ptr4[i]; - /* 1: select1wb */ - { - orc_union16 _src; - _src.i = var32.i; - var33 = _src.x2[1]; - } - /* 2: storeb */ - ptr0[i] = var33; - } - -} - -void -orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_uyvy_y"); - orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_y); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_uyvy_u */ -#ifdef DISABLE_ORC -void -orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[0]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_orc_unpack_uyvy_u (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[0]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_uyvy_u"); - orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_u); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_unpack_uyvy_v */ -#ifdef DISABLE_ORC -void -orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select1lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[1]; - } - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[0]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_orc_unpack_uyvy_v (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select1lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[1]; - } - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[0]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_unpack_uyvy_v"); - orc_program_set_backup_function (p, _backup_orc_unpack_uyvy_v); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "select1lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_pack_uyvy */ -#ifdef DISABLE_ORC -void -orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_int8 var38; - orc_int8 var39; - orc_union32 var40; - orc_union16 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var41.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var41.i; - var42 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var41.i; - var43 = _src.x2[1]; - } - /* 4: loadb */ - var38 = ptr5[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38; - _dest.x2[1] = var42; - var44.i = _dest.i; - } - /* 6: loadb */ - var39 = ptr6[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var43; - var45.i = _dest.i; - } - /* 8: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.i; - _dest.x2[1] = var45.i; - var40.i = _dest.i; - } - /* 9: storel */ - ptr0[i] = var40; - } - -} - -#else -static void -_backup_orc_pack_uyvy (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_int8 var38; - orc_int8 var39; - orc_union32 var40; - orc_union16 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var37 = ptr4[i]; - /* 1: copyw */ - var41.i = var37.i; - /* 2: select0wb */ - { - orc_union16 _src; - _src.i = var41.i; - var42 = _src.x2[0]; - } - /* 3: select1wb */ - { - orc_union16 _src; - _src.i = var41.i; - var43 = _src.x2[1]; - } - /* 4: loadb */ - var38 = ptr5[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38; - _dest.x2[1] = var42; - var44.i = _dest.i; - } - /* 6: loadb */ - var39 = ptr6[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var43; - var45.i = _dest.i; - } - /* 8: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.i; - _dest.x2[1] = var45.i; - var40.i = _dest.i; - } - /* 9: storel */ - ptr0[i] = var40; - } - -} - -void -orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_pack_uyvy"); - orc_program_set_backup_function (p, _backup_orc_pack_uyvy); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 2, "t5"); - - orc_program_append_2 (p, "copyw", 0, ORC_VAR_T5, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T1, ORC_VAR_T5, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T5, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T3, ORC_VAR_S2, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T4, ORC_VAR_S3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix2_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - /* 2: loadpw */ - var35.i = p1; - /* 6: loadpw */ - var37.i = p2; - /* 9: loadpw */ - var38.i = p3; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var40.i = (orc_uint8) var34; - /* 3: mullw */ - var41.i = (var40.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var42.i = (orc_uint8) var36; - /* 7: mullw */ - var43.i = (var42.i * var37.i) & 0xffff; - /* 8: addw */ - var44.i = var41.i + var43.i; - /* 10: addw */ - var45.i = var44.i + var38.i; - /* 11: shrsw */ - var46.i = var45.i >> 6; - /* 12: convsuswb */ - var39 = ORC_CLAMP_UB (var46.i); - /* 13: storeb */ - ptr0[i] = var39; - } - -} - -#else -static void -_backup_orc_matrix2_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - /* 2: loadpw */ - var35.i = ex->params[24]; - /* 6: loadpw */ - var37.i = ex->params[25]; - /* 9: loadpw */ - var38.i = ex->params[26]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var40.i = (orc_uint8) var34; - /* 3: mullw */ - var41.i = (var40.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var42.i = (orc_uint8) var36; - /* 7: mullw */ - var43.i = (var42.i * var37.i) & 0xffff; - /* 8: addw */ - var44.i = var41.i + var43.i; - /* 10: addw */ - var45.i = var44.i + var38.i; - /* 11: shrsw */ - var46.i = var45.i >> 6; - /* 12: convsuswb */ - var39 = ORC_CLAMP_UB (var46.i); - /* 13: storeb */ - ptr0[i] = var39; - } - -} - -void -orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix2_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix2_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_constant (p, 4, 0x00000006, "c1"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_parameter (p, 2, "p3"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - ex->params[ORC_VAR_P3] = p3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix2_11_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - /* 2: loadpw */ - var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var38.i = p1; - /* 8: loadpw */ - var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var41.i = p2; - /* 13: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 3: subw */ - var45.i = var44.i - var37.i; - /* 5: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 6: loadb */ - var39 = ptr5[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 9: subw */ - var48.i = var47.i - var40.i; - /* 11: mullw */ - var49.i = (var48.i * var41.i) & 0xffff; - /* 12: addw */ - var50.i = var46.i + var49.i; - /* 14: addw */ - var51.i = var50.i + var42.i; - /* 15: shrsw */ - var52.i = var51.i >> 8; - /* 16: addw */ - var53.i = var52.i + var45.i; - /* 17: addw */ - var54.i = var53.i + var48.i; - /* 18: convsuswb */ - var43 = ORC_CLAMP_UB (var54.i); - /* 19: storeb */ - ptr0[i] = var43; - } - -} - -#else -static void -_backup_orc_matrix2_11_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - /* 2: loadpw */ - var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var38.i = ex->params[24]; - /* 8: loadpw */ - var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var41.i = ex->params[25]; - /* 13: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 3: subw */ - var45.i = var44.i - var37.i; - /* 5: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 6: loadb */ - var39 = ptr5[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 9: subw */ - var48.i = var47.i - var40.i; - /* 11: mullw */ - var49.i = (var48.i * var41.i) & 0xffff; - /* 12: addw */ - var50.i = var46.i + var49.i; - /* 14: addw */ - var51.i = var50.i + var42.i; - /* 15: shrsw */ - var52.i = var51.i >> 8; - /* 16: addw */ - var53.i = var52.i + var45.i; - /* 17: addw */ - var54.i = var53.i + var48.i; - /* 18: convsuswb */ - var43 = ORC_CLAMP_UB (var54.i); - /* 19: storeb */ - ptr0[i] = var43; - } - -} - -void -orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix2_11_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix2_11_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_constant (p, 4, 0x00000010, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x00000008, "c3"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix2_12_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union16 var55; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - /* 2: loadpw */ - var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var38.i = p1; - /* 8: loadpw */ - var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var41.i = p2; - /* 13: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 3: subw */ - var45.i = var44.i - var37.i; - /* 5: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 6: loadb */ - var39 = ptr5[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 9: subw */ - var48.i = var47.i - var40.i; - /* 11: mullw */ - var49.i = (var48.i * var41.i) & 0xffff; - /* 12: addw */ - var50.i = var46.i + var49.i; - /* 14: addw */ - var51.i = var50.i + var42.i; - /* 15: shrsw */ - var52.i = var51.i >> 8; - /* 16: addw */ - var53.i = var52.i + var45.i; - /* 17: addw */ - var54.i = var53.i + var48.i; - /* 18: addw */ - var55.i = var54.i + var48.i; - /* 19: convsuswb */ - var43 = ORC_CLAMP_UB (var55.i); - /* 20: storeb */ - ptr0[i] = var43; - } - -} - -#else -static void -_backup_orc_matrix2_12_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var36; - orc_union16 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union16 var55; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - /* 2: loadpw */ - var37.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var38.i = ex->params[24]; - /* 8: loadpw */ - var40.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var41.i = ex->params[25]; - /* 13: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr4[i]; - /* 1: convubw */ - var44.i = (orc_uint8) var36; - /* 3: subw */ - var45.i = var44.i - var37.i; - /* 5: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 6: loadb */ - var39 = ptr5[i]; - /* 7: convubw */ - var47.i = (orc_uint8) var39; - /* 9: subw */ - var48.i = var47.i - var40.i; - /* 11: mullw */ - var49.i = (var48.i * var41.i) & 0xffff; - /* 12: addw */ - var50.i = var46.i + var49.i; - /* 14: addw */ - var51.i = var50.i + var42.i; - /* 15: shrsw */ - var52.i = var51.i >> 8; - /* 16: addw */ - var53.i = var52.i + var45.i; - /* 17: addw */ - var54.i = var53.i + var48.i; - /* 18: addw */ - var55.i = var54.i + var48.i; - /* 19: convsuswb */ - var43 = ORC_CLAMP_UB (var55.i); - /* 20: storeb */ - ptr0[i] = var43; - } - -} - -void -orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix2_12_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix2_12_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_constant (p, 4, 0x00000010, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x00000008, "c3"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix3_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int p4, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 2: loadpw */ - var35.i = p1; - /* 6: loadpw */ - var37.i = p2; - /* 11: loadpw */ - var39.i = p3; - /* 14: loadpw */ - var40.i = p4; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var42.i = (orc_uint8) var34; - /* 3: mullw */ - var43.i = (var42.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var44.i = (orc_uint8) var36; - /* 7: mullw */ - var45.i = (var44.i * var37.i) & 0xffff; - /* 8: addw */ - var46.i = var43.i + var45.i; - /* 9: loadb */ - var38 = ptr6[i]; - /* 10: convubw */ - var47.i = (orc_uint8) var38; - /* 12: mullw */ - var48.i = (var47.i * var39.i) & 0xffff; - /* 13: addw */ - var49.i = var46.i + var48.i; - /* 15: addw */ - var50.i = var49.i + var40.i; - /* 16: shrsw */ - var51.i = var50.i >> 6; - /* 17: convsuswb */ - var41 = ORC_CLAMP_UB (var51.i); - /* 18: storeb */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_orc_matrix3_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 2: loadpw */ - var35.i = ex->params[24]; - /* 6: loadpw */ - var37.i = ex->params[25]; - /* 11: loadpw */ - var39.i = ex->params[26]; - /* 14: loadpw */ - var40.i = ex->params[27]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var42.i = (orc_uint8) var34; - /* 3: mullw */ - var43.i = (var42.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var44.i = (orc_uint8) var36; - /* 7: mullw */ - var45.i = (var44.i * var37.i) & 0xffff; - /* 8: addw */ - var46.i = var43.i + var45.i; - /* 9: loadb */ - var38 = ptr6[i]; - /* 10: convubw */ - var47.i = (orc_uint8) var38; - /* 12: mullw */ - var48.i = (var47.i * var39.i) & 0xffff; - /* 13: addw */ - var49.i = var46.i + var48.i; - /* 15: addw */ - var50.i = var49.i + var40.i; - /* 16: shrsw */ - var51.i = var50.i >> 6; - /* 17: convsuswb */ - var41 = ORC_CLAMP_UB (var51.i); - /* 18: storeb */ - ptr0[i] = var41; - } - -} - -void -orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int p4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix3_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix3_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 4, 0x00000006, "c1"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_parameter (p, 2, "p3"); - orc_program_add_parameter (p, 2, "p4"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - ex->params[ORC_VAR_P3] = p3; - ex->params[ORC_VAR_P4] = p4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix3_100_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_union16 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_int8 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union16 var55; - orc_union16 var56; - orc_union16 var57; - orc_union16 var58; - orc_union16 var59; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 2: loadpw */ - var36.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var37.i = p1; - /* 8: loadpw */ - var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var40.i = p2; - /* 15: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 17: loadpw */ - var43.i = p3; - /* 20: loadpw */ - var44.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var46.i = (orc_uint8) var35; - /* 3: subw */ - var47.i = var46.i - var36.i; - /* 5: mullw */ - var48.i = (var47.i * var37.i) & 0xffff; - /* 6: loadb */ - var38 = ptr5[i]; - /* 7: convubw */ - var49.i = (orc_uint8) var38; - /* 9: subw */ - var50.i = var49.i - var39.i; - /* 11: mullw */ - var51.i = (var50.i * var40.i) & 0xffff; - /* 12: addw */ - var52.i = var48.i + var51.i; - /* 13: loadb */ - var41 = ptr6[i]; - /* 14: convubw */ - var53.i = (orc_uint8) var41; - /* 16: subw */ - var54.i = var53.i - var42.i; - /* 18: mullw */ - var55.i = (var54.i * var43.i) & 0xffff; - /* 19: addw */ - var56.i = var52.i + var55.i; - /* 21: addw */ - var57.i = var56.i + var44.i; - /* 22: shrsw */ - var58.i = var57.i >> 8; - /* 23: addw */ - var59.i = var58.i + var47.i; - /* 24: convsuswb */ - var45 = ORC_CLAMP_UB (var59.i); - /* 25: storeb */ - ptr0[i] = var45; - } - -} - -#else -static void -_backup_orc_matrix3_100_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_union16 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_int8 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union16 var55; - orc_union16 var56; - orc_union16 var57; - orc_union16 var58; - orc_union16 var59; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 2: loadpw */ - var36.i = (int) 0x00000010; /* 16 or 7.90505e-323f */ - /* 4: loadpw */ - var37.i = ex->params[24]; - /* 8: loadpw */ - var39.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 10: loadpw */ - var40.i = ex->params[25]; - /* 15: loadpw */ - var42.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 17: loadpw */ - var43.i = ex->params[26]; - /* 20: loadpw */ - var44.i = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var46.i = (orc_uint8) var35; - /* 3: subw */ - var47.i = var46.i - var36.i; - /* 5: mullw */ - var48.i = (var47.i * var37.i) & 0xffff; - /* 6: loadb */ - var38 = ptr5[i]; - /* 7: convubw */ - var49.i = (orc_uint8) var38; - /* 9: subw */ - var50.i = var49.i - var39.i; - /* 11: mullw */ - var51.i = (var50.i * var40.i) & 0xffff; - /* 12: addw */ - var52.i = var48.i + var51.i; - /* 13: loadb */ - var41 = ptr6[i]; - /* 14: convubw */ - var53.i = (orc_uint8) var41; - /* 16: subw */ - var54.i = var53.i - var42.i; - /* 18: mullw */ - var55.i = (var54.i * var43.i) & 0xffff; - /* 19: addw */ - var56.i = var52.i + var55.i; - /* 21: addw */ - var57.i = var56.i + var44.i; - /* 22: shrsw */ - var58.i = var57.i >> 8; - /* 23: addw */ - var59.i = var58.i + var47.i; - /* 24: convsuswb */ - var45 = ORC_CLAMP_UB (var59.i); - /* 25: storeb */ - ptr0[i] = var45; - } - -} - -void -orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix3_100_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix3_100_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 4, 0x00000010, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x00000008, "c3"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_parameter (p, 2, "p3"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T3, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - ex->params[ORC_VAR_P3] = p3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix3_100_offset_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_int8 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 2: loadpw */ - var36.i = p1; - /* 6: loadpw */ - var38.i = p2; - /* 11: loadpw */ - var40.i = p3; - /* 14: loadpw */ - var41.i = p4; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var43.i = (orc_uint8) var35; - /* 3: mullw */ - var44.i = (var43.i * var36.i) & 0xffff; - /* 4: loadb */ - var37 = ptr5[i]; - /* 5: convubw */ - var45.i = (orc_uint8) var37; - /* 7: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 8: addw */ - var47.i = var44.i + var46.i; - /* 9: loadb */ - var39 = ptr6[i]; - /* 10: convubw */ - var48.i = (orc_uint8) var39; - /* 12: mullw */ - var49.i = (var48.i * var40.i) & 0xffff; - /* 13: addw */ - var50.i = var47.i + var49.i; - /* 15: addw */ - var51.i = var50.i + var41.i; - /* 16: shrsw */ - var52.i = var51.i >> p5; - /* 17: addw */ - var53.i = var52.i + var43.i; - /* 18: convsuswb */ - var42 = ORC_CLAMP_UB (var53.i); - /* 19: storeb */ - ptr0[i] = var42; - } - -} - -#else -static void -_backup_orc_matrix3_100_offset_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - orc_int8 var39; - orc_union16 var40; - orc_union16 var41; - orc_int8 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 2: loadpw */ - var36.i = ex->params[24]; - /* 6: loadpw */ - var38.i = ex->params[25]; - /* 11: loadpw */ - var40.i = ex->params[26]; - /* 14: loadpw */ - var41.i = ex->params[27]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var35 = ptr4[i]; - /* 1: convubw */ - var43.i = (orc_uint8) var35; - /* 3: mullw */ - var44.i = (var43.i * var36.i) & 0xffff; - /* 4: loadb */ - var37 = ptr5[i]; - /* 5: convubw */ - var45.i = (orc_uint8) var37; - /* 7: mullw */ - var46.i = (var45.i * var38.i) & 0xffff; - /* 8: addw */ - var47.i = var44.i + var46.i; - /* 9: loadb */ - var39 = ptr6[i]; - /* 10: convubw */ - var48.i = (orc_uint8) var39; - /* 12: mullw */ - var49.i = (var48.i * var40.i) & 0xffff; - /* 13: addw */ - var50.i = var47.i + var49.i; - /* 15: addw */ - var51.i = var50.i + var41.i; - /* 16: shrsw */ - var52.i = var51.i >> ex->params[28]; - /* 17: addw */ - var53.i = var52.i + var43.i; - /* 18: convsuswb */ - var42 = ORC_CLAMP_UB (var53.i); - /* 19: storeb */ - ptr0[i] = var42; - } - -} - -void -orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix3_100_offset_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix3_100_offset_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_parameter (p, 2, "p3"); - orc_program_add_parameter (p, 2, "p4"); - orc_program_add_parameter (p, 2, "p5"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P5, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - ex->params[ORC_VAR_P3] = p3; - ex->params[ORC_VAR_P4] = p4; - ex->params[ORC_VAR_P5] = p5; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_matrix3_000_u8 */ -#ifdef DISABLE_ORC -void -orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int p4, int p5, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 2: loadpw */ - var35.i = p1; - /* 6: loadpw */ - var37.i = p2; - /* 11: loadpw */ - var39.i = p3; - /* 14: loadpw */ - var40.i = p4; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var42.i = (orc_uint8) var34; - /* 3: mullw */ - var43.i = (var42.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var44.i = (orc_uint8) var36; - /* 7: mullw */ - var45.i = (var44.i * var37.i) & 0xffff; - /* 8: addw */ - var46.i = var43.i + var45.i; - /* 9: loadb */ - var38 = ptr6[i]; - /* 10: convubw */ - var47.i = (orc_uint8) var38; - /* 12: mullw */ - var48.i = (var47.i * var39.i) & 0xffff; - /* 13: addw */ - var49.i = var46.i + var48.i; - /* 15: addw */ - var50.i = var49.i + var40.i; - /* 16: shrsw */ - var51.i = var50.i >> p5; - /* 17: convwb */ - var41 = var51.i; - /* 18: storeb */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_orc_matrix3_000_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - orc_union16 var47; - orc_union16 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 2: loadpw */ - var35.i = ex->params[24]; - /* 6: loadpw */ - var37.i = ex->params[25]; - /* 11: loadpw */ - var39.i = ex->params[26]; - /* 14: loadpw */ - var40.i = ex->params[27]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var42.i = (orc_uint8) var34; - /* 3: mullw */ - var43.i = (var42.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var44.i = (orc_uint8) var36; - /* 7: mullw */ - var45.i = (var44.i * var37.i) & 0xffff; - /* 8: addw */ - var46.i = var43.i + var45.i; - /* 9: loadb */ - var38 = ptr6[i]; - /* 10: convubw */ - var47.i = (orc_uint8) var38; - /* 12: mullw */ - var48.i = (var47.i * var39.i) & 0xffff; - /* 13: addw */ - var49.i = var46.i + var48.i; - /* 15: addw */ - var50.i = var49.i + var40.i; - /* 16: shrsw */ - var51.i = var50.i >> ex->params[28]; - /* 17: convwb */ - var41 = var51.i; - /* 18: storeb */ - ptr0[i] = var41; - } - -} - -void -orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int p2, int p3, int p4, int p5, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_matrix3_000_u8"); - orc_program_set_backup_function (p, _backup_orc_matrix3_000_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_parameter (p, 2, "p3"); - orc_program_add_parameter (p, 2, "p4"); - orc_program_add_parameter (p, 2, "p5"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P3, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P5, - ORC_VAR_D1); - orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - ex->params[ORC_VAR_P3] = p3; - ex->params[ORC_VAR_P4] = p4; - ex->params[ORC_VAR_P5] = p5; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_pack_123x */ -#ifdef DISABLE_ORC -void -orc_pack_123x (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 4: loadpb */ - var37 = p1; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: loadb */ - var35 = ptr5[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr6[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var40.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_orc_pack_123x (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 4: loadpb */ - var37 = ex->params[24]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: loadb */ - var35 = ptr5[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr6[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var40.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -orc_pack_123x (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_pack_123x"); - orc_program_set_backup_function (p, _backup_orc_pack_123x); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_parameter (p, 1, "p1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S3, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* orc_pack_x123 */ -#ifdef DISABLE_ORC -void -orc_pack_x123 (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 0: loadpb */ - var34 = p1; - - for (i = 0; i < n; i++) { - /* 1: loadb */ - var35 = ptr4[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr5[i]; - /* 4: loadb */ - var37 = ptr6[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var40.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_orc_pack_x123 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 0: loadpb */ - var34 = ex->params[24]; - - for (i = 0; i < n; i++) { - /* 1: loadb */ - var35 = ptr4[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr5[i]; - /* 4: loadb */ - var37 = ptr6[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var40.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -orc_pack_x123 (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "orc_pack_x123"); - orc_program_set_backup_function (p, _backup_orc_pack_x123); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_parameter (p, 1, "p1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_P1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_P1] = p1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_combine2_u8 */ -#ifdef DISABLE_ORC -void -cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - - /* 2: loadpw */ - var35.i = p1; - /* 6: loadpw */ - var37.i = p2; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var39.i = (orc_uint8) var34; - /* 3: mullw */ - var40.i = (var39.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var41.i = (orc_uint8) var36; - /* 7: mullw */ - var42.i = (var41.i * var37.i) & 0xffff; - /* 8: addw */ - var43.i = var40.i + var42.i; - /* 9: shruw */ - var44.i = ((orc_uint16) var43.i) >> 8; - /* 10: convsuswb */ - var38 = ORC_CLAMP_UB (var44.i); - /* 11: storeb */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_combine2_u8 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var34; - orc_union16 var35; - orc_int8 var36; - orc_union16 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - - /* 2: loadpw */ - var35.i = ex->params[24]; - /* 6: loadpw */ - var37.i = ex->params[25]; - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr4[i]; - /* 1: convubw */ - var39.i = (orc_uint8) var34; - /* 3: mullw */ - var40.i = (var39.i * var35.i) & 0xffff; - /* 4: loadb */ - var36 = ptr5[i]; - /* 5: convubw */ - var41.i = (orc_uint8) var36; - /* 7: mullw */ - var42.i = (var41.i * var37.i) & 0xffff; - /* 8: addw */ - var43.i = var40.i + var42.i; - /* 9: shruw */ - var44.i = ((orc_uint16) var43.i) >> 8; - /* 10: convsuswb */ - var38 = ORC_CLAMP_UB (var44.i); - /* 11: storeb */ - ptr0[i] = var38; - } - -} - -void -cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int p1, int p2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_combine2_u8"); - orc_program_set_backup_function (p, _backup_cogorc_combine2_u8); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_constant (p, 4, 0x00000008, "c1"); - orc_program_add_parameter (p, 2, "p1"); - orc_program_add_parameter (p, 2, "p2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1, - ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P2, - ORC_VAR_D1); - orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "shruw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_P1] = p1; - ex->params[ORC_VAR_P2] = p2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_I420_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - orc_union32 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) d1; - ptr1 = (orc_union32 *) d2; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr6[i]; - /* 1: loadb */ - var34 = ptr7[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var39.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[0]; - _dest.x2[1] = var35.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[1]; - _dest.x2[1] = var35.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - /* 6: loadw */ - var37 = ptr5[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[0]; - _dest.x2[1] = var37.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[1]; - _dest.x2[1] = var37.x2[1]; - var38.x2[1] = _dest.i; - } - /* 8: storel */ - ptr1[i] = var38; - } - -} - -#else -static void -_backup_cogorc_convert_I420_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - orc_union32 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr1 = (orc_union32 *) ex->arrays[1]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr6[i]; - /* 1: loadb */ - var34 = ptr7[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var39.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[0]; - _dest.x2[1] = var35.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[1]; - _dest.x2[1] = var35.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - /* 6: loadw */ - var37 = ptr5[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[0]; - _dest.x2[1] = var37.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var39.x2[1]; - _dest.x2[1] = var37.x2[1]; - var38.x2[1] = _dest.i; - } - /* 8: storel */ - ptr1[i] = var38; - } - -} - -void -cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_I420_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_convert_I420_UYVY); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_destination (p, 4, "d2"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S3, ORC_VAR_S4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D2, ORC_VAR_T1, ORC_VAR_S2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_I420_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - orc_union32 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) d1; - ptr1 = (orc_union32 *) d2; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr6[i]; - /* 1: loadb */ - var34 = ptr7[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var39.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[0]; - _dest.x2[1] = var39.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[1]; - _dest.x2[1] = var39.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - /* 6: loadw */ - var37 = ptr5[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var38.x2[1] = _dest.i; - } - /* 8: storel */ - ptr1[i] = var38; - } - -} - -#else -static void -_backup_cogorc_convert_I420_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - orc_union32 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr1 = (orc_union32 *) ex->arrays[1]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr6[i]; - /* 1: loadb */ - var34 = ptr7[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var39.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[0]; - _dest.x2[1] = var39.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[1]; - _dest.x2[1] = var39.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - /* 6: loadw */ - var37 = ptr5[i]; - /* 7: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var38.x2[1] = _dest.i; - } - /* 8: storel */ - ptr1[i] = var38; - } - -} - -void -cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_I420_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_convert_I420_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_destination (p, 4, "d2"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S3, ORC_VAR_S4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D2, ORC_VAR_S2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_I420_AYUV */ -#ifdef DISABLE_ORC -void -cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union32 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - - ptr0 = (orc_union32 *) d1; - ptr1 = (orc_union32 *) d2; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 8: loadpb */ - var39 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var42 = ptr6[i >> 1]; - /* 1: loadupdb */ - var43 = ptr7[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var42; - _dest.x2[1] = var43; - var44.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var45.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var45.i; - _dest.x2[1] = var44.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - /* 9: loadb */ - var40 = ptr5[i]; - /* 10: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var46.i = _dest.i; - } - /* 11: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var46.i; - _dest.x2[1] = var44.i; - var41.i = _dest.i; - } - /* 12: storel */ - ptr1[i] = var41; - } - -} - -#else -static void -_backup_cogorc_convert_I420_AYUV (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - orc_union32 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union32 var41; - orc_int8 var42; - orc_int8 var43; - orc_union16 var44; - orc_union16 var45; - orc_union16 var46; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr1 = (orc_union32 *) ex->arrays[1]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 8: loadpb */ - var39 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var42 = ptr6[i >> 1]; - /* 1: loadupdb */ - var43 = ptr7[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var42; - _dest.x2[1] = var43; - var44.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var45.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var45.i; - _dest.x2[1] = var44.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - /* 9: loadb */ - var40 = ptr5[i]; - /* 10: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var46.i = _dest.i; - } - /* 11: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var46.i; - _dest.x2[1] = var44.i; - var41.i = _dest.i; - } - /* 12: storel */ - ptr1[i] = var41; - } - -} - -void -cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_I420_AYUV"); - orc_program_set_backup_function (p, _backup_cogorc_convert_I420_AYUV); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_destination (p, 4, "d2"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_YUY2_I420 */ -#ifdef DISABLE_ORC -void -cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union32 *ORC_RESTRICT ptr4; - const orc_union32 *ORC_RESTRICT ptr5; - orc_union32 var35; - orc_union32 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_union16 *) d2; - ptr2 = (orc_int8 *) d3; - ptr3 = (orc_int8 *) d4; - ptr4 = (orc_union32 *) s1; - ptr5 = (orc_union32 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var40; - /* 3: loadl */ - var36 = ptr5[i]; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var41.x2[0] = _src.x2[1]; - var42.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var41.x2[1] = _src.x2[1]; - var42.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr1[i] = var42; - /* 6: avgub */ - var43.x2[0] = ((orc_uint8) var39.x2[0] + (orc_uint8) var41.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var39.x2[1] + (orc_uint8) var41.x2[1] + 1) >> 1; - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 8: storeb */ - ptr3[i] = var37; - /* 9: storeb */ - ptr2[i] = var38; - } - -} - -#else -static void -_backup_cogorc_convert_YUY2_I420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union32 *ORC_RESTRICT ptr4; - const orc_union32 *ORC_RESTRICT ptr5; - orc_union32 var35; - orc_union32 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_union16 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr3 = (orc_int8 *) ex->arrays[3]; - ptr4 = (orc_union32 *) ex->arrays[4]; - ptr5 = (orc_union32 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var40; - /* 3: loadl */ - var36 = ptr5[i]; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var41.x2[0] = _src.x2[1]; - var42.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var41.x2[1] = _src.x2[1]; - var42.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr1[i] = var42; - /* 6: avgub */ - var43.x2[0] = ((orc_uint8) var39.x2[0] + (orc_uint8) var41.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var39.x2[1] + (orc_uint8) var41.x2[1] + 1) >> 1; - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 8: storeb */ - ptr3[i] = var37; - /* 9: storeb */ - ptr2[i] = var38; - } - -} - -void -cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_YUY2_I420"); - orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_I420); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_destination (p, 1, "d4"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_source (p, 4, "s2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D4, ORC_VAR_D3, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_D4] = d4; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_UYVY_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapw */ - var33.x2[0] = ORC_SWAP_W (var32.x2[0]); - var33.x2[1] = ORC_SWAP_W (var32.x2[1]); - /* 2: storel */ - ptr0[i] = var33; - } - } - -} - -#else -static void -_backup_cogorc_convert_UYVY_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapw */ - var33.x2[0] = ORC_SWAP_W (var32.x2[0]); - var33.x2[1] = ORC_SWAP_W (var32.x2[1]); - /* 2: storel */ - ptr0[i] = var33; - } - } - -} - -void -cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_UYVY_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - - orc_program_append_2 (p, "swapw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_420_422 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - orc_int8 var35; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: copyb */ - var33 = var32; - /* 2: storeb */ - ptr0[i] = var33; - /* 3: loadb */ - var34 = ptr4[i]; - /* 4: copyb */ - var35 = var34; - /* 5: storeb */ - ptr1[i] = var35; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_420_422 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - orc_int8 var35; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: copyb */ - var33 = var32; - /* 2: storeb */ - ptr0[i] = var33; - /* 3: loadb */ - var34 = ptr4[i]; - /* 4: copyb */ - var35 = var34; - /* 5: storeb */ - ptr1[i] = var35; - } - } - -} - -void -cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_420_422"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_420_422); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_source (p, 1, "s1"); - - orc_program_append_2 (p, "copyb", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "copyb", 0, ORC_VAR_D2, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_420_444 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: splatbw */ - var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff); - /* 2: storew */ - ptr0[i] = var34; - /* 3: storew */ - ptr1[i] = var34; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_420_444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: splatbw */ - var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff); - /* 2: storew */ - ptr0[i] = var34; - /* 3: storew */ - ptr1[i] = var34; - } - } - -} - -void -cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, - int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_420_444"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_420_444); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, ORC_VAR_T1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_422_444 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: splatbw */ - var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff); - /* 2: storew */ - ptr0[i] = var34; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_422_444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_union16 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr4[i]; - /* 1: splatbw */ - var34.i = ((var33 & 0xff) << 8) | (var33 & 0xff); - /* 2: storew */ - ptr0[i] = var34; - } - } - -} - -void -cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_422_444"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_422_444); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_444_422 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var34.i; - var36 = _src.x2[1]; - var37 = _src.x2[0]; - } - /* 2: avgub */ - var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var35; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_444_422 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var34.i; - var36 = _src.x2[1]; - var37 = _src.x2[0]; - } - /* 2: avgub */ - var35 = ((orc_uint8) var36 + (orc_uint8) var37 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var35; - } - } - -} - -void -cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_444_422"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_444_422); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_444_420 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - orc_int8 var39; - orc_int8 var40; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var35 = ptr4[i]; - /* 1: loadw */ - var36 = ptr5[i]; - /* 2: avgub */ - var38.x2[0] = - ((orc_uint8) var35.x2[0] + (orc_uint8) var36.x2[0] + 1) >> 1; - var38.x2[1] = - ((orc_uint8) var35.x2[1] + (orc_uint8) var36.x2[1] + 1) >> 1; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var39 = _src.x2[1]; - var40 = _src.x2[0]; - } - /* 4: avgub */ - var37 = ((orc_uint8) var39 + (orc_uint8) var40 + 1) >> 1; - /* 5: storeb */ - ptr0[i] = var37; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_444_420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - orc_int8 var39; - orc_int8 var40; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var35 = ptr4[i]; - /* 1: loadw */ - var36 = ptr5[i]; - /* 2: avgub */ - var38.x2[0] = - ((orc_uint8) var35.x2[0] + (orc_uint8) var36.x2[0] + 1) >> 1; - var38.x2[1] = - ((orc_uint8) var35.x2[1] + (orc_uint8) var36.x2[1] + 1) >> 1; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var39 = _src.x2[1]; - var40 = _src.x2[0]; - } - /* 4: avgub */ - var37 = ((orc_uint8) var39 + (orc_uint8) var40 + 1) >> 1; - /* 5: storeb */ - ptr0[i] = var37; - } - } - -} - -void -cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_444_420"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_444_420); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_planar_chroma_422_420 */ -#ifdef DISABLE_ORC -void -cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - } - -} - -#else -static void -_backup_cogorc_planar_chroma_422_420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - orc_int8 var32; - orc_int8 var33; - orc_int8 var34; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var32 = ptr4[i]; - /* 1: loadb */ - var33 = ptr5[i]; - /* 2: avgub */ - var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; - /* 3: storeb */ - ptr0[i] = var34; - } - } - -} - -void -cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_planar_chroma_422_420"); - orc_program_set_backup_function (p, _backup_cogorc_planar_chroma_422_420); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_YUY2_AYUV */ -#ifdef DISABLE_ORC -void -cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_YUY2_AYUV (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - } - -} - -void -cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_YUY2_AYUV"); - orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_AYUV); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 2, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_UYVY_AYUV */ -#ifdef DISABLE_ORC -void -cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var40.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_UYVY_AYUV (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var40.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - } - -} - -void -cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_UYVY_AYUV"); - orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_AYUV); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 2, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_YUY2_Y42B */ -#ifdef DISABLE_ORC -void -cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var33.x2[0]; - var37.x2[0] = _src.x2[1]; - var34.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var33.x2[1]; - var37.x2[1] = _src.x2[1]; - var34.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var34; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var37.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 4: storeb */ - ptr2[i] = var35; - /* 5: storeb */ - ptr1[i] = var36; - } - } - -} - -#else -static void -_backup_cogorc_convert_YUY2_Y42B (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var33.x2[0]; - var37.x2[0] = _src.x2[1]; - var34.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var33.x2[1]; - var37.x2[1] = _src.x2[1]; - var34.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var34; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var37.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 4: storeb */ - ptr2[i] = var35; - /* 5: storeb */ - ptr1[i] = var36; - } - } - -} - -void -cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_YUY2_Y42B"); - orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_Y42B); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_UYVY_Y42B */ -#ifdef DISABLE_ORC -void -cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var33.x2[0]; - var34.x2[0] = _src.x2[1]; - var37.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var33.x2[1]; - var34.x2[1] = _src.x2[1]; - var37.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var34; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var37.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 4: storeb */ - ptr2[i] = var35; - /* 5: storeb */ - ptr1[i] = var36; - } - } - -} - -#else -static void -_backup_cogorc_convert_UYVY_Y42B (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_union16 var34; - orc_int8 var35; - orc_int8 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var33.x2[0]; - var34.x2[0] = _src.x2[1]; - var37.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var33.x2[1]; - var34.x2[1] = _src.x2[1]; - var37.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var34; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var37.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 4: storeb */ - ptr2[i] = var35; - /* 5: storeb */ - ptr1[i] = var36; - } - } - -} - -void -cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_UYVY_Y42B"); - orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_Y42B); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_YUY2_Y444 */ -#ifdef DISABLE_ORC -void -cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_union16 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var35; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var36.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var36.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var36; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var39.i; - var40 = _src.x2[1]; - var41 = _src.x2[0]; - } - /* 4: splatbw */ - var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff); - /* 5: storew */ - ptr1[i] = var37; - /* 6: splatbw */ - var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff); - /* 7: storew */ - ptr2[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_YUY2_Y444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_union16 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var35; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var36.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var36.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var36; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var39.i; - var40 = _src.x2[1]; - var41 = _src.x2[0]; - } - /* 4: splatbw */ - var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff); - /* 5: storew */ - ptr1[i] = var37; - /* 6: splatbw */ - var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff); - /* 7: storew */ - ptr2[i] = var38; - } - } - -} - -void -cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_YUY2_Y444"); - orc_program_set_backup_function (p, _backup_cogorc_convert_YUY2_Y444); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_destination (p, 2, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D3, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_UYVY_Y444 */ -#ifdef DISABLE_ORC -void -cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_union16 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var35; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var36.x2[0] = _src.x2[1]; - var39.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var36.x2[1] = _src.x2[1]; - var39.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var36; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var39.i; - var40 = _src.x2[1]; - var41 = _src.x2[0]; - } - /* 4: splatbw */ - var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff); - /* 5: storew */ - ptr1[i] = var37; - /* 6: splatbw */ - var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff); - /* 7: storew */ - ptr2[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_UYVY_Y444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_union16 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var35; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var36.x2[0] = _src.x2[1]; - var39.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var36.x2[1] = _src.x2[1]; - var39.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var36; - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var39.i; - var40 = _src.x2[1]; - var41 = _src.x2[0]; - } - /* 4: splatbw */ - var37.i = ((var41 & 0xff) << 8) | (var41 & 0xff); - /* 5: storew */ - ptr1[i] = var37; - /* 6: splatbw */ - var38.i = ((var40 & 0xff) << 8) | (var40 & 0xff); - /* 7: storew */ - ptr2[i] = var38; - } - } - -} - -void -cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_UYVY_Y444"); - orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_Y444); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_destination (p, 2, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "splatbw", 0, ORC_VAR_D3, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_UYVY_I420 */ -#ifdef DISABLE_ORC -void -cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union32 *ORC_RESTRICT ptr4; - const orc_union32 *ORC_RESTRICT ptr5; - orc_union32 var35; - orc_union32 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_union16 *) d2; - ptr2 = (orc_int8 *) d3; - ptr3 = (orc_int8 *) d4; - ptr4 = (orc_union32 *) s1; - ptr5 = (orc_union32 *) s2; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var39; - /* 3: loadl */ - var36 = ptr5[i]; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var41.x2[0] = _src.x2[1]; - var42.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var41.x2[1] = _src.x2[1]; - var42.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr1[i] = var41; - /* 6: avgub */ - var43.x2[0] = ((orc_uint8) var40.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var40.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 8: storeb */ - ptr3[i] = var37; - /* 9: storeb */ - ptr2[i] = var38; - } - -} - -#else -static void -_backup_cogorc_convert_UYVY_I420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union32 *ORC_RESTRICT ptr4; - const orc_union32 *ORC_RESTRICT ptr5; - orc_union32 var35; - orc_union32 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_union16 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr3 = (orc_int8 *) ex->arrays[3]; - ptr4 = (orc_union32 *) ex->arrays[4]; - ptr5 = (orc_union32 *) ex->arrays[5]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var35 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var35.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var35.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: storew */ - ptr0[i] = var39; - /* 3: loadl */ - var36 = ptr5[i]; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var41.x2[0] = _src.x2[1]; - var42.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var41.x2[1] = _src.x2[1]; - var42.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr1[i] = var41; - /* 6: avgub */ - var43.x2[0] = ((orc_uint8) var40.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var40.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 8: storeb */ - ptr3[i] = var37; - /* 9: storeb */ - ptr2[i] = var38; - } - -} - -void -cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_UYVY_I420"); - orc_program_set_backup_function (p, _backup_cogorc_convert_UYVY_I420); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_destination (p, 1, "d4"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_source (p, 4, "s2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "storew", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D4, ORC_VAR_D3, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_D4] = d4; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_I420 */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union64 *ORC_RESTRICT ptr4; - const orc_union64 *ORC_RESTRICT ptr5; - orc_union64 var40; - orc_union16 var41; - orc_union64 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_union32 var46; - orc_union32 var47; - orc_union32 var48; - orc_union32 var49; - orc_union32 var50; - orc_union16 var51; - orc_union16 var52; - orc_int8 var53; - orc_int8 var54; - orc_int8 var55; - orc_int8 var56; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr3 = ORC_PTR_OFFSET (d4, d4_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.x2[0]; - var46.x2[0] = _src.x2[1]; - var47.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var40.x2[1]; - var46.x2[1] = _src.x2[1]; - var47.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var47.x2[0]; - var41.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var47.x2[1]; - var41.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var41; - /* 4: loadq */ - var42 = ptr5[i]; - /* 5: splitlw */ - { - orc_union32 _src; - _src.i = var42.x2[0]; - var48.x2[0] = _src.x2[1]; - var49.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var42.x2[1]; - var48.x2[1] = _src.x2[1]; - var49.x2[1] = _src.x2[0]; - } - /* 6: select1wb */ - { - orc_union16 _src; - _src.i = var49.x2[0]; - var43.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var49.x2[1]; - var43.x2[1] = _src.x2[1]; - } - /* 7: storew */ - ptr1[i] = var43; - /* 8: avgub */ - var50.x4[0] = - ((orc_uint8) var46.x4[0] + (orc_uint8) var48.x4[0] + 1) >> 1; - var50.x4[1] = - ((orc_uint8) var46.x4[1] + (orc_uint8) var48.x4[1] + 1) >> 1; - var50.x4[2] = - ((orc_uint8) var46.x4[2] + (orc_uint8) var48.x4[2] + 1) >> 1; - var50.x4[3] = - ((orc_uint8) var46.x4[3] + (orc_uint8) var48.x4[3] + 1) >> 1; - /* 9: splitwb */ - { - orc_union16 _src; - _src.i = var50.x2[0]; - var51.x2[0] = _src.x2[1]; - var52.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var50.x2[1]; - var51.x2[1] = _src.x2[1]; - var52.x2[1] = _src.x2[0]; - } - /* 10: splitwb */ - { - orc_union16 _src; - _src.i = var52.i; - var53 = _src.x2[1]; - var54 = _src.x2[0]; - } - /* 11: avgub */ - var44 = ((orc_uint8) var53 + (orc_uint8) var54 + 1) >> 1; - /* 12: storeb */ - ptr2[i] = var44; - /* 13: splitwb */ - { - orc_union16 _src; - _src.i = var51.i; - var55 = _src.x2[1]; - var56 = _src.x2[0]; - } - /* 14: avgub */ - var45 = ((orc_uint8) var55 + (orc_uint8) var56 + 1) >> 1; - /* 15: storeb */ - ptr3[i] = var45; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_I420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_int8 *ORC_RESTRICT ptr3; - const orc_union64 *ORC_RESTRICT ptr4; - const orc_union64 *ORC_RESTRICT ptr5; - orc_union64 var40; - orc_union16 var41; - orc_union64 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_union32 var46; - orc_union32 var47; - orc_union32 var48; - orc_union32 var49; - orc_union32 var50; - orc_union16 var51; - orc_union16 var52; - orc_int8 var53; - orc_int8 var54; - orc_int8 var55; - orc_int8 var56; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr3 = ORC_PTR_OFFSET (ex->arrays[3], ex->params[3] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.x2[0]; - var46.x2[0] = _src.x2[1]; - var47.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var40.x2[1]; - var46.x2[1] = _src.x2[1]; - var47.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var47.x2[0]; - var41.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var47.x2[1]; - var41.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var41; - /* 4: loadq */ - var42 = ptr5[i]; - /* 5: splitlw */ - { - orc_union32 _src; - _src.i = var42.x2[0]; - var48.x2[0] = _src.x2[1]; - var49.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var42.x2[1]; - var48.x2[1] = _src.x2[1]; - var49.x2[1] = _src.x2[0]; - } - /* 6: select1wb */ - { - orc_union16 _src; - _src.i = var49.x2[0]; - var43.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var49.x2[1]; - var43.x2[1] = _src.x2[1]; - } - /* 7: storew */ - ptr1[i] = var43; - /* 8: avgub */ - var50.x4[0] = - ((orc_uint8) var46.x4[0] + (orc_uint8) var48.x4[0] + 1) >> 1; - var50.x4[1] = - ((orc_uint8) var46.x4[1] + (orc_uint8) var48.x4[1] + 1) >> 1; - var50.x4[2] = - ((orc_uint8) var46.x4[2] + (orc_uint8) var48.x4[2] + 1) >> 1; - var50.x4[3] = - ((orc_uint8) var46.x4[3] + (orc_uint8) var48.x4[3] + 1) >> 1; - /* 9: splitwb */ - { - orc_union16 _src; - _src.i = var50.x2[0]; - var51.x2[0] = _src.x2[1]; - var52.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var50.x2[1]; - var51.x2[1] = _src.x2[1]; - var52.x2[1] = _src.x2[0]; - } - /* 10: splitwb */ - { - orc_union16 _src; - _src.i = var52.i; - var53 = _src.x2[1]; - var54 = _src.x2[0]; - } - /* 11: avgub */ - var44 = ((orc_uint8) var53 + (orc_uint8) var54 + 1) >> 1; - /* 12: storeb */ - ptr2[i] = var44; - /* 13: splitwb */ - { - orc_union16 _src; - _src.i = var51.i; - var55 = _src.x2[1]; - var56 = _src.x2[0]; - } - /* 14: avgub */ - var45 = ((orc_uint8) var55 + (orc_uint8) var56 + 1) >> 1; - /* 15: storeb */ - ptr3[i] = var45; - } - } - -} - -void -cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_I420"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_I420); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_destination (p, 1, "d4"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_source (p, 8, "s2"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 1, "t7"); - orc_program_add_temporary (p, 1, "t8"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D2, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 2, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D4, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_D4] = d4; - ex->params[ORC_VAR_D4] = d4_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - } - -} - -void -cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 4, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var44.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var44.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var44.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var44.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - } - -} - -void -cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_UYVY); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 4, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_Y42B */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 3: avgub */ - var44.x2[0] = - ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = - ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 5: storeb */ - ptr2[i] = var37; - /* 6: storeb */ - ptr1[i] = var38; - /* 7: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 8: storew */ - ptr0[i] = var39; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_Y42B (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 3: avgub */ - var44.x2[0] = - ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = - ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 5: storeb */ - ptr2[i] = var37; - /* 6: storeb */ - ptr1[i] = var38; - /* 7: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 8: storew */ - ptr0[i] = var39; - } - } - -} - -void -cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_Y42B"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_Y42B); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_Y444 */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr1 = ORC_PTR_OFFSET (d2, d2_stride * j); - ptr2 = ORC_PTR_OFFSET (d3, d3_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var34.i; - var38.i = _src.x2[1]; - var39.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 3: storeb */ - ptr2[i] = var35; - /* 4: storeb */ - ptr1[i] = var36; - /* 5: select1wb */ - { - orc_union16 _src; - _src.i = var39.i; - var37 = _src.x2[1]; - } - /* 6: storeb */ - ptr0[i] = var37; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_Y444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr1 = ORC_PTR_OFFSET (ex->arrays[1], ex->params[1] * j); - ptr2 = ORC_PTR_OFFSET (ex->arrays[2], ex->params[2] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var34.i; - var38.i = _src.x2[1]; - var39.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 3: storeb */ - ptr2[i] = var35; - /* 4: storeb */ - ptr1[i] = var36; - /* 5: select1wb */ - { - orc_union16 _src; - _src.i = var39.i; - var37 = _src.x2[1]; - } - /* 6: storeb */ - ptr0[i] = var37; - } - } - -} - -void -cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, - guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, - int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_Y444"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_Y444); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_D2] = d2; - ex->params[ORC_VAR_D2] = d2_stride; - ex->arrays[ORC_VAR_D3] = d3; - ex->params[ORC_VAR_D3] = d3_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y42B_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr5[i]; - /* 1: loadb */ - var34 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[0]; - _dest.x2[1] = var37.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[1]; - _dest.x2[1] = var37.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y42B_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr5[i]; - /* 1: loadb */ - var34 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[0]; - _dest.x2[1] = var37.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var35.x2[1]; - _dest.x2[1] = var37.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - } - -} - -void -cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y42B_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y42B_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr5[i]; - /* 1: loadb */ - var34 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var35.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var35.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y42B_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var33 = ptr5[i]; - /* 1: loadb */ - var34 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 3: loadw */ - var35 = ptr4[i]; - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var35.x2[0]; - var36.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var35.x2[1]; - var36.x2[1] = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - } - -} - -void -cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y42B_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_UYVY); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y42B_AYUV */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_union64 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - /* 3: loadpb */ - var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr5[i]; - /* 1: loadb */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var41.i = _dest.i; - } - /* 4: loadw */ - var39 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var39.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var39.x2[1]; - var42.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var40.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var40; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y42B_AYUV (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_union64 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - /* 3: loadpb */ - var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr5[i]; - /* 1: loadb */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var41.i = _dest.i; - } - /* 4: loadw */ - var39 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var39.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var39.x2[1]; - var42.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var40.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var40; - } - } - -} - -void -cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y42B_AYUV"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y42B_AYUV); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T4, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y444_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_union16 *ORC_RESTRICT ptr6; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var36 = ptr5[i]; - /* 1: loadw */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 4: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var43.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var43.x2[1]; - var39.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var39; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y444_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_union16 *ORC_RESTRICT ptr6; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var36 = ptr5[i]; - /* 1: loadw */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 4: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var43.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var43.x2[1]; - var39.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var39; - } - } - -} - -void -cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y444_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y444_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_union16 *ORC_RESTRICT ptr6; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var36 = ptr5[i]; - /* 1: loadw */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 4: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var38.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var38.x2[1]; - var39.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var39; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y444_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - const orc_union16 *ORC_RESTRICT ptr6; - orc_union16 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var36 = ptr5[i]; - /* 1: loadw */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 4: avgub */ - var43.x2[0] = - ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = - ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var38.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var38.x2[1]; - var39.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var39; - } - } - -} - -void -cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y444_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_UYVY); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_source (p, 2, "s3"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_Y444_AYUV */ -#ifdef DISABLE_ORC -void -cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - ptr5 = ORC_PTR_OFFSET (s2, s2_stride * j); - ptr6 = ORC_PTR_OFFSET (s3, s3_stride * j); - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr5[i]; - /* 1: loadb */ - var35 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var39.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - } - -} - -#else -static void -_backup_cogorc_convert_Y444_AYUV (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - ptr5 = ORC_PTR_OFFSET (ex->arrays[5], ex->params[5] * j); - ptr6 = ORC_PTR_OFFSET (ex->arrays[6], ex->params[6] * j); - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr5[i]; - /* 1: loadb */ - var35 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var39.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - } - -} - -void -cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, - const guint8 * ORC_RESTRICT s2, int s2_stride, - const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_Y444_AYUV"); - orc_program_set_backup_function (p, _backup_cogorc_convert_Y444_AYUV); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->params[ORC_VAR_S2] = s2_stride; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->params[ORC_VAR_S3] = s3_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_ARGB */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var61; - _dest.x2[1] = var87; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var88; - _dest.x2[1] = var89; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_ARGB (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var61; - _dest.x2[1] = var87; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var88; - _dest.x2[1] = var89; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -void -cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_ARGB"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_ARGB); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 2, "t10"); - orc_program_add_temporary (p, 2, "t11"); - orc_program_add_temporary (p, 2, "t12"); - orc_program_add_temporary (p, 1, "t13"); - orc_program_add_temporary (p, 1, "t14"); - orc_program_add_temporary (p, 1, "t15"); - orc_program_add_temporary (p, 4, "t16"); - - orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T9, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T8, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, - ORC_VAR_T13, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T14, - ORC_VAR_T15, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_BGRA */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var89; - _dest.x2[1] = var88; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var61; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_BGRA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var89; - _dest.x2[1] = var88; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var61; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -void -cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_BGRA"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_BGRA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 2, "t10"); - orc_program_add_temporary (p, 2, "t11"); - orc_program_add_temporary (p, 2, "t12"); - orc_program_add_temporary (p, 1, "t13"); - orc_program_add_temporary (p, 1, "t14"); - orc_program_add_temporary (p, 1, "t15"); - orc_program_add_temporary (p, 4, "t16"); - - orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T9, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T8, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T15, - ORC_VAR_T14, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T13, - ORC_VAR_T3, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_ABGR */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var61; - _dest.x2[1] = var89; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var88; - _dest.x2[1] = var87; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_ABGR (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var61; - _dest.x2[1] = var89; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var88; - _dest.x2[1] = var87; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -void -cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_ABGR"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_ABGR); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 2, "t10"); - orc_program_add_temporary (p, 2, "t11"); - orc_program_add_temporary (p, 2, "t12"); - orc_program_add_temporary (p, 1, "t13"); - orc_program_add_temporary (p, 1, "t14"); - orc_program_add_temporary (p, 1, "t15"); - orc_program_add_temporary (p, 4, "t16"); - - orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T9, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T8, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, - ORC_VAR_T15, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T14, - ORC_VAR_T13, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_AYUV_RGBA */ -#ifdef DISABLE_ORC -void -cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - int i; - int j; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); - ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var88; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var89; - _dest.x2[1] = var61; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -#else -static void -_backup_cogorc_convert_AYUV_RGBA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int j; - int n = ex->n; - int m = ex->params[ORC_VAR_A1]; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var48; - orc_union32 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_union32 var55; - orc_union32 var56; - orc_union32 var57; - orc_union16 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_int8 var87; - orc_int8 var88; - orc_int8 var89; - orc_union16 var90; - orc_union16 var91; - orc_union32 var92; - - for (j = 0; j < m; j++) { - ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); - ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); - - /* 1: loadpb */ - var49.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var49.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 14: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 21: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 25: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 29: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 40: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var48 = ptr4[i]; - /* 2: subb */ - var57.x4[0] = var48.x4[0] - var49.x4[0]; - var57.x4[1] = var48.x4[1] - var49.x4[1]; - var57.x4[2] = var48.x4[2] - var49.x4[2]; - var57.x4[3] = var48.x4[3] - var49.x4[3]; - /* 3: splitlw */ - { - orc_union32 _src; - _src.i = var57.i; - var58.i = _src.x2[1]; - var59.i = _src.x2[0]; - } - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var59.i; - var60 = _src.x2[1]; - var61 = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var58.i; - var62 = _src.x2[1]; - var63 = _src.x2[0]; - } - /* 6: convsbw */ - var64.i = var60; - /* 7: convsbw */ - var65.i = var63; - /* 8: convsbw */ - var66.i = var62; - /* 10: mullw */ - var67.i = (var64.i * var50.i) & 0xffff; - /* 11: shrsw */ - var68.i = var67.i >> 8; - /* 12: addssw */ - var69.i = ORC_CLAMP_SW (var64.i + var68.i); - /* 13: addssw */ - var70.i = ORC_CLAMP_SW (var69.i + var66.i); - /* 15: mullw */ - var71.i = (var66.i * var51.i) & 0xffff; - /* 16: shrsw */ - var72.i = var71.i >> 8; - /* 17: subssw */ - var73.i = ORC_CLAMP_SW (var70.i - var72.i); - /* 18: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var66.i); - /* 19: addssw */ - var75.i = ORC_CLAMP_SW (var69.i + var65.i); - /* 20: addssw */ - var76.i = ORC_CLAMP_SW (var75.i + var65.i); - /* 22: mullw */ - var77.i = (var65.i * var52.i) & 0xffff; - /* 23: shrsw */ - var78.i = var77.i >> 8; - /* 24: addssw */ - var79.i = ORC_CLAMP_SW (var76.i + var78.i); - /* 26: mullw */ - var80.i = (var65.i * var53.i) & 0xffff; - /* 27: shrsw */ - var81.i = var80.i >> 8; - /* 28: subssw */ - var82.i = ORC_CLAMP_SW (var69.i - var81.i); - /* 30: mullw */ - var83.i = (var66.i * var54.i) & 0xffff; - /* 31: shrsw */ - var84.i = var83.i >> 8; - /* 32: subssw */ - var85.i = ORC_CLAMP_SW (var82.i - var84.i); - /* 33: subssw */ - var86.i = ORC_CLAMP_SW (var85.i - var84.i); - /* 34: convssswb */ - var87 = ORC_CLAMP_SB (var74.i); - /* 35: convssswb */ - var88 = ORC_CLAMP_SB (var86.i); - /* 36: convssswb */ - var89 = ORC_CLAMP_SB (var79.i); - /* 37: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var88; - var90.i = _dest.i; - } - /* 38: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var89; - _dest.x2[1] = var61; - var91.i = _dest.i; - } - /* 39: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var90.i; - _dest.x2[1] = var91.i; - var92.i = _dest.i; - } - /* 41: addb */ - var56.x4[0] = var92.x4[0] + var55.x4[0]; - var56.x4[1] = var92.x4[1] + var55.x4[1]; - var56.x4[2] = var92.x4[2] + var55.x4[2]; - var56.x4[3] = var92.x4[3] + var55.x4[3]; - /* 42: storel */ - ptr0[i] = var56; - } - } - -} - -void -cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride, - const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_2d (p); - orc_program_set_name (p, "cogorc_convert_AYUV_RGBA"); - orc_program_set_backup_function (p, _backup_cogorc_convert_AYUV_RGBA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 4, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 2, "t10"); - orc_program_add_temporary (p, 2, "t11"); - orc_program_add_temporary (p, 2, "t12"); - orc_program_add_temporary (p, 1, "t13"); - orc_program_add_temporary (p, 1, "t14"); - orc_program_add_temporary (p, 1, "t15"); - orc_program_add_temporary (p, 4, "t16"); - - orc_program_append_2 (p, "subb", 2, 47, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T1, ORC_VAR_T2, 47, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T7, ORC_VAR_T9, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T9, ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T8, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T12, ORC_VAR_T12, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T11, ORC_VAR_T11, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T14, ORC_VAR_T11, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T15, ORC_VAR_T12, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T13, - ORC_VAR_T14, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T15, - ORC_VAR_T3, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, 47, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, 47, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ORC_EXECUTOR_M (ex) = m; - ex->arrays[ORC_VAR_D1] = d1; - ex->params[ORC_VAR_D1] = d1_stride; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->params[ORC_VAR_S1] = s1_stride; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_I420_BGRA */ -#ifdef DISABLE_ORC -void -cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_int8 var54; - orc_union32 var55; - orc_union32 var56; - orc_int8 var57; - orc_union16 var58; - orc_int8 var59; - orc_int8 var60; - orc_union16 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_int8 var85; - orc_int8 var86; - orc_int8 var87; - orc_union16 var88; - orc_union16 var89; - orc_union32 var90; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 1: loadpb */ - var46 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 5: loadpb */ - var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpb */ - var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 12: loadpw */ - var49.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 17: loadpw */ - var50.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 24: loadpw */ - var51.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 28: loadpw */ - var52.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 32: loadpw */ - var53.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 41: loadpb */ - var54 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 44: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var45 = ptr4[i]; - /* 2: subb */ - var57 = var45 - var46; - /* 3: convsbw */ - var58.i = var57; - /* 4: loadupib */ - var59 = - (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] + - 1) >> 1 : ptr5[i >> 1]; - /* 6: subb */ - var60 = var59 - var47; - /* 7: convsbw */ - var61.i = var60; - /* 8: loadupib */ - var62 = - (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] + - 1) >> 1 : ptr6[i >> 1]; - /* 10: subb */ - var63 = var62 - var48; - /* 11: convsbw */ - var64.i = var63; - /* 13: mullw */ - var65.i = (var58.i * var49.i) & 0xffff; - /* 14: shrsw */ - var66.i = var65.i >> 8; - /* 15: addssw */ - var67.i = ORC_CLAMP_SW (var58.i + var66.i); - /* 16: addssw */ - var68.i = ORC_CLAMP_SW (var67.i + var64.i); - /* 18: mullw */ - var69.i = (var64.i * var50.i) & 0xffff; - /* 19: shrsw */ - var70.i = var69.i >> 8; - /* 20: subssw */ - var71.i = ORC_CLAMP_SW (var68.i - var70.i); - /* 21: addssw */ - var72.i = ORC_CLAMP_SW (var71.i + var64.i); - /* 22: addssw */ - var73.i = ORC_CLAMP_SW (var67.i + var61.i); - /* 23: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var61.i); - /* 25: mullw */ - var75.i = (var61.i * var51.i) & 0xffff; - /* 26: shrsw */ - var76.i = var75.i >> 8; - /* 27: addssw */ - var77.i = ORC_CLAMP_SW (var74.i + var76.i); - /* 29: mullw */ - var78.i = (var61.i * var52.i) & 0xffff; - /* 30: shrsw */ - var79.i = var78.i >> 8; - /* 31: subssw */ - var80.i = ORC_CLAMP_SW (var67.i - var79.i); - /* 33: mullw */ - var81.i = (var64.i * var53.i) & 0xffff; - /* 34: shrsw */ - var82.i = var81.i >> 8; - /* 35: subssw */ - var83.i = ORC_CLAMP_SW (var80.i - var82.i); - /* 36: subssw */ - var84.i = ORC_CLAMP_SW (var83.i - var82.i); - /* 37: convssswb */ - var85 = ORC_CLAMP_SB (var72.i); - /* 38: convssswb */ - var86 = ORC_CLAMP_SB (var84.i); - /* 39: convssswb */ - var87 = ORC_CLAMP_SB (var77.i); - /* 40: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var86; - var88.i = _dest.i; - } - /* 42: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var85; - _dest.x2[1] = var54; - var89.i = _dest.i; - } - /* 43: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var88.i; - _dest.x2[1] = var89.i; - var90.i = _dest.i; - } - /* 45: addb */ - var56.x4[0] = var90.x4[0] + var55.x4[0]; - var56.x4[1] = var90.x4[1] + var55.x4[1]; - var56.x4[2] = var90.x4[2] + var55.x4[2]; - var56.x4[3] = var90.x4[3] + var55.x4[3]; - /* 46: storel */ - ptr0[i] = var56; - } - -} - -#else -static void -_backup_cogorc_convert_I420_BGRA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_union16 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_int8 var54; - orc_union32 var55; - orc_union32 var56; - orc_int8 var57; - orc_union16 var58; - orc_int8 var59; - orc_int8 var60; - orc_union16 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_union16 var65; - orc_union16 var66; - orc_union16 var67; - orc_union16 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_int8 var85; - orc_int8 var86; - orc_int8 var87; - orc_union16 var88; - orc_union16 var89; - orc_union32 var90; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 1: loadpb */ - var46 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 5: loadpb */ - var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 9: loadpb */ - var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 12: loadpw */ - var49.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 17: loadpw */ - var50.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 24: loadpw */ - var51.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 28: loadpw */ - var52.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 32: loadpw */ - var53.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 41: loadpb */ - var54 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 44: loadpb */ - var55.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var55.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var45 = ptr4[i]; - /* 2: subb */ - var57 = var45 - var46; - /* 3: convsbw */ - var58.i = var57; - /* 4: loadupib */ - var59 = - (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] + - 1) >> 1 : ptr5[i >> 1]; - /* 6: subb */ - var60 = var59 - var47; - /* 7: convsbw */ - var61.i = var60; - /* 8: loadupib */ - var62 = - (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] + - 1) >> 1 : ptr6[i >> 1]; - /* 10: subb */ - var63 = var62 - var48; - /* 11: convsbw */ - var64.i = var63; - /* 13: mullw */ - var65.i = (var58.i * var49.i) & 0xffff; - /* 14: shrsw */ - var66.i = var65.i >> 8; - /* 15: addssw */ - var67.i = ORC_CLAMP_SW (var58.i + var66.i); - /* 16: addssw */ - var68.i = ORC_CLAMP_SW (var67.i + var64.i); - /* 18: mullw */ - var69.i = (var64.i * var50.i) & 0xffff; - /* 19: shrsw */ - var70.i = var69.i >> 8; - /* 20: subssw */ - var71.i = ORC_CLAMP_SW (var68.i - var70.i); - /* 21: addssw */ - var72.i = ORC_CLAMP_SW (var71.i + var64.i); - /* 22: addssw */ - var73.i = ORC_CLAMP_SW (var67.i + var61.i); - /* 23: addssw */ - var74.i = ORC_CLAMP_SW (var73.i + var61.i); - /* 25: mullw */ - var75.i = (var61.i * var51.i) & 0xffff; - /* 26: shrsw */ - var76.i = var75.i >> 8; - /* 27: addssw */ - var77.i = ORC_CLAMP_SW (var74.i + var76.i); - /* 29: mullw */ - var78.i = (var61.i * var52.i) & 0xffff; - /* 30: shrsw */ - var79.i = var78.i >> 8; - /* 31: subssw */ - var80.i = ORC_CLAMP_SW (var67.i - var79.i); - /* 33: mullw */ - var81.i = (var64.i * var53.i) & 0xffff; - /* 34: shrsw */ - var82.i = var81.i >> 8; - /* 35: subssw */ - var83.i = ORC_CLAMP_SW (var80.i - var82.i); - /* 36: subssw */ - var84.i = ORC_CLAMP_SW (var83.i - var82.i); - /* 37: convssswb */ - var85 = ORC_CLAMP_SB (var72.i); - /* 38: convssswb */ - var86 = ORC_CLAMP_SB (var84.i); - /* 39: convssswb */ - var87 = ORC_CLAMP_SB (var77.i); - /* 40: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var87; - _dest.x2[1] = var86; - var88.i = _dest.i; - } - /* 42: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var85; - _dest.x2[1] = var54; - var89.i = _dest.i; - } - /* 43: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var88.i; - _dest.x2[1] = var89.i; - var90.i = _dest.i; - } - /* 45: addb */ - var56.x4[0] = var90.x4[0] + var55.x4[0]; - var56.x4[1] = var90.x4[1] + var55.x4[1]; - var56.x4[2] = var90.x4[2] + var55.x4[2]; - var56.x4[3] = var90.x4[3] + var55.x4[3]; - /* 46: storel */ - ptr0[i] = var56; - } - -} - -void -cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_I420_BGRA"); - orc_program_set_backup_function (p, _backup_cogorc_convert_I420_BGRA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 1, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_constant (p, 4, 0x000000ff, "c8"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 1, "t10"); - orc_program_add_temporary (p, 1, "t11"); - orc_program_add_temporary (p, 1, "t12"); - orc_program_add_temporary (p, 4, "t13"); - - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T9, ORC_VAR_T4, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T10, ORC_VAR_T7, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T11, ORC_VAR_T8, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T12, ORC_VAR_T9, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T12, - ORC_VAR_T11, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T10, - ORC_VAR_C8, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T13, ORC_VAR_T1, - ORC_VAR_T2, ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T13, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_convert_I420_BGRA_avg */ -#ifdef DISABLE_ORC -void -cogorc_convert_I420_BGRA_avg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, - const guint8 * ORC_RESTRICT s5, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - const orc_int8 *ORC_RESTRICT ptr8; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_int8 var55; - orc_union32 var56; - orc_union32 var57; - orc_int8 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_int8 var65; - orc_int8 var66; - orc_int8 var67; - orc_int8 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_union16 var87; - orc_union16 var88; - orc_union16 var89; - orc_int8 var90; - orc_int8 var91; - orc_int8 var92; - orc_union16 var93; - orc_union16 var94; - orc_union32 var95; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - ptr8 = (orc_int8 *) s5; - - /* 1: loadpb */ - var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 7: loadpb */ - var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 13: loadpb */ - var49 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 16: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 21: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 28: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 32: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 36: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 45: loadpb */ - var55 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 48: loadpb */ - var56.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var46 = ptr4[i]; - /* 2: subb */ - var58 = var46 - var47; - /* 3: convsbw */ - var59.i = var58; - /* 4: loadupib */ - var60 = - (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] + - 1) >> 1 : ptr5[i >> 1]; - /* 5: loadupib */ - var61 = - (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] + - 1) >> 1 : ptr6[i >> 1]; - /* 6: avgub */ - var62 = ((orc_uint8) var60 + (orc_uint8) var61 + 1) >> 1; - /* 8: subb */ - var63 = var62 - var48; - /* 9: convsbw */ - var64.i = var63; - /* 10: loadupib */ - var65 = - (i & 1) ? ((orc_uint8) ptr7[i >> 1] + (orc_uint8) ptr7[(i >> 1) + 1] + - 1) >> 1 : ptr7[i >> 1]; - /* 11: loadupib */ - var66 = - (i & 1) ? ((orc_uint8) ptr8[i >> 1] + (orc_uint8) ptr8[(i >> 1) + 1] + - 1) >> 1 : ptr8[i >> 1]; - /* 12: avgub */ - var67 = ((orc_uint8) var65 + (orc_uint8) var66 + 1) >> 1; - /* 14: subb */ - var68 = var67 - var49; - /* 15: convsbw */ - var69.i = var68; - /* 17: mullw */ - var70.i = (var59.i * var50.i) & 0xffff; - /* 18: shrsw */ - var71.i = var70.i >> 8; - /* 19: addssw */ - var72.i = ORC_CLAMP_SW (var59.i + var71.i); - /* 20: addssw */ - var73.i = ORC_CLAMP_SW (var72.i + var69.i); - /* 22: mullw */ - var74.i = (var69.i * var51.i) & 0xffff; - /* 23: shrsw */ - var75.i = var74.i >> 8; - /* 24: subssw */ - var76.i = ORC_CLAMP_SW (var73.i - var75.i); - /* 25: addssw */ - var77.i = ORC_CLAMP_SW (var76.i + var69.i); - /* 26: addssw */ - var78.i = ORC_CLAMP_SW (var72.i + var64.i); - /* 27: addssw */ - var79.i = ORC_CLAMP_SW (var78.i + var64.i); - /* 29: mullw */ - var80.i = (var64.i * var52.i) & 0xffff; - /* 30: shrsw */ - var81.i = var80.i >> 8; - /* 31: addssw */ - var82.i = ORC_CLAMP_SW (var79.i + var81.i); - /* 33: mullw */ - var83.i = (var64.i * var53.i) & 0xffff; - /* 34: shrsw */ - var84.i = var83.i >> 8; - /* 35: subssw */ - var85.i = ORC_CLAMP_SW (var72.i - var84.i); - /* 37: mullw */ - var86.i = (var69.i * var54.i) & 0xffff; - /* 38: shrsw */ - var87.i = var86.i >> 8; - /* 39: subssw */ - var88.i = ORC_CLAMP_SW (var85.i - var87.i); - /* 40: subssw */ - var89.i = ORC_CLAMP_SW (var88.i - var87.i); - /* 41: convssswb */ - var90 = ORC_CLAMP_SB (var77.i); - /* 42: convssswb */ - var91 = ORC_CLAMP_SB (var89.i); - /* 43: convssswb */ - var92 = ORC_CLAMP_SB (var82.i); - /* 44: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var92; - _dest.x2[1] = var91; - var93.i = _dest.i; - } - /* 46: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var90; - _dest.x2[1] = var55; - var94.i = _dest.i; - } - /* 47: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var93.i; - _dest.x2[1] = var94.i; - var95.i = _dest.i; - } - /* 49: addb */ - var57.x4[0] = var95.x4[0] + var56.x4[0]; - var57.x4[1] = var95.x4[1] + var56.x4[1]; - var57.x4[2] = var95.x4[2] + var56.x4[2]; - var57.x4[3] = var95.x4[3] + var56.x4[3]; - /* 50: storel */ - ptr0[i] = var57; - } - -} - -#else -static void -_backup_cogorc_convert_I420_BGRA_avg (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - const orc_int8 *ORC_RESTRICT ptr8; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - orc_union16 var50; - orc_union16 var51; - orc_union16 var52; - orc_union16 var53; - orc_union16 var54; - orc_int8 var55; - orc_union32 var56; - orc_union32 var57; - orc_int8 var58; - orc_union16 var59; - orc_int8 var60; - orc_int8 var61; - orc_int8 var62; - orc_int8 var63; - orc_union16 var64; - orc_int8 var65; - orc_int8 var66; - orc_int8 var67; - orc_int8 var68; - orc_union16 var69; - orc_union16 var70; - orc_union16 var71; - orc_union16 var72; - orc_union16 var73; - orc_union16 var74; - orc_union16 var75; - orc_union16 var76; - orc_union16 var77; - orc_union16 var78; - orc_union16 var79; - orc_union16 var80; - orc_union16 var81; - orc_union16 var82; - orc_union16 var83; - orc_union16 var84; - orc_union16 var85; - orc_union16 var86; - orc_union16 var87; - orc_union16 var88; - orc_union16 var89; - orc_int8 var90; - orc_int8 var91; - orc_int8 var92; - orc_union16 var93; - orc_union16 var94; - orc_union32 var95; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - ptr8 = (orc_int8 *) ex->arrays[8]; - - /* 1: loadpb */ - var47 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 7: loadpb */ - var48 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 13: loadpb */ - var49 = (int) 0x00000080; /* 128 or 6.32404e-322f */ - /* 16: loadpw */ - var50.i = (int) 0x0000002a; /* 42 or 2.07508e-322f */ - /* 21: loadpw */ - var51.i = (int) 0x00000067; /* 103 or 5.08888e-322f */ - /* 28: loadpw */ - var52.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ - /* 32: loadpw */ - var53.i = (int) 0x00000064; /* 100 or 4.94066e-322f */ - /* 36: loadpw */ - var54.i = (int) 0x00000068; /* 104 or 5.13828e-322f */ - /* 45: loadpb */ - var55 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 48: loadpb */ - var56.x4[0] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[1] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[2] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - var56.x4[3] = (int) 0x00000080; /* 128 or 6.32404e-322f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var46 = ptr4[i]; - /* 2: subb */ - var58 = var46 - var47; - /* 3: convsbw */ - var59.i = var58; - /* 4: loadupib */ - var60 = - (i & 1) ? ((orc_uint8) ptr5[i >> 1] + (orc_uint8) ptr5[(i >> 1) + 1] + - 1) >> 1 : ptr5[i >> 1]; - /* 5: loadupib */ - var61 = - (i & 1) ? ((orc_uint8) ptr6[i >> 1] + (orc_uint8) ptr6[(i >> 1) + 1] + - 1) >> 1 : ptr6[i >> 1]; - /* 6: avgub */ - var62 = ((orc_uint8) var60 + (orc_uint8) var61 + 1) >> 1; - /* 8: subb */ - var63 = var62 - var48; - /* 9: convsbw */ - var64.i = var63; - /* 10: loadupib */ - var65 = - (i & 1) ? ((orc_uint8) ptr7[i >> 1] + (orc_uint8) ptr7[(i >> 1) + 1] + - 1) >> 1 : ptr7[i >> 1]; - /* 11: loadupib */ - var66 = - (i & 1) ? ((orc_uint8) ptr8[i >> 1] + (orc_uint8) ptr8[(i >> 1) + 1] + - 1) >> 1 : ptr8[i >> 1]; - /* 12: avgub */ - var67 = ((orc_uint8) var65 + (orc_uint8) var66 + 1) >> 1; - /* 14: subb */ - var68 = var67 - var49; - /* 15: convsbw */ - var69.i = var68; - /* 17: mullw */ - var70.i = (var59.i * var50.i) & 0xffff; - /* 18: shrsw */ - var71.i = var70.i >> 8; - /* 19: addssw */ - var72.i = ORC_CLAMP_SW (var59.i + var71.i); - /* 20: addssw */ - var73.i = ORC_CLAMP_SW (var72.i + var69.i); - /* 22: mullw */ - var74.i = (var69.i * var51.i) & 0xffff; - /* 23: shrsw */ - var75.i = var74.i >> 8; - /* 24: subssw */ - var76.i = ORC_CLAMP_SW (var73.i - var75.i); - /* 25: addssw */ - var77.i = ORC_CLAMP_SW (var76.i + var69.i); - /* 26: addssw */ - var78.i = ORC_CLAMP_SW (var72.i + var64.i); - /* 27: addssw */ - var79.i = ORC_CLAMP_SW (var78.i + var64.i); - /* 29: mullw */ - var80.i = (var64.i * var52.i) & 0xffff; - /* 30: shrsw */ - var81.i = var80.i >> 8; - /* 31: addssw */ - var82.i = ORC_CLAMP_SW (var79.i + var81.i); - /* 33: mullw */ - var83.i = (var64.i * var53.i) & 0xffff; - /* 34: shrsw */ - var84.i = var83.i >> 8; - /* 35: subssw */ - var85.i = ORC_CLAMP_SW (var72.i - var84.i); - /* 37: mullw */ - var86.i = (var69.i * var54.i) & 0xffff; - /* 38: shrsw */ - var87.i = var86.i >> 8; - /* 39: subssw */ - var88.i = ORC_CLAMP_SW (var85.i - var87.i); - /* 40: subssw */ - var89.i = ORC_CLAMP_SW (var88.i - var87.i); - /* 41: convssswb */ - var90 = ORC_CLAMP_SB (var77.i); - /* 42: convssswb */ - var91 = ORC_CLAMP_SB (var89.i); - /* 43: convssswb */ - var92 = ORC_CLAMP_SB (var82.i); - /* 44: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var92; - _dest.x2[1] = var91; - var93.i = _dest.i; - } - /* 46: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var90; - _dest.x2[1] = var55; - var94.i = _dest.i; - } - /* 47: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var93.i; - _dest.x2[1] = var94.i; - var95.i = _dest.i; - } - /* 49: addb */ - var57.x4[0] = var95.x4[0] + var56.x4[0]; - var57.x4[1] = var95.x4[1] + var56.x4[1]; - var57.x4[2] = var95.x4[2] + var56.x4[2]; - var57.x4[3] = var95.x4[3] + var56.x4[3]; - /* 50: storel */ - ptr0[i] = var57; - } - -} - -void -cogorc_convert_I420_BGRA_avg (guint8 * ORC_RESTRICT d1, - const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, - const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, - const guint8 * ORC_RESTRICT s5, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_convert_I420_BGRA_avg"); - orc_program_set_backup_function (p, _backup_cogorc_convert_I420_BGRA_avg); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_source (p, 1, "s5"); - orc_program_add_constant (p, 1, 0x00000008, "c1"); - orc_program_add_constant (p, 1, 0x00000080, "c2"); - orc_program_add_constant (p, 4, 0x0000002a, "c3"); - orc_program_add_constant (p, 4, 0x00000067, "c4"); - orc_program_add_constant (p, 4, 0x00000004, "c5"); - orc_program_add_constant (p, 4, 0x00000064, "c6"); - orc_program_add_constant (p, 4, 0x00000068, "c7"); - orc_program_add_constant (p, 4, 0x000000ff, "c8"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - orc_program_add_temporary (p, 2, "t9"); - orc_program_add_temporary (p, 2, "t10"); - orc_program_add_temporary (p, 1, "t11"); - orc_program_add_temporary (p, 1, "t12"); - orc_program_add_temporary (p, 1, "t13"); - orc_program_add_temporary (p, 4, "t14"); - - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T4, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T6, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T3, ORC_VAR_S4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupib", 0, ORC_VAR_T4, ORC_VAR_S5, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "subb", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, - ORC_VAR_D1); - orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_C3, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_T7, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C4, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T7, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T6, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C5, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "addssw", 0, ORC_VAR_T10, ORC_VAR_T10, - ORC_VAR_T1, ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_C6, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T9, ORC_VAR_T5, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mullw", 0, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_C7, - ORC_VAR_D1); - orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "subssw", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T11, ORC_VAR_T8, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T12, ORC_VAR_T9, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T13, ORC_VAR_T10, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T13, - ORC_VAR_T12, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_T11, - ORC_VAR_C8, ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T14, ORC_VAR_T1, - ORC_VAR_T2, ORC_VAR_D1); - orc_program_append_2 (p, "addb", 2, ORC_VAR_D1, ORC_VAR_T14, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - ex->arrays[ORC_VAR_S5] = (void *) s5; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_I420 */ -#ifdef DISABLE_ORC -void -cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var39 = ptr5[i >> 1]; - /* 1: loadupdb */ - var40 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var41.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var42.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var41.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_I420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var39 = ptr5[i >> 1]; - /* 1: loadupdb */ - var40 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var41.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var42.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var41.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_I420"); - orc_program_set_backup_function (p, _backup_cogorc_getline_I420); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_YUV9 */ -#ifdef DISABLE_ORC -void -cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_union16 var38; - orc_union64 var39; - orc_int8 var40; - orc_int8 var41; - orc_union16 var42; - orc_union32 var43; - orc_union32 var44; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 4: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var40 = ptr5[i >> 1]; - /* 1: loadupdb */ - var41 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var40; - _dest.x2[1] = var41; - var42.i = _dest.i; - } - /* 3: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var42.i; - var43.i = _dest.i; - } - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var38.x2[0]; - var44.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var38.x2[1]; - var44.x2[1] = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var39.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var39; - } - -} - -#else -static void -_backup_cogorc_getline_YUV9 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_union16 var37; - orc_union16 var38; - orc_union64 var39; - orc_int8 var40; - orc_int8 var41; - orc_union16 var42; - orc_union32 var43; - orc_union32 var44; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 4: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var40 = ptr5[i >> 1]; - /* 1: loadupdb */ - var41 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var40; - _dest.x2[1] = var41; - var42.i = _dest.i; - } - /* 3: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var42.i; - var43.i = _dest.i; - } - /* 5: loadw */ - var38 = ptr4[i]; - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var38.x2[0]; - var44.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var38.x2[1]; - var44.x2[1] = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var39.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var39.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var39; - } - -} - -void -cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_YUV9"); - orc_program_set_backup_function (p, _backup_cogorc_getline_YUV9); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 1, "t5"); - - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T5, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union32 *) s1; - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_getline_YUY2); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 2, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union32 *) s1; - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var40.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union32 var41; - orc_union32 var42; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - /* 2: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var39.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var39.x2[1]; - var41.x2[1] = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var40.i; - var42.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var42.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var42.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storeq */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_getline_UYVY); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 2, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_YVYU */ -#ifdef DISABLE_ORC -void -cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union32 *) s1; - - /* 3: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: swapw */ - var41.i = ORC_SWAP_W (var39.i); - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var42.x2[1] = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_YVYU (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - /* 3: loadpb */ - var37.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var37.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var36 = ptr4[i]; - /* 1: splitwb */ - { - orc_union16 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: swapw */ - var41.i = ORC_SWAP_W (var39.i); - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[0]; - _dest.x2[1] = var40.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var37.x2[1]; - _dest.x2[1] = var40.x2[1]; - var42.x2[1] = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_YVYU"); - orc_program_set_backup_function (p, _backup_cogorc_getline_YVYU); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 2, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T3, ORC_VAR_C1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_Y42B */ -#ifdef DISABLE_ORC -void -cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_union64 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 3: loadpb */ - var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr5[i]; - /* 1: loadb */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var41.i = _dest.i; - } - /* 4: loadw */ - var39 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var39.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var39.x2[1]; - var42.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var40.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var40; - } - -} - -#else -static void -_backup_cogorc_getline_Y42B (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - orc_union64 var40; - orc_union16 var41; - orc_union32 var42; - orc_union32 var43; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 3: loadpb */ - var38.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var38.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var36 = ptr5[i]; - /* 1: loadb */ - var37 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var41.i = _dest.i; - } - /* 4: loadw */ - var39 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[0]; - _dest.x2[1] = var39.x2[0]; - var42.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var38.x2[1]; - _dest.x2[1] = var39.x2[1]; - var42.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.i; - _dest.x2[1] = var41.i; - var43.i = _dest.i; - } - /* 7: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[0]; - _dest.x2[1] = var43.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var42.x2[1]; - _dest.x2[1] = var43.x2[1]; - var40.x2[1] = _dest.i; - } - /* 8: storeq */ - ptr0[i] = var40; - } - -} - -void -cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_Y42B"); - orc_program_set_backup_function (p, _backup_cogorc_getline_Y42B); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 4, "t3"); - orc_program_add_temporary (p, 4, "t4"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T4, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T3, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_Y444 */ -#ifdef DISABLE_ORC -void -cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr5[i]; - /* 1: loadb */ - var35 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var39.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_Y444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - orc_int8 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_union16 var39; - orc_union16 var40; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - - /* 3: loadpb */ - var36 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadb */ - var34 = ptr5[i]; - /* 1: loadb */ - var35 = ptr6[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var34; - _dest.x2[1] = var35; - var39.i = _dest.i; - } - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var40.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.i; - _dest.x2[1] = var39.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_Y444"); - orc_program_set_backup_function (p, _backup_cogorc_getline_Y444); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_S3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_Y800 */ -#ifdef DISABLE_ORC -void -cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - - /* 0: loadpb */ - var33 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 3: loadpw */ - var35.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */ - - for (i = 0; i < n; i++) { - /* 1: loadb */ - var34 = ptr4[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var37.i; - _dest.x2[1] = var35.i; - var36.i = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - -} - -#else -static void -_backup_cogorc_getline_Y800 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - orc_int8 var33; - orc_int8 var34; - orc_union16 var35; - orc_union32 var36; - orc_union16 var37; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - - /* 0: loadpb */ - var33 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 3: loadpw */ - var35.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */ - - for (i = 0; i < n; i++) { - /* 1: loadb */ - var34 = ptr4[i]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var33; - _dest.x2[1] = var34; - var37.i = _dest.i; - } - /* 4: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var37.i; - _dest.x2[1] = var35.i; - var36.i = _dest.i; - } - /* 5: storel */ - ptr0[i] = var36; - } - -} - -void -cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_Y800"); - orc_program_set_backup_function (p, _backup_cogorc_getline_Y800); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_constant (p, 2, 0x00008080, "c2"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_Y16 */ -#ifdef DISABLE_ORC -void -cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var34; - orc_int8 var35; - orc_union16 var36; - orc_union32 var37; - orc_int8 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union16 *) s1; - - /* 2: loadpb */ - var35 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 4: loadpw */ - var36.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr4[i]; - /* 1: convhwb */ - var38 = ((orc_uint16) var34.i) >> 8; - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35; - _dest.x2[1] = var38; - var39.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var36.i; - var37.i = _dest.i; - } - /* 6: storel */ - ptr0[i] = var37; - } - -} - -#else -static void -_backup_cogorc_getline_Y16 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - orc_union16 var34; - orc_int8 var35; - orc_union16 var36; - orc_union32 var37; - orc_int8 var38; - orc_union16 var39; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - - /* 2: loadpb */ - var35 = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - /* 4: loadpw */ - var36.i = (int) 0x00008080; /* 32896 or 1.62528e-319f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr4[i]; - /* 1: convhwb */ - var38 = ((orc_uint16) var34.i) >> 8; - /* 3: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var35; - _dest.x2[1] = var38; - var39.i = _dest.i; - } - /* 5: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var36.i; - var37.i = _dest.i; - } - /* 6: storel */ - ptr0[i] = var37; - } - -} - -void -cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_Y16"); - orc_program_set_backup_function (p, _backup_cogorc_getline_Y16); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_constant (p, 2, 0x00008080, "c2"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - - orc_program_append_2 (p, "convhwb", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_BGRA */ -#ifdef DISABLE_ORC -void -cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapl */ - var33.i = ORC_SWAP_L (var32.i); - /* 2: storel */ - ptr0[i] = var33; - } - -} - -#else -static void -_backup_cogorc_getline_BGRA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapl */ - var33.i = ORC_SWAP_L (var32.i); - /* 2: storel */ - ptr0[i] = var33; - } - -} - -void -cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_BGRA"); - orc_program_set_backup_function (p, _backup_cogorc_getline_BGRA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - - orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_ABGR */ -#ifdef DISABLE_ORC -void -cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var47; - _dest.x2[1] = var44; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var45; - _dest.x2[1] = var46; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_cogorc_getline_ABGR (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var47; - _dest.x2[1] = var44; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var45; - _dest.x2[1] = var46; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -void -cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_ABGR"); - orc_program_set_backup_function (p, _backup_cogorc_getline_ABGR); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T8, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_RGBA */ -#ifdef DISABLE_ORC -void -cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var46; - _dest.x2[1] = var45; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44; - _dest.x2[1] = var47; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_cogorc_getline_RGBA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var46; - _dest.x2[1] = var45; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44; - _dest.x2[1] = var47; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -void -cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_RGBA"); - orc_program_set_backup_function (p, _backup_cogorc_getline_RGBA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T1, ORC_VAR_T4, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T8, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T7, ORC_VAR_T8, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_NV12 */ -#ifdef DISABLE_ORC -void -cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var34; - orc_union16 var35; - orc_union16 var36; - orc_union16 var37; - orc_union64 var38; - orc_union32 var39; - orc_union32 var40; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - - /* 3: loadpb */ - var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr5[i]; - /* 1: loadw */ - var35 = ptr5[i]; - /* 2: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var34.i; - _dest.x2[1] = var35.i; - var39.i = _dest.i; - } - /* 4: loadw */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.x2[0]; - _dest.x2[1] = var39.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var40.x2[1]; - _dest.x2[1] = var39.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_NV12 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var34; - orc_union16 var35; - orc_union16 var36; - orc_union16 var37; - orc_union64 var38; - orc_union32 var39; - orc_union32 var40; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - - /* 3: loadpb */ - var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var34 = ptr5[i]; - /* 1: loadw */ - var35 = ptr5[i]; - /* 2: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var34.i; - _dest.x2[1] = var35.i; - var39.i = _dest.i; - } - /* 4: loadw */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var40.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var40.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var40.x2[0]; - _dest.x2[1] = var39.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var40.x2[1]; - _dest.x2[1] = var39.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_NV12"); - orc_program_set_backup_function (p, _backup_cogorc_getline_NV12); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_S2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_NV21 */ -#ifdef DISABLE_ORC -void -cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n) -{ - int i; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var35; - orc_union16 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - - ptr0 = (orc_union64 *) d1; - ptr4 = (orc_union16 *) s1; - ptr5 = (orc_union16 *) s2; - - /* 3: loadpb */ - var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var35 = ptr5[i]; - /* 1: swapw */ - var39.i = ORC_SWAP_W (var35.i); - /* 2: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var40.i = _dest.i; - } - /* 4: loadw */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var41.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var40.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var40.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_NV21 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union64 *ORC_RESTRICT ptr0; - const orc_union16 *ORC_RESTRICT ptr4; - const orc_union16 *ORC_RESTRICT ptr5; - orc_union16 var35; - orc_union16 var36; - orc_union16 var37; - orc_union64 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - - ptr0 = (orc_union64 *) ex->arrays[0]; - ptr4 = (orc_union16 *) ex->arrays[4]; - ptr5 = (orc_union16 *) ex->arrays[5]; - - /* 3: loadpb */ - var36.x2[0] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - var36.x2[1] = (int) 0x000000ff; /* 255 or 1.25987e-321f */ - - for (i = 0; i < n; i++) { - /* 0: loadw */ - var35 = ptr5[i]; - /* 1: swapw */ - var39.i = ORC_SWAP_W (var35.i); - /* 2: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var39.i; - _dest.x2[1] = var39.i; - var40.i = _dest.i; - } - /* 4: loadw */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[0]; - _dest.x2[1] = var37.x2[0]; - var41.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var36.x2[1]; - _dest.x2[1] = var37.x2[1]; - var41.x2[1] = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[0]; - _dest.x2[1] = var40.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union32 _dest; - _dest.x2[0] = var41.x2[1]; - _dest.x2[1] = var40.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storeq */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_NV21"); - orc_program_set_backup_function (p, _backup_cogorc_getline_NV21); - orc_program_add_destination (p, 8, "d1"); - orc_program_add_source (p, 2, "s1"); - orc_program_add_source (p, 2, "s2"); - orc_program_add_constant (p, 1, 0x000000ff, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 4, "t3"); - - orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_getline_A420 */ -#ifdef DISABLE_ORC -void -cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, - const guint8 * ORC_RESTRICT s4, int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_int8 *) s1; - ptr5 = (orc_int8 *) s2; - ptr6 = (orc_int8 *) s3; - ptr7 = (orc_int8 *) s4; - - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var39 = ptr5[i >> 1]; - /* 1: loadupdb */ - var40 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var41.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr7[i]; - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var42.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var41.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_getline_A420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_int8 *ORC_RESTRICT ptr4; - const orc_int8 *ORC_RESTRICT ptr5; - const orc_int8 *ORC_RESTRICT ptr6; - const orc_int8 *ORC_RESTRICT ptr7; - orc_int8 var36; - orc_int8 var37; - orc_union32 var38; - orc_int8 var39; - orc_int8 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_int8 *) ex->arrays[4]; - ptr5 = (orc_int8 *) ex->arrays[5]; - ptr6 = (orc_int8 *) ex->arrays[6]; - ptr7 = (orc_int8 *) ex->arrays[7]; - - - for (i = 0; i < n; i++) { - /* 0: loadupdb */ - var39 = ptr5[i >> 1]; - /* 1: loadupdb */ - var40 = ptr6[i >> 1]; - /* 2: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var39; - _dest.x2[1] = var40; - var41.i = _dest.i; - } - /* 3: loadb */ - var36 = ptr7[i]; - /* 4: loadb */ - var37 = ptr4[i]; - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var36; - _dest.x2[1] = var37; - var42.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var42.i; - _dest.x2[1] = var41.i; - var38.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, - const guint8 * ORC_RESTRICT s4, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_getline_A420"); - orc_program_set_backup_function (p, _backup_cogorc_getline_A420); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 1, "s1"); - orc_program_add_source (p, 1, "s2"); - orc_program_add_source (p, 1, "s3"); - orc_program_add_source (p, 1, "s4"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T3, ORC_VAR_S2, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "loadupdb", 0, ORC_VAR_T4, ORC_VAR_S3, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - ex->arrays[ORC_VAR_S2] = (void *) s2; - ex->arrays[ORC_VAR_S3] = (void *) s3; - ex->arrays[ORC_VAR_S4] = (void *) s4; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_I420 */ -#ifdef DISABLE_ORC -void -cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - orc_union32 var42; - orc_union32 var43; - orc_union16 var44; - orc_union16 var45; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_int8 *) d2; - ptr2 = (orc_int8 *) d3; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var38 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var38.x2[0]; - var42.x2[0] = _src.x2[1]; - var43.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var38.x2[1]; - var42.x2[1] = _src.x2[1]; - var43.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var43.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var43.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var39; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var42.x2[0]; - var44.x2[0] = _src.x2[1]; - var45.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var42.x2[1]; - var44.x2[1] = _src.x2[1]; - var45.x2[1] = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var45.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 6: avgub */ - var40 = ((orc_uint8) var46 + (orc_uint8) var47 + 1) >> 1; - /* 7: storeb */ - ptr1[i] = var40; - /* 8: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var48 = _src.x2[1]; - var49 = _src.x2[0]; - } - /* 9: avgub */ - var41 = ((orc_uint8) var48 + (orc_uint8) var49 + 1) >> 1; - /* 10: storeb */ - ptr2[i] = var41; - } - -} - -#else -static void -_backup_cogorc_putline_I420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var38; - orc_union16 var39; - orc_int8 var40; - orc_int8 var41; - orc_union32 var42; - orc_union32 var43; - orc_union16 var44; - orc_union16 var45; - orc_int8 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_int8 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var38 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var38.x2[0]; - var42.x2[0] = _src.x2[1]; - var43.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var38.x2[1]; - var42.x2[1] = _src.x2[1]; - var43.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var43.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var43.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var39; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var42.x2[0]; - var44.x2[0] = _src.x2[1]; - var45.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var42.x2[1]; - var44.x2[1] = _src.x2[1]; - var45.x2[1] = _src.x2[0]; - } - /* 5: splitwb */ - { - orc_union16 _src; - _src.i = var45.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 6: avgub */ - var40 = ((orc_uint8) var46 + (orc_uint8) var47 + 1) >> 1; - /* 7: storeb */ - ptr1[i] = var40; - /* 8: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var48 = _src.x2[1]; - var49 = _src.x2[0]; - } - /* 9: avgub */ - var41 = ((orc_uint8) var48 + (orc_uint8) var49 + 1) >> 1; - /* 10: storeb */ - ptr2[i] = var41; - } - -} - -void -cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_I420"); - orc_program_set_backup_function (p, _backup_cogorc_putline_I420); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D2, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_YUY2 */ -#ifdef DISABLE_ORC -void -cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_putline_YUY2 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var43.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var43.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_YUY2"); - orc_program_set_backup_function (p, _backup_cogorc_putline_YUY2); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 4, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_YVYU */ -#ifdef DISABLE_ORC -void -cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: swapw */ - var45.i = ORC_SWAP_W (var43.i); - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var45.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var45.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_putline_YVYU (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - orc_union16 var45; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: swapw */ - var45.i = ORC_SWAP_W (var43.i); - /* 6: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[0]; - _dest.x2[1] = var45.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var44.x2[1]; - _dest.x2[1] = var45.x2[1]; - var38.x2[1] = _dest.i; - } - /* 7: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_YVYU"); - orc_program_set_backup_function (p, _backup_cogorc_putline_YVYU); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 4, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "swapw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T2, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_UYVY */ -#ifdef DISABLE_ORC -void -cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var44.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var44.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - -} - -#else -static void -_backup_cogorc_putline_UYVY (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union32 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 3: avgub */ - var43.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var43.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 4: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var44.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var44.x2[1] = _src.x2[1]; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[0]; - _dest.x2[1] = var44.x2[0]; - var38.x2[0] = _dest.i; - } - { - orc_union16 _dest; - _dest.x2[0] = var43.x2[1]; - _dest.x2[1] = var44.x2[1]; - var38.x2[1] = _dest.i; - } - /* 6: storel */ - ptr0[i] = var38; - } - -} - -void -cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_UYVY"); - orc_program_set_backup_function (p, _backup_cogorc_putline_UYVY); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 4, "t4"); - orc_program_add_temporary (p, 4, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T5, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_Y42B */ -#ifdef DISABLE_ORC -void -cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_int8 *) d2; - ptr2 = (orc_int8 *) d3; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 3: avgub */ - var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 5: storeb */ - ptr2[i] = var37; - /* 6: storeb */ - ptr1[i] = var38; - /* 7: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 8: storew */ - ptr0[i] = var39; - } - -} - -#else -static void -_backup_cogorc_putline_Y42B (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_int8 var37; - orc_int8 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_int8 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 3: avgub */ - var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 4: splitwb */ - { - orc_union16 _src; - _src.i = var44.i; - var37 = _src.x2[1]; - var38 = _src.x2[0]; - } - /* 5: storeb */ - ptr2[i] = var37; - /* 6: storeb */ - ptr1[i] = var38; - /* 7: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 8: storew */ - ptr0[i] = var39; - } - -} - -void -cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_Y42B"); - orc_program_set_backup_function (p, _backup_cogorc_putline_Y42B); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_Y444 */ -#ifdef DISABLE_ORC -void -cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - - ptr0 = (orc_int8 *) d1; - ptr1 = (orc_int8 *) d2; - ptr2 = (orc_int8 *) d3; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var34.i; - var38.i = _src.x2[1]; - var39.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 3: storeb */ - ptr2[i] = var35; - /* 4: storeb */ - ptr1[i] = var36; - /* 5: select1wb */ - { - orc_union16 _src; - _src.i = var39.i; - var37 = _src.x2[1]; - } - /* 6: storeb */ - ptr0[i] = var37; - } - -} - -#else -static void -_backup_cogorc_putline_Y444 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_int8 var35; - orc_int8 var36; - orc_int8 var37; - orc_union16 var38; - orc_union16 var39; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr1 = (orc_int8 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var34.i; - var38.i = _src.x2[1]; - var39.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var38.i; - var35 = _src.x2[1]; - var36 = _src.x2[0]; - } - /* 3: storeb */ - ptr2[i] = var35; - /* 4: storeb */ - ptr1[i] = var36; - /* 5: select1wb */ - { - orc_union16 _src; - _src.i = var39.i; - var37 = _src.x2[1]; - } - /* 6: storeb */ - ptr0[i] = var37; - } - -} - -void -cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_Y444"); - orc_program_set_backup_function (p, _backup_cogorc_putline_Y444); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 2, "t2"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_D3, ORC_VAR_D2, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_Y800 */ -#ifdef DISABLE_ORC -void -cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -#else -static void -_backup_cogorc_putline_Y800 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_int8 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var33; - orc_int8 var34; - orc_union16 var35; - - ptr0 = (orc_int8 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var33 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var33.i; - var35.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var35.i; - var34 = _src.x2[1]; - } - /* 3: storeb */ - ptr0[i] = var34; - } - -} - -void -cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_Y800"); - orc_program_set_backup_function (p, _backup_cogorc_putline_Y800); - orc_program_add_destination (p, 1, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 2, "t1"); - - orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_Y16 */ -#ifdef DISABLE_ORC -void -cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_union16 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - - ptr0 = (orc_union16 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var34.i; - var36.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var36.i; - var37 = _src.x2[1]; - } - /* 3: convubw */ - var38.i = (orc_uint8) var37; - /* 4: shlw */ - var35.i = var38.i << 8; - /* 5: storew */ - ptr0[i] = var35; - } - -} - -#else -static void -_backup_cogorc_putline_Y16 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var34; - orc_union16 var35; - orc_union16 var36; - orc_int8 var37; - orc_union16 var38; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var34 = ptr4[i]; - /* 1: select0lw */ - { - orc_union32 _src; - _src.i = var34.i; - var36.i = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var36.i; - var37 = _src.x2[1]; - } - /* 3: convubw */ - var38.i = (orc_uint8) var37; - /* 4: shlw */ - var35.i = var38.i << 8; - /* 5: storew */ - ptr0[i] = var35; - } - -} - -void -cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_Y16"); - orc_program_set_backup_function (p, _backup_cogorc_putline_Y16); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_constant (p, 4, 0x00000008, "c1"); - orc_program_add_temporary (p, 2, "t1"); - orc_program_add_temporary (p, 1, "t2"); - - orc_program_append_2 (p, "select0lw", 0, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1, - ORC_VAR_D1); - orc_program_append_2 (p, "shlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_BGRA */ -#ifdef DISABLE_ORC -void -cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapl */ - var33.i = ORC_SWAP_L (var32.i); - /* 2: storel */ - ptr0[i] = var33; - } - -} - -#else -static void -_backup_cogorc_putline_BGRA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var32; - orc_union32 var33; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var32 = ptr4[i]; - /* 1: swapl */ - var33.i = ORC_SWAP_L (var32.i); - /* 2: storel */ - ptr0[i] = var33; - } - -} - -void -cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_BGRA"); - orc_program_set_backup_function (p, _backup_cogorc_putline_BGRA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - - orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_ABGR */ -#ifdef DISABLE_ORC -void -cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var47; - _dest.x2[1] = var44; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var45; - _dest.x2[1] = var46; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_cogorc_putline_ABGR (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var47; - _dest.x2[1] = var44; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var45; - _dest.x2[1] = var46; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var48.i; - _dest.x2[1] = var49.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -void -cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_ABGR"); - orc_program_set_backup_function (p, _backup_cogorc_putline_ABGR); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T7, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T6, ORC_VAR_T5, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_RGBA */ -#ifdef DISABLE_ORC -void -cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - int i; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) d1; - ptr4 = (orc_union32 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44; - _dest.x2[1] = var47; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var46; - _dest.x2[1] = var45; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var49.i; - _dest.x2[1] = var48.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -#else -static void -_backup_cogorc_putline_RGBA (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union32 *ORC_RESTRICT ptr0; - const orc_union32 *ORC_RESTRICT ptr4; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_int8 var44; - orc_int8 var45; - orc_int8 var46; - orc_int8 var47; - orc_union16 var48; - orc_union16 var49; - - ptr0 = (orc_union32 *) ex->arrays[0]; - ptr4 = (orc_union32 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadl */ - var40 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 2: splitwb */ - { - orc_union16 _src; - _src.i = var42.i; - var44 = _src.x2[1]; - var45 = _src.x2[0]; - } - /* 3: splitwb */ - { - orc_union16 _src; - _src.i = var43.i; - var46 = _src.x2[1]; - var47 = _src.x2[0]; - } - /* 4: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var44; - _dest.x2[1] = var47; - var48.i = _dest.i; - } - /* 5: mergebw */ - { - orc_union16 _dest; - _dest.x2[0] = var46; - _dest.x2[1] = var45; - var49.i = _dest.i; - } - /* 6: mergewl */ - { - orc_union32 _dest; - _dest.x2[0] = var49.i; - _dest.x2[1] = var48.i; - var41.i = _dest.i; - } - /* 7: storel */ - ptr0[i] = var41; - } - -} - -void -cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, - int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_RGBA"); - orc_program_set_backup_function (p, _backup_cogorc_putline_RGBA); - orc_program_add_destination (p, 4, "d1"); - orc_program_add_source (p, 4, "s1"); - orc_program_add_temporary (p, 1, "t1"); - orc_program_add_temporary (p, 1, "t2"); - orc_program_add_temporary (p, 1, "t3"); - orc_program_add_temporary (p, 1, "t4"); - orc_program_add_temporary (p, 2, "t5"); - orc_program_add_temporary (p, 2, "t6"); - orc_program_add_temporary (p, 2, "t7"); - orc_program_add_temporary (p, 2, "t8"); - - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T8, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T7, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T6, ORC_VAR_T4, ORC_VAR_T1, - ORC_VAR_D1); - orc_program_append_2 (p, "mergebw", 0, ORC_VAR_T5, ORC_VAR_T2, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_NV12 */ -#ifdef DISABLE_ORC -void -cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_union16 *) d2; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var37.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var37.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var37; - /* 4: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 5: avgub */ - var38.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var38.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 6: storew */ - ptr1[i] = var38; - } - -} - -#else -static void -_backup_cogorc_putline_NV12 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var36; - orc_union16 var37; - orc_union16 var38; - orc_union32 var39; - orc_union32 var40; - orc_union16 var41; - orc_union16 var42; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_union16 *) ex->arrays[1]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var36 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var36.x2[0]; - var39.x2[0] = _src.x2[1]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var36.x2[1]; - var39.x2[1] = _src.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var40.x2[0]; - var37.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var40.x2[1]; - var37.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var37; - /* 4: splitlw */ - { - orc_union32 _src; - _src.i = var39.i; - var41.i = _src.x2[1]; - var42.i = _src.x2[0]; - } - /* 5: avgub */ - var38.x2[0] = ((orc_uint8) var41.x2[0] + (orc_uint8) var42.x2[0] + 1) >> 1; - var38.x2[1] = ((orc_uint8) var41.x2[1] + (orc_uint8) var42.x2[1] + 1) >> 1; - /* 6: storew */ - ptr1[i] = var38; - } - -} - -void -cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_NV12"); - orc_program_set_backup_function (p, _backup_cogorc_putline_NV12); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_NV21 */ -#ifdef DISABLE_ORC -void -cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union16 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_union16 *) d2; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var38.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var38.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var38; - /* 4: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 5: avgub */ - var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 6: swapw */ - var39.i = ORC_SWAP_W (var44.i); - /* 7: storew */ - ptr1[i] = var39; - } - -} - -#else -static void -_backup_cogorc_putline_NV21 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_union16 *ORC_RESTRICT ptr1; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var37; - orc_union16 var38; - orc_union16 var39; - orc_union32 var40; - orc_union32 var41; - orc_union16 var42; - orc_union16 var43; - orc_union16 var44; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_union16 *) ex->arrays[1]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var37 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var37.x2[0]; - var40.x2[0] = _src.x2[1]; - var41.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var37.x2[1]; - var40.x2[1] = _src.x2[1]; - var41.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var41.x2[0]; - var38.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var41.x2[1]; - var38.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var38; - /* 4: splitlw */ - { - orc_union32 _src; - _src.i = var40.i; - var42.i = _src.x2[1]; - var43.i = _src.x2[0]; - } - /* 5: avgub */ - var44.x2[0] = ((orc_uint8) var42.x2[0] + (orc_uint8) var43.x2[0] + 1) >> 1; - var44.x2[1] = ((orc_uint8) var42.x2[1] + (orc_uint8) var43.x2[1] + 1) >> 1; - /* 6: swapw */ - var39.i = ORC_SWAP_W (var44.i); - /* 7: storew */ - ptr1[i] = var39; - } - -} - -void -cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_NV21"); - orc_program_set_backup_function (p, _backup_cogorc_putline_NV21); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 2, "d2"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 2, "t5"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "splitlw", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 1, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "swapw", 0, ORC_VAR_D2, ORC_VAR_T5, ORC_VAR_D1, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif - - -/* cogorc_putline_A420 */ -#ifdef DISABLE_ORC -void -cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, int n) -{ - int i; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_union16 *ORC_RESTRICT ptr3; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_int8 var42; - orc_union32 var43; - orc_union32 var44; - orc_union16 var45; - orc_union16 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - orc_int8 var50; - - ptr0 = (orc_union16 *) d1; - ptr1 = (orc_int8 *) d2; - ptr2 = (orc_int8 *) d3; - ptr3 = (orc_union16 *) d4; - ptr4 = (orc_union64 *) s1; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var38 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var38.x2[0]; - var43.x2[0] = _src.x2[1]; - var44.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var38.x2[1]; - var43.x2[1] = _src.x2[1]; - var44.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var44.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var44.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var39; - /* 4: select0wb */ - { - orc_union16 _src; - _src.i = var44.x2[0]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var44.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr3[i] = var40; - /* 6: splitwb */ - { - orc_union16 _src; - _src.i = var43.x2[0]; - var45.x2[0] = _src.x2[1]; - var46.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var43.x2[1]; - var45.x2[1] = _src.x2[1]; - var46.x2[1] = _src.x2[0]; - } - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var46.i; - var47 = _src.x2[1]; - var48 = _src.x2[0]; - } - /* 8: avgub */ - var41 = ((orc_uint8) var47 + (orc_uint8) var48 + 1) >> 1; - /* 9: storeb */ - ptr1[i] = var41; - /* 10: splitwb */ - { - orc_union16 _src; - _src.i = var45.i; - var49 = _src.x2[1]; - var50 = _src.x2[0]; - } - /* 11: avgub */ - var42 = ((orc_uint8) var49 + (orc_uint8) var50 + 1) >> 1; - /* 12: storeb */ - ptr2[i] = var42; - } - -} - -#else -static void -_backup_cogorc_putline_A420 (OrcExecutor * ORC_RESTRICT ex) -{ - int i; - int n = ex->n; - orc_union16 *ORC_RESTRICT ptr0; - orc_int8 *ORC_RESTRICT ptr1; - orc_int8 *ORC_RESTRICT ptr2; - orc_union16 *ORC_RESTRICT ptr3; - const orc_union64 *ORC_RESTRICT ptr4; - orc_union64 var38; - orc_union16 var39; - orc_union16 var40; - orc_int8 var41; - orc_int8 var42; - orc_union32 var43; - orc_union32 var44; - orc_union16 var45; - orc_union16 var46; - orc_int8 var47; - orc_int8 var48; - orc_int8 var49; - orc_int8 var50; - - ptr0 = (orc_union16 *) ex->arrays[0]; - ptr1 = (orc_int8 *) ex->arrays[1]; - ptr2 = (orc_int8 *) ex->arrays[2]; - ptr3 = (orc_union16 *) ex->arrays[3]; - ptr4 = (orc_union64 *) ex->arrays[4]; - - - for (i = 0; i < n; i++) { - /* 0: loadq */ - var38 = ptr4[i]; - /* 1: splitlw */ - { - orc_union32 _src; - _src.i = var38.x2[0]; - var43.x2[0] = _src.x2[1]; - var44.x2[0] = _src.x2[0]; - } - { - orc_union32 _src; - _src.i = var38.x2[1]; - var43.x2[1] = _src.x2[1]; - var44.x2[1] = _src.x2[0]; - } - /* 2: select1wb */ - { - orc_union16 _src; - _src.i = var44.x2[0]; - var39.x2[0] = _src.x2[1]; - } - { - orc_union16 _src; - _src.i = var44.x2[1]; - var39.x2[1] = _src.x2[1]; - } - /* 3: storew */ - ptr0[i] = var39; - /* 4: select0wb */ - { - orc_union16 _src; - _src.i = var44.x2[0]; - var40.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var44.x2[1]; - var40.x2[1] = _src.x2[0]; - } - /* 5: storew */ - ptr3[i] = var40; - /* 6: splitwb */ - { - orc_union16 _src; - _src.i = var43.x2[0]; - var45.x2[0] = _src.x2[1]; - var46.x2[0] = _src.x2[0]; - } - { - orc_union16 _src; - _src.i = var43.x2[1]; - var45.x2[1] = _src.x2[1]; - var46.x2[1] = _src.x2[0]; - } - /* 7: splitwb */ - { - orc_union16 _src; - _src.i = var46.i; - var47 = _src.x2[1]; - var48 = _src.x2[0]; - } - /* 8: avgub */ - var41 = ((orc_uint8) var47 + (orc_uint8) var48 + 1) >> 1; - /* 9: storeb */ - ptr1[i] = var41; - /* 10: splitwb */ - { - orc_union16 _src; - _src.i = var45.i; - var49 = _src.x2[1]; - var50 = _src.x2[0]; - } - /* 11: avgub */ - var42 = ((orc_uint8) var49 + (orc_uint8) var50 + 1) >> 1; - /* 12: storeb */ - ptr2[i] = var42; - } - -} - -void -cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, - guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, - const guint8 * ORC_RESTRICT s1, int n) -{ - OrcExecutor _ex, *ex = &_ex; - static int p_inited = 0; - static OrcProgram *p = 0; - void (*func) (OrcExecutor *); - - if (!p_inited) { - orc_once_mutex_lock (); - if (!p_inited) { - - p = orc_program_new (); - orc_program_set_name (p, "cogorc_putline_A420"); - orc_program_set_backup_function (p, _backup_cogorc_putline_A420); - orc_program_add_destination (p, 2, "d1"); - orc_program_add_destination (p, 1, "d2"); - orc_program_add_destination (p, 1, "d3"); - orc_program_add_destination (p, 2, "d4"); - orc_program_add_source (p, 8, "s1"); - orc_program_add_temporary (p, 4, "t1"); - orc_program_add_temporary (p, 4, "t2"); - orc_program_add_temporary (p, 2, "t3"); - orc_program_add_temporary (p, 2, "t4"); - orc_program_add_temporary (p, 1, "t5"); - orc_program_add_temporary (p, 1, "t6"); - - orc_program_append_2 (p, "splitlw", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_S1, - ORC_VAR_D1); - orc_program_append_2 (p, "select1wb", 1, ORC_VAR_D1, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "select0wb", 1, ORC_VAR_D4, ORC_VAR_T1, - ORC_VAR_D1, ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 1, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_T2, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T3, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D2, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_T4, - ORC_VAR_D1); - orc_program_append_2 (p, "avgub", 0, ORC_VAR_D3, ORC_VAR_T5, ORC_VAR_T6, - ORC_VAR_D1); - - orc_program_compile (p); - } - p_inited = TRUE; - orc_once_mutex_unlock (); - } - ex->program = p; - - ex->n = n; - ex->arrays[ORC_VAR_D1] = d1; - ex->arrays[ORC_VAR_D2] = d2; - ex->arrays[ORC_VAR_D3] = d3; - ex->arrays[ORC_VAR_D4] = d4; - ex->arrays[ORC_VAR_S1] = (void *) s1; - - func = p->code_exec; - func (ex); -} -#endif diff --git a/gst/colorspace/gstcolorspaceorc-dist.h b/gst/colorspace/gstcolorspaceorc-dist.h deleted file mode 100644 index 2384b522d..000000000 --- a/gst/colorspace/gstcolorspaceorc-dist.h +++ /dev/null @@ -1,168 +0,0 @@ - -/* autogenerated from gstcolorspaceorc.orc */ - -#ifndef _GSTCOLORSPACEORC_H_ -#define _GSTCOLORSPACEORC_H_ - -#include <glib.h> - -#ifdef __cplusplus -extern "C" { -#endif - - - -#ifndef _ORC_INTEGER_TYPEDEFS_ -#define _ORC_INTEGER_TYPEDEFS_ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include <stdint.h> -typedef int8_t orc_int8; -typedef int16_t orc_int16; -typedef int32_t orc_int32; -typedef int64_t orc_int64; -typedef uint8_t orc_uint8; -typedef uint16_t orc_uint16; -typedef uint32_t orc_uint32; -typedef uint64_t orc_uint64; -#define ORC_UINT64_C(x) UINT64_C(x) -#elif defined(_MSC_VER) -typedef signed __int8 orc_int8; -typedef signed __int16 orc_int16; -typedef signed __int32 orc_int32; -typedef signed __int64 orc_int64; -typedef unsigned __int8 orc_uint8; -typedef unsigned __int16 orc_uint16; -typedef unsigned __int32 orc_uint32; -typedef unsigned __int64 orc_uint64; -#define ORC_UINT64_C(x) (x##Ui64) -#define inline __inline -#else -#include <limits.h> -typedef signed char orc_int8; -typedef short orc_int16; -typedef int orc_int32; -typedef unsigned char orc_uint8; -typedef unsigned short orc_uint16; -typedef unsigned int orc_uint32; -#if INT_MAX == LONG_MAX -typedef long long orc_int64; -typedef unsigned long long orc_uint64; -#define ORC_UINT64_C(x) (x##ULL) -#else -typedef long orc_int64; -typedef unsigned long orc_uint64; -#define ORC_UINT64_C(x) (x##UL) -#endif -#endif -typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; -typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; -typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; -#endif -#ifndef ORC_RESTRICT -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define ORC_RESTRICT restrict -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define ORC_RESTRICT __restrict__ -#else -#define ORC_RESTRICT -#endif -#endif -void cogorc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_downsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_downsample_horiz_cosite_3tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_420_jpeg (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_vert_halfsite_2tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_downsample_vert_cosite_3tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_downsample_vert_halfsite_4tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_upsample_horiz_cosite_1tap (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_upsample_horiz_cosite (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_upsample_vert_avgub (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void orc_unpack_yuyv_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_yuyv_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_yuyv_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_pack_yuyv (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void orc_unpack_uyvy_y (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_uyvy_u (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_unpack_uyvy_v (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void orc_pack_uyvy (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void orc_matrix2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int p3, int n); -void orc_matrix2_11_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n); -void orc_matrix2_12_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n); -void orc_matrix3_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int n); -void orc_matrix3_100_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int n); -void orc_matrix3_100_offset_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, int n); -void orc_matrix3_000_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int p2, int p3, int p4, int p5, int n); -void orc_pack_123x (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int n); -void orc_pack_x123 (guint32 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int p1, int n); -void cogorc_combine2_u8 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int p1, int p2, int n); -void cogorc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, guint8 * ORC_RESTRICT d4, int d4_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, int n, int m); -void cogorc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1, int d1_stride, guint8 * ORC_RESTRICT d2, int d2_stride, guint8 * ORC_RESTRICT d3, int d3_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, const guint8 * ORC_RESTRICT s2, int s2_stride, const guint8 * ORC_RESTRICT s3, int s3_stride, int n, int m); -void cogorc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int n, int m); -void cogorc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_convert_I420_BGRA_avg (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n); -void cogorc_getline_I420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_YUV9 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_Y42B (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_Y444 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); -void cogorc_getline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_getline_NV12 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_getline_NV21 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); -void cogorc_getline_A420 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, int n); -void cogorc_putline_I420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_YUY2 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_YVYU (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_UYVY (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y42B (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y444 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y800 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_Y16 (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_BGRA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_ABGR (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_RGBA (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_NV12 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_NV21 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, const guint8 * ORC_RESTRICT s1, int n); -void cogorc_putline_A420 (guint8 * ORC_RESTRICT d1, guint8 * ORC_RESTRICT d2, guint8 * ORC_RESTRICT d3, guint8 * ORC_RESTRICT d4, const guint8 * ORC_RESTRICT s1, int n); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/gst/colorspace/gstcolorspaceorc.orc b/gst/colorspace/gstcolorspaceorc.orc deleted file mode 100644 index 086990e15..000000000 --- a/gst/colorspace/gstcolorspaceorc.orc +++ /dev/null @@ -1,1757 +0,0 @@ - -.function cogorc_memcpy_2d -.flags 2d -.dest 1 d1 guint8 -.source 1 s1 guint8 - -copyb d1, s1 - - -.function cogorc_downsample_horiz_cosite_1tap -.dest 1 d1 guint8 -.source 2 s1 guint8 - -select0wb d1, s1 - - -.function cogorc_downsample_horiz_cosite_3tap -.dest 1 d1 guint8 -.source 2 s1 guint8 -.source 2 s2 guint8 -.temp 1 t1 -.temp 1 t2 -.temp 1 t3 -.temp 2 t4 -.temp 2 t5 -.temp 2 t6 - -copyw t4, s1 -select0wb t1, t4 -select1wb t2, t4 -select0wb t3, s2 -convubw t4, t1 -convubw t5, t2 -convubw t6, t3 -mullw t5, t5, 2 -addw t4, t4, t6 -addw t4, t4, t5 -addw t4, t4, 2 -shrsw t4, t4, 2 -convsuswb d1, t4 - - -.function cogorc_downsample_420_jpeg -.dest 1 d1 guint8 -.source 2 s1 guint8 -.source 2 s2 guint8 -.temp 2 t1 -.temp 1 t2 -.temp 1 t3 -.temp 1 t4 -.temp 1 t5 - -copyw t1, s1 -select0wb t2, t1 -select1wb t3, t1 -avgub t2, t2, t3 -copyw t1, s2 -select0wb t4, t1 -select1wb t5, t1 -avgub t4, t4, t5 -avgub d1, t2, t4 - - -.function cogorc_downsample_vert_halfsite_2tap -.dest 1 d1 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 - -avgub d1, s1, s2 - - -.function cogorc_downsample_vert_cosite_3tap -.dest 1 d1 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 - -convubw t1, s1 -convubw t2, s2 -convubw t3, s3 -mullw t2, t2, 2 -addw t1, t1, t3 -addw t1, t1, t2 -addw t1, t1, 2 -shrsw t1, t1, 2 -convsuswb d1, t1 - - - -.function cogorc_downsample_vert_halfsite_4tap -.dest 1 d1 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.source 1 s4 guint8 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 -.temp 2 t4 - -convubw t1, s1 -convubw t2, s2 -convubw t3, s3 -convubw t4, s4 -addw t2, t2, t3 -mullw t2, t2, 26 -addw t1, t1, t4 -mullw t1, t1, 6 -addw t2, t2, t1 -addw t2, t2, 32 -shrsw t2, t2, 6 -convsuswb d1, t2 - - -.function cogorc_upsample_horiz_cosite_1tap -.dest 2 d1 guint8 guint8 -.source 1 s1 guint8 -.temp 1 t1 - -copyb t1, s1 -mergebw d1, t1, t1 - - -.function cogorc_upsample_horiz_cosite -.dest 2 d1 guint8 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.temp 1 t1 -.temp 1 t2 - -copyb t1, s1 -avgub t2, t1, s2 -mergebw d1, t1, t2 - - -.function cogorc_upsample_vert_avgub -.dest 1 d1 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 - -avgub d1, s1, s2 - - - - -.function orc_unpack_yuyv_y -.dest 1 d1 guint8 -.source 2 s1 guint8 - -select0wb d1, s1 - - -.function orc_unpack_yuyv_u -.dest 1 d1 guint8 -.source 4 s1 guint8 -.temp 2 t1 - -select0lw t1, s1 -select1wb d1, t1 - - -.function orc_unpack_yuyv_v -.dest 1 d1 guint8 -.source 4 s1 guint8 -.temp 2 t1 - -select1lw t1, s1 -select1wb d1, t1 - - -.function orc_pack_yuyv -.dest 4 d1 guint8 -.source 2 s1 guint8 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.temp 1 t1 -.temp 1 t2 -.temp 2 t3 -.temp 2 t4 -.temp 2 t5 - -copyw t5, s1 -select0wb t1, t5 -select1wb t2, t5 -mergebw t3, t1, s2 -mergebw t4, t2, s3 -mergewl d1, t3, t4 - - -.function orc_unpack_uyvy_y -.dest 1 d1 guint8 -.source 2 s1 guint8 - -select1wb d1, s1 - - -.function orc_unpack_uyvy_u -.dest 1 d1 guint8 -.source 4 s1 guint8 -.temp 2 t1 - -select0lw t1, s1 -select0wb d1, t1 - - -.function orc_unpack_uyvy_v -.dest 1 d1 guint8 -.source 4 s1 guint8 -.temp 2 t1 - -select1lw t1, s1 -select0wb d1, t1 - - -.function orc_pack_uyvy -.dest 4 d1 guint8 -.source 2 s1 guint8 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.temp 1 t1 -.temp 1 t2 -.temp 2 t3 -.temp 2 t4 -.temp 2 t5 - -copyw t5, s1 -select0wb t1, t5 -select1wb t2, t5 -mergebw t3, s2, t1 -mergebw t4, s3, t2 -mergewl d1, t3, t4 - - -.function orc_matrix2_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.param 2 p1 -.param 2 p2 -.param 2 p3 -.temp 2 t1 -.temp 2 t2 - -convubw t1, s1 -mullw t1, t1, p1 -convubw t2, s2 -mullw t2, t2, p2 -addw t1, t1, t2 -addw t1, t1, p3 -shrsw t1, t1, 6 -convsuswb d1, t1 - - -.function orc_matrix2_11_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.param 2 p1 -.param 2 p2 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 -.temp 2 t4 - -convubw t1, s1 -subw t1, t1, 16 -mullw t3, t1, p1 -convubw t2, s2 -subw t2, t2, 128 -mullw t4, t2, p2 -addw t3, t3, t4 -addw t3, t3, 128 -shrsw t3, t3, 8 -addw t3, t3, t1 -addw t3, t3, t2 -convsuswb d1, t3 - - -.function orc_matrix2_12_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.param 2 p1 -.param 2 p2 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 -.temp 2 t4 - -convubw t1, s1 -subw t1, t1, 16 -mullw t3, t1, p1 -convubw t2, s2 -subw t2, t2, 128 -mullw t4, t2, p2 -addw t3, t3, t4 -addw t3, t3, 128 -shrsw t3, t3, 8 -addw t3, t3, t1 -addw t3, t3, t2 -addw t3, t3, t2 -convsuswb d1, t3 - - -.function orc_matrix3_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.source 1 s3 guint8 guint8 -.param 2 p1 -.param 2 p2 -.param 2 p3 -.param 2 p4 -.temp 2 t1 -.temp 2 t2 - -convubw t1, s1 -mullw t1, t1, p1 -convubw t2, s2 -mullw t2, t2, p2 -addw t1, t1, t2 -convubw t2, s3 -mullw t2, t2, p3 -addw t1, t1, t2 -addw t1, t1, p4 -shrsw t1, t1, 6 -convsuswb d1, t1 - - -.function orc_matrix3_100_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.source 1 s3 guint8 guint8 -.param 2 p1 -.param 2 p2 -.param 2 p3 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 -#.temp 2 t4 - -convubw t1, s1 -subw t1, t1, 16 -mullw t3, t1, p1 -convubw t2, s2 -subw t2, t2, 128 -mullw t2, t2, p2 -addw t3, t3, t2 -convubw t2, s3 -subw t2, t2, 128 -mullw t2, t2, p3 -addw t3, t3, t2 -addw t3, t3, 128 -shrsw t3, t3, 8 -addw t3, t3, t1 -convsuswb d1, t3 - - -.function orc_matrix3_100_offset_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.source 1 s3 guint8 guint8 -.param 2 p1 -.param 2 p2 -.param 2 p3 -.param 2 p4 -.param 2 p5 -#.param 2 p6 -.temp 2 t1 -.temp 2 t2 -.temp 2 t3 -#.temp 2 t3 -#.temp 2 t4 - -convubw t3, s1 -mullw t1, t3, p1 -convubw t2, s2 -mullw t2, t2, p2 -addw t1, t1, t2 -convubw t2, s3 -mullw t2, t2, p3 -addw t1, t1, t2 -addw t1, t1, p4 -shrsw t1, t1, p5 -#addw t1, t1, p6 -addw t1, t1, t3 -convsuswb d1, t1 - - - -.function orc_matrix3_000_u8 -.dest 1 d1 guint8 guint8 -.source 1 s1 guint8 guint8 -.source 1 s2 guint8 guint8 -.source 1 s3 guint8 guint8 -.param 2 p1 -.param 2 p2 -.param 2 p3 -.param 2 p4 -.param 2 p5 -#.param 2 p6 -.temp 2 t1 -.temp 2 t2 -#.temp 2 t3 -#.temp 2 t4 - -convubw t1, s1 -mullw t1, t1, p1 -convubw t2, s2 -mullw t2, t2, p2 -addw t1, t1, t2 -convubw t2, s3 -mullw t2, t2, p3 -addw t1, t1, t2 -addw t1, t1, p4 -shrsw t1, t1, p5 -#addw t1, t1, p6 -convwb d1, t1 - - - -.function orc_pack_123x -.dest 4 d1 guint32 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.param 1 p1 -.temp 2 t1 -.temp 2 t2 - -mergebw t1, s1, s2 -mergebw t2, s3, p1 -mergewl d1, t1, t2 - - -.function orc_pack_x123 -.dest 4 d1 guint32 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.source 1 s3 guint8 -.param 1 p1 -.temp 2 t1 -.temp 2 t2 - -mergebw t1, p1, s1 -mergebw t2, s2, s3 -mergewl d1, t1, t2 - - -.function cogorc_combine2_u8 -.dest 1 d1 guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 -.param 2 p1 -.param 2 p2 -.temp 2 t1 -.temp 2 t2 - -convubw t1, s1 -mullw t1, t1, p1 -convubw t2, s2 -mullw t2, t2, p2 -addw t1, t1, t2 -shruw t1, t1, 8 -convsuswb d1, t1 - - -.function cogorc_convert_I420_UYVY -.dest 4 d1 guint8 -.dest 4 d2 guint8 -.source 2 y1 guint8 -.source 2 y2 guint8 -.source 1 u guint8 -.source 1 v guint8 -.temp 2 uv - -mergebw uv, u, v -x2 mergebw d1, uv, y1 -x2 mergebw d2, uv, y2 - - -.function cogorc_convert_I420_YUY2 -.dest 4 d1 guint8 -.dest 4 d2 guint8 -.source 2 y1 guint8 -.source 2 y2 guint8 -.source 1 u guint8 -.source 1 v guint8 -.temp 2 uv - -mergebw uv, u, v -x2 mergebw d1, y1, uv -x2 mergebw d2, y2, uv - - - -.function cogorc_convert_I420_AYUV -.dest 4 d1 guint8 -.dest 4 d2 guint8 -.source 1 y1 guint8 -.source 1 y2 guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay -.temp 1 tu -.temp 1 tv - -loadupdb tu, u -loadupdb tv, v -mergebw uv, tu, tv -mergebw ay, c255, y1 -mergewl d1, ay, uv -mergebw ay, c255, y2 -mergewl d2, ay, uv - - -.function cogorc_convert_YUY2_I420 -.dest 2 y1 guint8 -.dest 2 y2 guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 yuv1 guint8 -.source 4 yuv2 guint8 -.temp 2 t1 -.temp 2 t2 -.temp 2 ty - -x2 splitwb t1, ty, yuv1 -storew y1, ty -x2 splitwb t2, ty, yuv2 -storew y2, ty -x2 avgub t1, t1, t2 -splitwb v, u, t1 - - -.function cogorc_convert_UYVY_YUY2 -.flags 2d -.dest 4 yuy2 guint8 -.source 4 uyvy guint8 - -x2 swapw yuy2, uyvy - - -.function cogorc_planar_chroma_420_422 -.flags 2d -.dest 1 d1 guint8 -.dest 1 d2 guint8 -.source 1 s guint8 - -copyb d1, s -copyb d2, s - - -.function cogorc_planar_chroma_420_444 -.flags 2d -.dest 2 d1 guint8 -.dest 2 d2 guint8 -.source 1 s guint8 -.temp 2 t - -splatbw t, s -storew d1, t -storew d2, t - - -.function cogorc_planar_chroma_422_444 -.flags 2d -.dest 2 d1 guint8 -.source 1 s guint8 -.temp 2 t - -splatbw t, s -storew d1, t - - -.function cogorc_planar_chroma_444_422 -.flags 2d -.dest 1 d guint8 -.source 2 s guint8 -.temp 1 t1 -.temp 1 t2 - -splitwb t1, t2, s -avgub d, t1, t2 - - -.function cogorc_planar_chroma_444_420 -.flags 2d -.dest 1 d guint8 -.source 2 s1 guint8 -.source 2 s2 guint8 -.temp 2 t -.temp 1 t1 -.temp 1 t2 - -x2 avgub t, s1, s2 -splitwb t1, t2, t -avgub d, t1, t2 - - -.function cogorc_planar_chroma_422_420 -.flags 2d -.dest 1 d guint8 -.source 1 s1 guint8 -.source 1 s2 guint8 - -avgub d, s1, s2 - - -.function cogorc_convert_YUY2_AYUV -.flags 2d -.dest 8 ayuv guint8 -.source 4 yuy2 guint8 -.const 2 c255 0xff -.temp 2 yy -.temp 2 uv -.temp 4 ayay -.temp 4 uvuv - -x2 splitwb uv, yy, yuy2 -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_convert_UYVY_AYUV -.flags 2d -.dest 8 ayuv guint8 -.source 4 uyvy guint8 -.const 2 c255 0xff -.temp 2 yy -.temp 2 uv -.temp 4 ayay -.temp 4 uvuv - -x2 splitwb yy, uv, uyvy -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_convert_YUY2_Y42B -.flags 2d -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 yuy2 guint8 -.temp 2 uv - -x2 splitwb uv, y, yuy2 -splitwb v, u, uv - - -.function cogorc_convert_UYVY_Y42B -.flags 2d -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 uyvy guint8 -.temp 2 uv - -x2 splitwb y, uv, uyvy -splitwb v, u, uv - - -.function cogorc_convert_YUY2_Y444 -.flags 2d -.dest 2 y guint8 -.dest 2 uu guint8 -.dest 2 vv guint8 -.source 4 yuy2 guint8 -.temp 2 uv -.temp 1 u -.temp 1 v - -x2 splitwb uv, y, yuy2 -splitwb v, u, uv -splatbw uu, u -splatbw vv, v - - -.function cogorc_convert_UYVY_Y444 -.flags 2d -.dest 2 y guint8 -.dest 2 uu guint8 -.dest 2 vv guint8 -.source 4 uyvy guint8 -.temp 2 uv -.temp 1 u -.temp 1 v - -x2 splitwb y, uv, uyvy -splitwb v, u, uv -splatbw uu, u -splatbw vv, v - - -.function cogorc_convert_UYVY_I420 -.dest 2 y1 guint8 -.dest 2 y2 guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 yuv1 guint8 -.source 4 yuv2 guint8 -.temp 2 t1 -.temp 2 t2 -.temp 2 ty - -x2 splitwb ty, t1, yuv1 -storew y1, ty -x2 splitwb ty, t2, yuv2 -storew y2, ty -x2 avgub t1, t1, t2 -splitwb v, u, t1 - - - -.function cogorc_convert_AYUV_I420 -.flags 2d -.dest 2 y1 guint8 -.dest 2 y2 guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 8 ayuv1 guint8 -.source 8 ayuv2 guint8 -.temp 4 ay -.temp 4 uv1 -.temp 4 uv2 -.temp 4 uv -.temp 2 uu -.temp 2 vv -.temp 1 t1 -.temp 1 t2 - -x2 splitlw uv1, ay, ayuv1 -x2 select1wb y1, ay -x2 splitlw uv2, ay, ayuv2 -x2 select1wb y2, ay -x4 avgub uv, uv1, uv2 -x2 splitwb vv, uu, uv -splitwb t1, t2, uu -avgub u, t1, t2 -splitwb t1, t2, vv -avgub v, t1, t2 - - - -.function cogorc_convert_AYUV_YUY2 -.flags 2d -.dest 4 yuy2 guint8 -.source 8 ayuv guint8 -.temp 2 yy -.temp 2 uv1 -.temp 2 uv2 -.temp 4 ayay -.temp 4 uvuv - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -x2 select1wb yy, ayay -x2 mergebw yuy2, yy, uv1 - - -.function cogorc_convert_AYUV_UYVY -.flags 2d -.dest 4 yuy2 guint8 -.source 8 ayuv guint8 -.temp 2 yy -.temp 2 uv1 -.temp 2 uv2 -.temp 4 ayay -.temp 4 uvuv - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -x2 select1wb yy, ayay -x2 mergebw yuy2, uv1, yy - - - -.function cogorc_convert_AYUV_Y42B -.flags 2d -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 8 ayuv guint8 -.temp 4 ayay -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -splitwb v, u, uv1 -x2 select1wb y, ayay - - -.function cogorc_convert_AYUV_Y444 -.flags 2d -.dest 1 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 ayuv guint8 -.temp 2 ay -.temp 2 uv - -splitlw uv, ay, ayuv -splitwb v, u, uv -select1wb y, ay - - -.function cogorc_convert_Y42B_YUY2 -.flags 2d -.dest 4 yuy2 guint8 -.source 2 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.temp 2 uv - -mergebw uv, u, v -x2 mergebw yuy2, y, uv - - -.function cogorc_convert_Y42B_UYVY -.flags 2d -.dest 4 uyvy guint8 -.source 2 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.temp 2 uv - -mergebw uv, u, v -x2 mergebw uyvy, uv, y - - -.function cogorc_convert_Y42B_AYUV -.flags 2d -.dest 8 ayuv guint8 -.source 2 yy guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay -.temp 4 uvuv -.temp 4 ayay - -mergebw uv, u, v -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_convert_Y444_YUY2 -.flags 2d -.dest 4 yuy2 guint8 -.source 2 y guint8 -.source 2 u guint8 -.source 2 v guint8 -.temp 2 uv -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 - -x2 mergebw uvuv, u, v -splitlw uv1, uv2, uvuv -x2 avgub uv, uv1, uv2 -x2 mergebw yuy2, y, uv - - -.function cogorc_convert_Y444_UYVY -.flags 2d -.dest 4 uyvy guint8 -.source 2 y guint8 -.source 2 u guint8 -.source 2 v guint8 -.temp 2 uv -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 - -x2 mergebw uvuv, u, v -splitlw uv1, uv2, uvuv -x2 avgub uv, uv1, uv2 -x2 mergebw uyvy, uv, y - - -.function cogorc_convert_Y444_AYUV -.flags 2d -.dest 4 ayuv guint8 -.source 1 yy guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay - -mergebw uv, u, v -mergebw ay, c255, yy -mergewl ayuv, ay, uv - - - -.function cogorc_convert_AYUV_ARGB -.flags 2d -.dest 4 argb guint8 -.source 4 ayuv guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 a -.temp 1 y -.temp 1 u -.temp 1 v -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 - -x4 subb x, ayuv, 128 -splitlw t1, t2, x -splitwb y, a, t2 -splitwb v, u, t1 -convsbw wy, y -convsbw wu, u -convsbw wv, v - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, a, r -mergebw t2, g, b -mergewl x, t1, t2 -x4 addb argb, x, 128 - - - -.function cogorc_convert_AYUV_BGRA -.flags 2d -.dest 4 argb guint8 -.source 4 ayuv guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 a -.temp 1 y -.temp 1 u -.temp 1 v -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 - -x4 subb x, ayuv, 128 -splitlw t1, t2, x -splitwb y, a, t2 -splitwb v, u, t1 -convsbw wy, y -convsbw wu, u -convsbw wv, v - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, b, g -mergebw t2, r, a -mergewl x, t1, t2 -x4 addb argb, x, 128 - - - - -.function cogorc_convert_AYUV_ABGR -.flags 2d -.dest 4 argb guint8 -.source 4 ayuv guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 a -.temp 1 y -.temp 1 u -.temp 1 v -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 - -x4 subb x, ayuv, 128 -splitlw t1, t2, x -splitwb y, a, t2 -splitwb v, u, t1 -convsbw wy, y -convsbw wu, u -convsbw wv, v - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, a, b -mergebw t2, g, r -mergewl x, t1, t2 -x4 addb argb, x, 128 - - - -.function cogorc_convert_AYUV_RGBA -.flags 2d -.dest 4 argb guint8 -.source 4 ayuv guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 a -.temp 1 y -.temp 1 u -.temp 1 v -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 - -x4 subb x, ayuv, 128 -splitlw t1, t2, x -splitwb y, a, t2 -splitwb v, u, t1 -convsbw wy, y -convsbw wu, u -convsbw wv, v - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, r, g -mergebw t2, b, a -mergewl x, t1, t2 -x4 addb argb, x, 128 - - - -.function cogorc_convert_I420_BGRA -.dest 4 argb guint8 -.source 1 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 t3 -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 -.const 1 c128 128 - -subb t3, y, c128 -convsbw wy, t3 -loadupib t3, u -subb t3, t3, c128 -convsbw wu, t3 -loadupib t3, v -subb t3, t3, c128 -convsbw wv, t3 - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, b, g -mergebw t2, r, 255 -mergewl x, t1, t2 -x4 addb argb, x, c128 - - - -.function cogorc_convert_I420_BGRA_avg -.dest 4 argb guint8 -.source 1 y guint8 -.source 1 u1 guint8 -.source 1 u2 guint8 -.source 1 v1 guint8 -.source 1 v2 guint8 -.temp 2 t1 -.temp 2 t2 -.temp 1 t3 -.temp 1 t4 -.temp 2 wy -.temp 2 wu -.temp 2 wv -.temp 2 wr -.temp 2 wg -.temp 2 wb -.temp 1 r -.temp 1 g -.temp 1 b -.temp 4 x -.const 1 c8 8 -.const 1 c128 128 - -subb t3, y, c128 -convsbw wy, t3 -loadupib t3, u1 -loadupib t4, u2 -avgub t3, t3, t4 -subb t3, t3, c128 -convsbw wu, t3 -loadupib t3, v1 -loadupib t4, v2 -avgub t3, t3, t4 -subb t3, t3, c128 -convsbw wv, t3 - -mullw t1, wy, 42 -shrsw t1, t1, c8 -addssw wy, wy, t1 - -addssw wr, wy, wv -mullw t1, wv, 103 -shrsw t1, t1, c8 -subssw wr, wr, t1 -addssw wr, wr, wv - -addssw wb, wy, wu -addssw wb, wb, wu -mullw t1, wu, 4 -shrsw t1, t1, c8 -addssw wb, wb, t1 - -mullw t1, wu, 100 -shrsw t1, t1, c8 -subssw wg, wy, t1 -mullw t1, wv, 104 -shrsw t1, t1, c8 -subssw wg, wg, t1 -subssw wg, wg, t1 - -convssswb r, wr -convssswb g, wg -convssswb b, wb - -mergebw t1, b, g -mergebw t2, r, 255 -mergewl x, t1, t2 -x4 addb argb, x, c128 - - - -.function cogorc_getline_I420 -.dest 4 d guint8 -.source 1 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay -.temp 1 tu -.temp 1 tv - -loadupdb tu, u -loadupdb tv, v -mergebw uv, tu, tv -mergebw ay, c255, y -mergewl d, ay, uv - -.function cogorc_getline_YUV9 -.dest 8 d guint8 -.source 2 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 tuv -.temp 4 ay -.temp 4 uv -.temp 1 tu -.temp 1 tv - -loadupdb tu, u -loadupdb tv, v -mergebw tuv, tu, tv -mergewl uv, tuv, tuv -x2 mergebw ay, c255, y -x2 mergewl d, ay, uv - -.function cogorc_getline_YUY2 -.dest 8 ayuv guint8 -.source 4 yuy2 guint8 -.const 2 c255 0xff -.temp 2 yy -.temp 2 uv -.temp 4 ayay -.temp 4 uvuv - -x2 splitwb uv, yy, yuy2 -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_getline_UYVY -.dest 8 ayuv guint8 -.source 4 uyvy guint8 -.const 2 c255 0xff -.temp 2 yy -.temp 2 uv -.temp 4 ayay -.temp 4 uvuv - -x2 splitwb yy, uv, uyvy -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_getline_YVYU -.dest 8 ayuv guint8 -.source 4 uyvy guint8 -.const 2 c255 0xff -.temp 2 yy -.temp 2 uv -.temp 4 ayay -.temp 4 uvuv - -x2 splitwb uv, yy, uyvy -swapw uv, uv -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_getline_Y42B -.dest 8 ayuv guint8 -.source 2 yy guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay -.temp 4 uvuv -.temp 4 ayay - -mergebw uv, u, v -x2 mergebw ayay, c255, yy -mergewl uvuv, uv, uv -x2 mergewl ayuv, ayay, uvuv - - -.function cogorc_getline_Y444 -.dest 4 ayuv guint8 -.source 1 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.const 1 c255 255 -.temp 2 uv -.temp 2 ay - -mergebw uv, u, v -mergebw ay, c255, y -mergewl ayuv, ay, uv - - -.function cogorc_getline_Y800 -.dest 4 ayuv guint8 -.source 1 y guint8 -.const 1 c255 255 -.const 2 c0x8080 0x8080 -.temp 2 ay - -mergebw ay, c255, y -mergewl ayuv, ay, c0x8080 - -.function cogorc_getline_Y16 -.dest 4 ayuv guint8 -.source 2 y guint8 -.const 1 c255 255 -.const 2 c0x8080 0x8080 -.temp 2 ay -.temp 1 yb - -convhwb yb, y -mergebw ay, c255, yb -mergewl ayuv, ay, c0x8080 - -.function cogorc_getline_BGRA -.dest 4 argb guint8 -.source 4 bgra guint8 - -swapl argb, bgra - - -.function cogorc_getline_ABGR -.dest 4 argb guint8 -.source 4 abgr guint8 -.temp 1 a -.temp 1 r -.temp 1 g -.temp 1 b -.temp 2 gr -.temp 2 ab -.temp 2 ar -.temp 2 gb - -splitlw gr, ab, abgr -splitwb r, g, gr -splitwb b, a, ab -mergebw ar, a, r -mergebw gb, g, b -mergewl argb, ar, gb - - -.function cogorc_getline_RGBA -.dest 4 argb guint8 -.source 4 rgba guint8 -.temp 1 a -.temp 1 r -.temp 1 g -.temp 1 b -.temp 2 rg -.temp 2 ba -.temp 2 ar -.temp 2 gb - -splitlw ba, rg, rgba -splitwb g, r, rg -splitwb a, b, ba -mergebw ar, a, r -mergebw gb, g, b -mergewl argb, ar, gb - - -.function cogorc_getline_NV12 -.dest 8 d guint8 -.source 2 y guint8 -.source 2 uv guint8 -.const 1 c255 255 -.temp 4 ay -.temp 4 uvuv - -mergewl uvuv, uv, uv -x2 mergebw ay, c255, y -x2 mergewl d, ay, uvuv - - -.function cogorc_getline_NV21 -.dest 8 d guint8 -.source 2 y guint8 -.source 2 vu guint8 -.const 1 c255 255 -.temp 2 uv -.temp 4 ay -.temp 4 uvuv - -swapw uv, vu -mergewl uvuv, uv, uv -x2 mergebw ay, c255, y -x2 mergewl d, ay, uvuv - -.function cogorc_getline_A420 -.dest 4 d guint8 -.source 1 y guint8 -.source 1 u guint8 -.source 1 v guint8 -.source 1 a guint8 -.temp 2 uv -.temp 2 ay -.temp 1 tu -.temp 1 tv - -loadupdb tu, u -loadupdb tv, v -mergebw uv, tu, tv -mergebw ay, a, y -mergewl d, ay, uv - -.function cogorc_putline_I420 -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 8 ayuv guint8 -.temp 4 ay -.temp 4 uv -.temp 2 uu -.temp 2 vv -.temp 1 t1 -.temp 1 t2 - -x2 splitlw uv, ay, ayuv -x2 select1wb y, ay -x2 splitwb vv, uu, uv -splitwb t1, t2, uu -avgub u, t1, t2 -splitwb t1, t2, vv -avgub v, t1, t2 - - - -.function cogorc_putline_YUY2 -.dest 4 yuy2 guint8 -.source 8 ayuv guint8 -.temp 2 yy -.temp 2 uv1 -.temp 2 uv2 -.temp 4 ayay -.temp 4 uvuv - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -x2 select1wb yy, ayay -x2 mergebw yuy2, yy, uv1 - - -.function cogorc_putline_YVYU -.dest 4 yuy2 guint8 -.source 8 ayuv guint8 -.temp 2 yy -.temp 2 uv1 -.temp 2 uv2 -.temp 4 ayay -.temp 4 uvuv - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -x2 select1wb yy, ayay -swapw uv1, uv1 -x2 mergebw yuy2, yy, uv1 - - -.function cogorc_putline_UYVY -.dest 4 yuy2 guint8 -.source 8 ayuv guint8 -.temp 2 yy -.temp 2 uv1 -.temp 2 uv2 -.temp 4 ayay -.temp 4 uvuv - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -x2 select1wb yy, ayay -x2 mergebw yuy2, uv1, yy - - - -.function cogorc_putline_Y42B -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 8 ayuv guint8 -.temp 4 ayay -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 - -x2 splitlw uvuv, ayay, ayuv -splitlw uv1, uv2, uvuv -x2 avgub uv1, uv1, uv2 -splitwb v, u, uv1 -x2 select1wb y, ayay - - -.function cogorc_putline_Y444 -.dest 1 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.source 4 ayuv guint8 -.temp 2 ay -.temp 2 uv - -splitlw uv, ay, ayuv -splitwb v, u, uv -select1wb y, ay - - -.function cogorc_putline_Y800 -.dest 1 y guint8 -.source 4 ayuv guint8 -.temp 2 ay - -select0lw ay, ayuv -select1wb y, ay - -.function cogorc_putline_Y16 -.dest 2 y guint8 -.source 4 ayuv guint8 -.temp 2 ay -.temp 1 yb - -select0lw ay, ayuv -select1wb yb, ay -convubw ay, yb -shlw y, ay, 8 - -.function cogorc_putline_BGRA -.dest 4 bgra guint8 -.source 4 argb guint8 - -swapl bgra, argb - - -.function cogorc_putline_ABGR -.dest 4 abgr guint8 -.source 4 argb guint8 -.temp 1 a -.temp 1 r -.temp 1 g -.temp 1 b -.temp 2 gr -.temp 2 ab -.temp 2 ar -.temp 2 gb - -splitlw gb, ar, argb -splitwb b, g, gb -splitwb r, a, ar -mergebw ab, a, b -mergebw gr, g, r -mergewl abgr, ab, gr - - -.function cogorc_putline_RGBA -.dest 4 rgba guint8 -.source 4 argb guint8 -.temp 1 a -.temp 1 r -.temp 1 g -.temp 1 b -.temp 2 rg -.temp 2 ba -.temp 2 ar -.temp 2 gb - -splitlw gb, ar, argb -splitwb b, g, gb -splitwb r, a, ar -mergebw ba, b, a -mergebw rg, r, g -mergewl rgba, rg, ba - - -.function cogorc_putline_NV12 -.dest 2 y guint8 -.dest 2 uv guint8 -.source 8 ayuv guint8 -.temp 4 ay -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 - -x2 splitlw uvuv, ay, ayuv -x2 select1wb y, ay -splitlw uv1, uv2, uvuv -x2 avgub uv, uv1, uv2 - - -.function cogorc_putline_NV21 -.dest 2 y guint8 -.dest 2 vu guint8 -.source 8 ayuv guint8 -.temp 4 ay -.temp 4 uvuv -.temp 2 uv1 -.temp 2 uv2 -.temp 2 uv - -x2 splitlw uvuv, ay, ayuv -x2 select1wb y, ay -splitlw uv1, uv2, uvuv -x2 avgub uv, uv1, uv2 -swapw vu, uv - -.function cogorc_putline_A420 -.dest 2 y guint8 -.dest 1 u guint8 -.dest 1 v guint8 -.dest 2 a guint8 -.source 8 ayuv guint8 -.temp 4 ay -.temp 4 uv -.temp 2 uu -.temp 2 vv -.temp 1 t1 -.temp 1 t2 - -x2 splitlw uv, ay, ayuv -x2 select1wb y, ay -x2 select0wb a, ay -x2 splitwb vv, uu, uv -splitwb t1, t2, uu -avgub u, t1, t2 -splitwb t1, t2, vv -avgub v, t1, t2 diff --git a/gst/dataurisrc/gstdataurisrc.c b/gst/dataurisrc/gstdataurisrc.c index 4589bccf5..0887dc247 100644 --- a/gst/dataurisrc/gstdataurisrc.c +++ b/gst/dataurisrc/gstdataurisrc.c @@ -61,55 +61,32 @@ static void gst_data_uri_src_set_property (GObject * object, static void gst_data_uri_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstCaps *gst_data_uri_src_get_caps (GstBaseSrc * src); +static GstCaps *gst_data_uri_src_get_caps (GstBaseSrc * src, GstCaps * filter); static gboolean gst_data_uri_src_get_size (GstBaseSrc * src, guint64 * size); static gboolean gst_data_uri_src_is_seekable (GstBaseSrc * src); static GstFlowReturn gst_data_uri_src_create (GstBaseSrc * src, guint64 offset, guint size, GstBuffer ** buf); -static gboolean gst_data_uri_src_check_get_range (GstBaseSrc * src); static gboolean gst_data_uri_src_start (GstBaseSrc * src); static void gst_data_uri_src_handler_init (gpointer g_iface, gpointer iface_data); -static GstURIType gst_data_uri_src_get_uri_type (void); -static gchar **gst_data_uri_src_get_protocols (void); -static const gchar *gst_data_uri_src_get_uri (GstURIHandler * handler); +static GstURIType gst_data_uri_src_get_uri_type (GType type); +static const gchar *const *gst_data_uri_src_get_protocols (GType type); +static gchar *gst_data_uri_src_get_uri (GstURIHandler * handler); static gboolean gst_data_uri_src_set_uri (GstURIHandler * handler, - const gchar * uri); + const gchar * uri, GError ** error); -static void -_do_init (GType gtype) -{ - static const GInterfaceInfo urihandler_info = { - gst_data_uri_src_handler_init, - 0, 0 - }; - - GST_DEBUG_CATEGORY_INIT (data_uri_src_debug, "dataurisrc", 0, - "data: URI source"); - g_type_add_interface_static (gtype, GST_TYPE_URI_HANDLER, &urihandler_info); -} -GST_BOILERPLATE_FULL (GstDataURISrc, gst_data_uri_src, GstBaseSrc, - GST_TYPE_BASE_SRC, _do_init); - -static void -gst_data_uri_src_base_init (gpointer klass) -{ - GstElementClass *element_class = (GstElementClass *) (klass); - - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_set_details_simple (element_class, - "data: URI source element", "Source", "Handles data: uris", - "Philippe Normand <pnormand@igalia.com>, " - "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - -} +#define gst_data_uri_src_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstDataURISrc, gst_data_uri_src, GST_TYPE_BASE_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, + gst_data_uri_src_handler_init)); static void gst_data_uri_src_class_init (GstDataURISrcClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *element_class = (GstElementClass *) klass; GstBaseSrcClass *basesrc_class = (GstBaseSrcClass *) klass; gobject_class->finalize = gst_data_uri_src_finalize; @@ -122,19 +99,26 @@ gst_data_uri_src_class_init (GstDataURISrcClass * klass) "URI that should be used", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_set_details_simple (element_class, + "data: URI source element", "Source", "Handles data: uris", + "Philippe Normand <pnormand@igalia.com>, " + "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); + + GST_DEBUG_CATEGORY_INIT (data_uri_src_debug, "dataurisrc", 0, + "data: URI source"); + basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_data_uri_src_get_caps); basesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_data_uri_src_get_size); basesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_data_uri_src_is_seekable); basesrc_class->create = GST_DEBUG_FUNCPTR (gst_data_uri_src_create); - basesrc_class->check_get_range = - GST_DEBUG_FUNCPTR (gst_data_uri_src_check_get_range); basesrc_class->start = GST_DEBUG_FUNCPTR (gst_data_uri_src_start); } static void -gst_data_uri_src_init (GstDataURISrc * src, GstDataURISrcClass * g_class) +gst_data_uri_src_init (GstDataURISrc * src) { - gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_BYTES); } static void @@ -161,7 +145,7 @@ gst_data_uri_src_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_URI: gst_data_uri_src_set_uri (GST_URI_HANDLER (src), - g_value_get_string (value)); + g_value_get_string (value), NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -187,16 +171,16 @@ gst_data_uri_src_get_property (GObject * object, } static GstCaps * -gst_data_uri_src_get_caps (GstBaseSrc * basesrc) +gst_data_uri_src_get_caps (GstBaseSrc * basesrc, GstCaps * filter) { GstDataURISrc *src = GST_DATA_URI_SRC (basesrc); GstCaps *caps; GST_OBJECT_LOCK (src); - if (!src->buffer || !GST_BUFFER_CAPS (src->buffer)) - caps = gst_caps_new_empty (); + if (gst_pad_has_current_caps (GST_BASE_SRC_PAD (basesrc))) + caps = gst_pad_get_current_caps (GST_BASE_SRC_PAD (basesrc)); else - caps = gst_buffer_get_caps (src->buffer); + caps = gst_caps_new_any (); GST_OBJECT_UNLOCK (src); return caps; @@ -214,7 +198,7 @@ gst_data_uri_src_get_size (GstBaseSrc * basesrc, guint64 * size) *size = -1; } else { ret = TRUE; - *size = GST_BUFFER_SIZE (src->buffer); + *size = gst_buffer_get_size (src->buffer); } GST_OBJECT_UNLOCK (src); @@ -241,14 +225,13 @@ gst_data_uri_src_create (GstBaseSrc * basesrc, guint64 offset, guint size, /* This is only correct because GstBaseSrc already clips size for us to be no * larger than the max. available size if a segment at the end is requested */ - if (offset + size > GST_BUFFER_SIZE (src->buffer)) { + if (offset + size > gst_buffer_get_size (src->buffer)) { ret = GST_FLOW_UNEXPECTED; } else { ret = GST_FLOW_OK; - *buf = gst_buffer_create_sub (src->buffer, offset, size); - gst_buffer_set_caps (*buf, GST_BUFFER_CAPS (src->buffer)); + *buf = + gst_buffer_copy_region (src->buffer, GST_BUFFER_COPY_ALL, offset, size); } - GST_OBJECT_UNLOCK (src); return ret; @@ -263,12 +246,6 @@ no_buffer: } static gboolean -gst_data_uri_src_check_get_range (GstBaseSrc * basesrc) -{ - return TRUE; -} - -static gboolean gst_data_uri_src_start (GstBaseSrc * basesrc) { GstDataURISrc *src = GST_DATA_URI_SRC (basesrc); @@ -293,41 +270,32 @@ no_uri: } } -static void -gst_data_uri_src_handler_init (gpointer g_iface, gpointer iface_data) -{ - GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; - - iface->get_type = gst_data_uri_src_get_uri_type; - iface->get_protocols = gst_data_uri_src_get_protocols; - iface->get_uri = gst_data_uri_src_get_uri; - iface->set_uri = gst_data_uri_src_set_uri; -} - static GstURIType -gst_data_uri_src_get_uri_type (void) +gst_data_uri_src_get_uri_type (GType type) { return GST_URI_SRC; } -static gchar ** -gst_data_uri_src_get_protocols (void) +static const gchar *const * +gst_data_uri_src_get_protocols (GType type) { - static gchar *protocols[] = { (char *) "data", 0 }; + static const gchar *protocols[] = { "data", 0 }; return protocols; } -static const gchar * +static gchar * gst_data_uri_src_get_uri (GstURIHandler * handler) { GstDataURISrc *src = GST_DATA_URI_SRC (handler); - return src->uri; + /* FIXME: make thread-safe */ + return g_strdup (src->uri); } static gboolean -gst_data_uri_src_set_uri (GstURIHandler * handler, const gchar * uri) +gst_data_uri_src_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) { GstDataURISrc *src = GST_DATA_URI_SRC (handler); gboolean ret = FALSE; @@ -336,12 +304,16 @@ gst_data_uri_src_set_uri (GstURIHandler * handler, const gchar * uri) const gchar *data_start; const gchar *orig_uri = uri; GstCaps *caps; + GstBuffer *buffer; gboolean base64 = FALSE; gchar *charset = NULL; + gpointer bdata; + gsize bsize; GST_OBJECT_LOCK (src); if (GST_STATE (src) >= GST_STATE_PAUSED) goto wrong_state; + GST_OBJECT_UNLOCK (src); /* uri must be an URI as defined in RFC 2397 * data:[<mediatype>][;base64],<data> @@ -391,83 +363,90 @@ gst_data_uri_src_set_uri (GstURIHandler * handler, const gchar * uri) /* Skip comma */ data_start += 1; if (base64) { - gsize bsize; - - src->buffer = gst_buffer_new (); - GST_BUFFER_DATA (src->buffer) = - (guint8 *) g_base64_decode (data_start, &bsize); - GST_BUFFER_MALLOCDATA (src->buffer) = GST_BUFFER_DATA (src->buffer); - GST_BUFFER_SIZE (src->buffer) = bsize; + bdata = g_base64_decode (data_start, &bsize); } else { - gchar *data; - /* URI encoded, i.e. "percent" encoding */ - data = g_uri_unescape_string (data_start, NULL); - if (data == NULL) + bdata = g_uri_unescape_string (data_start, NULL); + if (bdata == NULL) goto invalid_uri_encoded_data; - - src->buffer = gst_buffer_new (); - GST_BUFFER_DATA (src->buffer) = (guint8 *) data; - GST_BUFFER_MALLOCDATA (src->buffer) = GST_BUFFER_DATA (src->buffer); - GST_BUFFER_SIZE (src->buffer) = strlen (data) + 1; + bsize = strlen (bdata) + 1; } - /* Convert to UTF8 */ if (strcmp ("text/plain", mimetype) == 0 && charset && g_ascii_strcasecmp ("US-ASCII", charset) != 0 && g_ascii_strcasecmp ("UTF-8", charset) != 0) { gsize read; gsize written; - gchar *old_data = (gchar *) GST_BUFFER_DATA (src->buffer); - gchar *data; + gpointer data; data = - g_convert_with_fallback (old_data, -1, "UTF-8", charset, (char *) "*", + g_convert_with_fallback (bdata, -1, "UTF-8", charset, (char *) "*", &read, &written, NULL); - g_free (old_data); - GST_BUFFER_DATA (src->buffer) = GST_BUFFER_MALLOCDATA (src->buffer) = - (guint8 *) data; - GST_BUFFER_SIZE (src->buffer) = written; + g_free (bdata); + + bdata = data; + bsize = written; } + buffer = gst_buffer_new_wrapped (bdata, bsize); - caps = gst_type_find_helper_for_buffer (GST_OBJECT (src), src->buffer, NULL); + caps = gst_type_find_helper_for_buffer (GST_OBJECT (src), buffer, NULL); if (!caps) - caps = gst_caps_new_simple (mimetype, NULL); - gst_buffer_set_caps (src->buffer, caps); + caps = gst_caps_new_empty_simple (mimetype); + gst_base_src_set_caps (GST_BASE_SRC_CAST (src), caps); gst_caps_unref (caps); + GST_OBJECT_LOCK (src); + gst_buffer_replace (&src->buffer, buffer); g_free (src->uri); src->uri = g_strdup (orig_uri); + GST_OBJECT_UNLOCK (src); ret = TRUE; out: - GST_OBJECT_UNLOCK (src); - g_free (mimetype); g_free (charset); return ret; -invalid_uri: - { - GST_WARNING_OBJECT (src, "invalid URI '%s'", uri); - goto out; - } wrong_state: { GST_WARNING_OBJECT (src, "Can't set URI in %s state", gst_element_state_get_name (GST_STATE (src))); + GST_OBJECT_UNLOCK (src); + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE, + "Changing the 'uri' property on dataurisrc while it is running " + "is not supported"); + goto out; + } +invalid_uri: + { + GST_WARNING_OBJECT (src, "invalid URI '%s'", uri); + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Invalid data URI"); goto out; } invalid_uri_encoded_data: { GST_WARNING_OBJECT (src, "Failed to parse data encoded in URI '%s'", uri); + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Could not parse data encoded in data URI"); goto out; } } +static void +gst_data_uri_src_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_data_uri_src_get_uri_type; + iface->get_protocols = gst_data_uri_src_get_protocols; + iface->get_uri = gst_data_uri_src_get_uri; + iface->set_uri = gst_data_uri_src_set_uri; +} + static gboolean plugin_init (GstPlugin * plugin) { diff --git a/gst/dccp/gstdccpclientsink.c b/gst/dccp/gstdccpclientsink.c index b4ccc87c0..a890dcb71 100644 --- a/gst/dccp/gstdccpclientsink.c +++ b/gst/dccp/gstdccpclientsink.c @@ -228,7 +228,8 @@ gst_dccp_client_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "DCCP client sink", "Sink/Network", diff --git a/gst/dccp/gstdccpclientsrc.c b/gst/dccp/gstdccpclientsrc.c index f95d9a731..55f9185e9 100644 --- a/gst/dccp/gstdccpclientsrc.c +++ b/gst/dccp/gstdccpclientsrc.c @@ -272,7 +272,8 @@ gst_dccp_client_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); gst_element_class_set_details_simple (element_class, "DCCP client source", "Source/Network", diff --git a/gst/dccp/gstdccpserversink.c b/gst/dccp/gstdccpserversink.c index bb0e6f726..089fe3a66 100644 --- a/gst/dccp/gstdccpserversink.c +++ b/gst/dccp/gstdccpserversink.c @@ -336,7 +336,8 @@ gst_dccp_server_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "DCCP server sink", "Sink/Network", diff --git a/gst/dccp/gstdccpserversrc.c b/gst/dccp/gstdccpserversrc.c index aa9256d47..5dbb63313 100644 --- a/gst/dccp/gstdccpserversrc.c +++ b/gst/dccp/gstdccpserversrc.c @@ -262,7 +262,8 @@ gst_dccp_server_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); gst_element_class_set_details_simple (element_class, "DCCP server source", "Source/Network", diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c index 8fe89155e..489d88183 100644 --- a/gst/debugutils/fpsdisplaysink.c +++ b/gst/debugutils/fpsdisplaysink.c @@ -205,8 +205,8 @@ fps_display_sink_class_init (GstFPSDisplaySinkClass * klass) gstelement_klass->change_state = fps_display_sink_change_state; - gst_element_class_add_static_pad_template (gstelement_klass, - &fps_display_sink_template); + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&fps_display_sink_template)); gst_element_class_set_details_simple (gstelement_klass, "Measure and show framerate on videosink", "Sink/Video", diff --git a/gst/debugutils/gstchecksumsink.c b/gst/debugutils/gstchecksumsink.c index 5beef5a18..bf9fba6f2 100644 --- a/gst/debugutils/gstchecksumsink.c +++ b/gst/debugutils/gstchecksumsink.c @@ -55,10 +55,10 @@ gst_checksum_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_checksum_sink_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_checksum_sink_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_checksum_sink_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_checksum_sink_sink_template)); gst_element_class_set_details_simple (element_class, "Checksum sink", "Debug/Sink", "Calculates a checksum for buffers", diff --git a/gst/debugutils/gstchopmydata.c b/gst/debugutils/gstchopmydata.c index 48da58f5e..16109ad81 100644 --- a/gst/debugutils/gstchopmydata.c +++ b/gst/debugutils/gstchopmydata.c @@ -98,10 +98,10 @@ gst_chop_my_data_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_chop_my_data_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_chop_my_data_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_chop_my_data_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_chop_my_data_sink_template)); gst_element_class_set_details_simple (element_class, "FIXME", "Generic", "FIXME", "David Schleef <ds@schleef.org>"); diff --git a/gst/debugutils/gstcompare.c b/gst/debugutils/gstcompare.c index b20a8d056..7e4a5c11a 100644 --- a/gst/debugutils/gstcompare.c +++ b/gst/debugutils/gstcompare.c @@ -123,10 +123,12 @@ gst_compare_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, - &check_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&check_sink_factory)); gst_element_class_set_details_simple (element_class, "Compare buffers", "Filter/Debug", "Compares incoming buffers", "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>"); diff --git a/gst/debugutils/gstdebugspy.c b/gst/debugutils/gstdebugspy.c index 72387ce41..0c9e3300f 100644 --- a/gst/debugutils/gstdebugspy.c +++ b/gst/debugutils/gstdebugspy.c @@ -120,8 +120,10 @@ gst_debug_spy_base_init (gpointer gclass) "DebugSpy provides information on buffers with bus messages", "Guillaume Emont <gemont@igalia.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the debugspy's class */ diff --git a/gst/dtmf/gstdtmfdetect.c b/gst/dtmf/gstdtmfdetect.c index 7d76aa067..0bb924264 100644 --- a/gst/dtmf/gstdtmfdetect.c +++ b/gst/dtmf/gstdtmfdetect.c @@ -118,8 +118,10 @@ gst_dtmf_detect_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &srctemplate); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "DTMF detector element", "Filter/Analyzer/Audio", diff --git a/gst/dtmf/gstdtmfsrc.c b/gst/dtmf/gstdtmfsrc.c index e3face849..929147fe0 100644 --- a/gst/dtmf/gstdtmfsrc.c +++ b/gst/dtmf/gstdtmfsrc.c @@ -241,8 +241,8 @@ gst_dtmf_src_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (gst_dtmf_src_debug, "dtmfsrc", 0, "dtmfsrc element"); - gst_element_class_add_static_pad_template (element_class, - &gst_dtmf_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dtmf_src_template)); gst_element_class_set_details_simple (element_class, "DTMF tone generator", "Source/Audio", diff --git a/gst/dtmf/gstrtpdtmfdepay.c b/gst/dtmf/gstrtpdtmfdepay.c index da1ec2f95..603416dd6 100644 --- a/gst/dtmf/gstrtpdtmfdepay.c +++ b/gst/dtmf/gstrtpdtmfdepay.c @@ -216,10 +216,10 @@ gst_rtp_dtmf_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_dtmf_depay_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_dtmf_depay_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_dtmf_depay_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_dtmf_depay_sink_template)); GST_DEBUG_CATEGORY_INIT (gst_rtp_dtmf_depay_debug, diff --git a/gst/dtmf/gstrtpdtmfsrc.c b/gst/dtmf/gstrtpdtmfsrc.c index 605aca45e..ee8703563 100644 --- a/gst/dtmf/gstrtpdtmfsrc.c +++ b/gst/dtmf/gstrtpdtmfsrc.c @@ -208,8 +208,8 @@ gst_rtp_dtmf_src_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (gst_rtp_dtmf_src_debug, "rtpdtmfsrc", 0, "rtpdtmfsrc element"); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_dtmf_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_dtmf_src_template)); gst_element_class_set_details_simple (element_class, "RTP DTMF packet generator", "Source/Network", diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c index 3c2cab3e4..4e1fb378e 100644 --- a/gst/dvbsuboverlay/gstdvbsuboverlay.c +++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c @@ -27,8 +27,8 @@ * <title>Example launch line</title> * |[ FIXME * gst-launch -v filesrc location=/path/to/ts ! mpegtsdemux name=d ! queue ! mp3parse ! mad ! audioconvert ! autoaudiosink \ - * d. ! queue ! mpeg2dec ! ffmpegcolorspace ! r. \ - * d. ! queue ! "subpicture/x-dvb" ! dvbsuboverlay name=r ! ffmpegcolorspace ! autovideosink + * d. ! queue ! mpeg2dec ! videoconvert ! r. \ + * d. ! queue ! "subpicture/x-dvb" ! dvbsuboverlay name=r ! videoconvert ! autovideosink * ]| This pipeline demuxes a MPEG-TS file with MPEG2 video, MP3 audio and embedded DVB subtitles and renders the subtitles on top of the video. * </refsect2> */ @@ -64,14 +64,14 @@ enum static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("I420")) ); static GstStaticPadTemplate video_sink_factory = GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("I420")) ); static GstStaticPadTemplate text_sink_factory = @@ -91,46 +91,30 @@ static void gst_dvbsub_overlay_finalize (GObject * object); static GstStateChangeReturn gst_dvbsub_overlay_change_state (GstElement * element, GstStateChange transition); -GST_BOILERPLATE (GstDVBSubOverlay, gst_dvbsub_overlay, GstElement, - GST_TYPE_ELEMENT); +#define gst_dvbsub_overlay_parent_class parent_class +G_DEFINE_TYPE (GstDVBSubOverlay, gst_dvbsub_overlay, GST_TYPE_ELEMENT); -static GstCaps *gst_dvbsub_overlay_getcaps (GstPad * pad); - -static gboolean gst_dvbsub_overlay_setcaps_video (GstPad * pad, GstCaps * caps); +static GstCaps *gst_dvbsub_overlay_getcaps (GstPad * pad, GstCaps * filter); static GstFlowReturn gst_dvbsub_overlay_chain_video (GstPad * pad, - GstBuffer * buf); + GstObject * parent, GstBuffer * buf); static GstFlowReturn gst_dvbsub_overlay_chain_text (GstPad * pad, - GstBuffer * buf); + GstObject * parent, GstBuffer * buf); -static gboolean gst_dvbsub_overlay_event_video (GstPad * pad, GstEvent * event); -static gboolean gst_dvbsub_overlay_event_text (GstPad * pad, GstEvent * event); -static gboolean gst_dvbsub_overlay_event_src (GstPad * pad, GstEvent * event); +static gboolean gst_dvbsub_overlay_event_video (GstPad * pad, + GstObject * parent, GstEvent * event); +static gboolean gst_dvbsub_overlay_event_text (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_dvbsub_overlay_event_src (GstPad * pad, GstObject * parent, + GstEvent * event); static void new_dvb_subtitles_cb (DvbSub * dvb_sub, DVBSubtitles * subs, gpointer user_data); -static GstFlowReturn gst_dvbsub_overlay_bufferalloc_video (GstPad * pad, - guint64 offset, guint size, GstCaps * caps, GstBuffer ** buffer); - -static gboolean gst_dvbsub_overlay_query_src (GstPad * pad, GstQuery * query); - -static void -gst_dvbsub_overlay_base_init (gpointer gclass) -{ - GstElementClass *element_class = (GstElementClass *) gclass; - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &text_sink_factory); - - gst_element_class_set_details_simple (element_class, - "DVB Subtitles Overlay", - "Mixer/Video/Overlay/Subtitle", - "Renders DVB subtitles", "Mart Raudsepp <mart.raudsepp@collabora.co.uk>"); -} +static gboolean gst_dvbsub_overlay_query_video (GstPad * pad, + GstObject * parent, GstQuery * query); +static gboolean gst_dvbsub_overlay_query_src (GstPad * pad, GstObject * parent, + GstQuery * query); /* initialize the plugin's class */ static void @@ -155,6 +139,18 @@ gst_dvbsub_overlay_class_init (GstDVBSubOverlayClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_change_state); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&video_sink_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&text_sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, + "DVB Subtitles Overlay", + "Mixer/Video/Overlay/Subtitle", + "Renders DVB subtitles", "Mart Raudsepp <mart.raudsepp@collabora.co.uk>"); } static void @@ -185,8 +181,7 @@ gst_dvbsub_overlay_flush_subtitles (GstDVBSubOverlay * render) } static void -gst_dvbsub_overlay_init (GstDVBSubOverlay * render, - GstDVBSubOverlayClass * gclass) +gst_dvbsub_overlay_init (GstDVBSubOverlay * render) { GST_DEBUG_OBJECT (render, "init"); @@ -196,14 +191,6 @@ gst_dvbsub_overlay_init (GstDVBSubOverlay * render, render->text_sinkpad = gst_pad_new_from_static_template (&text_sink_factory, "text_sink"); - gst_pad_set_setcaps_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_setcaps_video)); - - gst_pad_set_getcaps_function (render->srcpad, - GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_getcaps)); - gst_pad_set_getcaps_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_getcaps)); - gst_pad_set_chain_function (render->video_sinkpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_chain_video)); gst_pad_set_chain_function (render->text_sinkpad, @@ -216,9 +203,8 @@ gst_dvbsub_overlay_init (GstDVBSubOverlay * render, gst_pad_set_event_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_event_src)); - gst_pad_set_bufferalloc_function (render->video_sinkpad, - GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_bufferalloc_video)); - + gst_pad_set_query_function (render->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_query_video)); gst_pad_set_query_function (render->srcpad, GST_DEBUG_FUNCPTR (gst_dvbsub_overlay_query_src)); @@ -226,8 +212,7 @@ gst_dvbsub_overlay_init (GstDVBSubOverlay * render, gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad); gst_element_add_pad (GST_ELEMENT (render), render->text_sinkpad); - render->width = 0; - render->height = 0; + gst_video_info_init (&render->info); render->current_subtitle = NULL; render->pending_subtitles = g_queue_new (); @@ -331,7 +316,7 @@ gst_dvbsub_overlay_change_state (GstElement * element, gst_dvbsub_overlay_flush_subtitles (render); gst_segment_init (&render->video_segment, GST_FORMAT_TIME); gst_segment_init (&render->subtitle_segment, GST_FORMAT_TIME); - render->format = GST_VIDEO_FORMAT_UNKNOWN; + gst_video_info_init (&render->info); break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_NULL: @@ -344,21 +329,37 @@ gst_dvbsub_overlay_change_state (GstElement * element, } static gboolean -gst_dvbsub_overlay_query_src (GstPad * pad, GstQuery * query) +gst_dvbsub_overlay_query_src (GstPad * pad, GstObject * parent, + GstQuery * query) { - GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); + GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (parent); gboolean ret; - ret = gst_pad_peer_query (render->video_sinkpad, query); + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_dvbsub_overlay_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + ret = TRUE; + break; + } + default: + ret = gst_pad_peer_query (render->video_sinkpad, query); + break; + } - gst_object_unref (render); return ret; } static gboolean -gst_dvbsub_overlay_event_src (GstPad * pad, GstEvent * event) +gst_dvbsub_overlay_event_src (GstPad * pad, GstObject * parent, + GstEvent * event) { - GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); + GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (parent); gboolean ret = FALSE; switch (GST_EVENT_TYPE (event)) { @@ -392,13 +393,11 @@ gst_dvbsub_overlay_event_src (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } static GstCaps * -gst_dvbsub_overlay_getcaps (GstPad * pad) +gst_dvbsub_overlay_getcaps (GstPad * pad, GstCaps * filter) { GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); GstPad *otherpad; @@ -410,7 +409,7 @@ gst_dvbsub_overlay_getcaps (GstPad * pad) otherpad = render->srcpad; /* we can do what the peer can */ - caps = gst_pad_peer_get_caps (otherpad); + caps = gst_pad_peer_query_caps (otherpad, filter); if (caps) { GstCaps *temp; const GstCaps *templ; @@ -432,7 +431,8 @@ gst_dvbsub_overlay_getcaps (GstPad * pad) } static void -blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer) +blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, + GstVideoFrame * frame) { guint counter; DVBSubtitleRect *sub_region; @@ -445,28 +445,24 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer) guint8 *dst_y, *dst_y2, *dst_u, *dst_v; gint x, y; gint w2; - gint width = overlay->width; - gint height = overlay->height; + gint width; + gint height; gint src_stride; - gint y_offset, y_stride; - gint u_offset, u_stride; - gint v_offset, v_stride; + guint8 *y_data, *u_data, *v_data; + gint y_stride, u_stride, v_stride; gint scale = 0; gint scale_x = 0, scale_y = 0; /* 16.16 fixed point */ - y_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, width, - height); - u_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 1, width, - height); - v_offset = - gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 2, width, - height); + width = GST_VIDEO_FRAME_WIDTH (frame); + height = GST_VIDEO_FRAME_HEIGHT (frame); - y_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, width); - u_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, width); - v_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 2, width); + y_data = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + u_data = GST_VIDEO_FRAME_COMP_DATA (frame, 1); + v_data = GST_VIDEO_FRAME_COMP_DATA (frame, 2); + + y_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + u_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 1); + v_stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 2); if (width != subs->display_def.display_width && height != subs->display_def.display_height) { @@ -518,10 +514,10 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer) src_stride = sub_region->pict.rowstride; src = sub_region->pict.data; - dst_y = buffer->data + y_offset + dy * y_stride + dx; - dst_y2 = buffer->data + y_offset + (dy + 1) * y_stride + dx; - dst_u = buffer->data + u_offset + ((dy + 1) / 2) * u_stride + (dx + 1) / 2; - dst_v = buffer->data + v_offset + ((dy + 1) / 2) * v_stride + (dx + 1) / 2; + dst_y = y_data + dy * y_stride + dx; + dst_y2 = y_data + (dy + 1) * y_stride + dx; + dst_u = u_data + ((dy + 1) / 2) * u_stride + (dx + 1) / 2; + dst_v = v_data + ((dy + 1) / 2) * v_stride + (dx + 1) / 2; sy = 0; for (y = 0; y < dh - 1; y += 2) { @@ -676,20 +672,12 @@ gst_dvbsub_overlay_setcaps_video (GstPad * pad, GstCaps * caps) { GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); gboolean ret = FALSE; + GstVideoInfo info; - render->width = 0; - render->height = 0; - - if (!gst_video_format_parse_caps (caps, &render->format, &render->width, - &render->height) || - !gst_video_parse_caps_framerate (caps, &render->fps_n, &render->fps_d)) { - GST_ERROR_OBJECT (render, "Can't parse caps: %" GST_PTR_FORMAT, caps); - ret = FALSE; - goto out; - } + if (!gst_video_info_from_caps (&info, caps)) + goto invalid_caps; - gst_video_parse_caps_pixel_aspect_ratio (caps, &render->par_n, - &render->par_d); + render->info = info; ret = gst_pad_set_caps (render->srcpad, caps); if (!ret) @@ -701,23 +689,37 @@ out: gst_object_unref (render); return ret; + + /* ERRORS */ +invalid_caps: + { + GST_ERROR_OBJECT (render, "Can't parse caps: %" GST_PTR_FORMAT, caps); + ret = FALSE; + goto out; + } } static void gst_dvbsub_overlay_process_text (GstDVBSubOverlay * overlay, GstBuffer * buffer, guint64 pts) { - guint8 *data = (guint8 *) GST_BUFFER_DATA (buffer); - guint size = GST_BUFFER_SIZE (buffer); + guint8 *data; + gsize size; GST_DEBUG_OBJECT (overlay, "Processing subtitles with fake PTS=%" G_GUINT64_FORMAT " which is a running time of %" GST_TIME_FORMAT, pts, GST_TIME_ARGS (pts)); - GST_DEBUG_OBJECT (overlay, "Feeding %u bytes to libdvbsub", size); + GST_DEBUG_OBJECT (overlay, "Feeding %" G_GSIZE_FORMAT " bytes to libdvbsub", + size); + + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + g_mutex_lock (overlay->dvbsub_mutex); dvb_sub_feed_with_pts (overlay->dvb_sub, pts, data, size); g_mutex_unlock (overlay->dvbsub_mutex); + + gst_buffer_unmap (buffer, data, size); gst_buffer_unref (buffer); } @@ -741,35 +743,15 @@ new_dvb_subtitles_cb (DvbSub * dvb_sub, DVBSubtitles * subs, gpointer user_data) } static GstFlowReturn -gst_dvbsub_overlay_bufferalloc_video (GstPad * pad, guint64 offset, guint size, - GstCaps * caps, GstBuffer ** buffer) +gst_dvbsub_overlay_chain_text (GstPad * pad, GstObject * parent, + GstBuffer * buffer) { - GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); - GstFlowReturn ret = GST_FLOW_WRONG_STATE; - GstPad *allocpad; - - GST_OBJECT_LOCK (render); - allocpad = render->srcpad ? gst_object_ref (render->srcpad) : NULL; - GST_OBJECT_UNLOCK (render); - - if (allocpad) { - ret = gst_pad_alloc_buffer (allocpad, offset, size, caps, buffer); - gst_object_unref (allocpad); - } - - gst_object_unref (render); - - return ret; -} - -static GstFlowReturn -gst_dvbsub_overlay_chain_text (GstPad * pad, GstBuffer * buffer) -{ - GstDVBSubOverlay *overlay = GST_DVBSUB_OVERLAY (GST_PAD_PARENT (pad)); + GstDVBSubOverlay *overlay = GST_DVBSUB_OVERLAY (parent); GstClockTime sub_running_time; - GST_INFO_OBJECT (overlay, "subpicture/x-dvb buffer with size %u", - GST_BUFFER_SIZE (buffer)); + GST_INFO_OBJECT (overlay, + "subpicture/x-dvb buffer with size %" G_GSIZE_FORMAT, + gst_buffer_get_size (buffer)); GST_LOG_OBJECT (overlay, "Video segment: %" GST_SEGMENT_FORMAT " --- Subtitle segment: %" @@ -792,8 +774,7 @@ gst_dvbsub_overlay_chain_text (GstPad * pad, GstBuffer * buffer) * FIXME: does our waiting + render code work when there are more than one packets before * FIXME: rendering callback will get called? */ - gst_segment_set_last_stop (&overlay->subtitle_segment, GST_FORMAT_TIME, - GST_BUFFER_TIMESTAMP (buffer)); + overlay->subtitle_segment.position = GST_BUFFER_TIMESTAMP (buffer); sub_running_time = gst_segment_to_running_time (&overlay->subtitle_segment, GST_FORMAT_TIME, @@ -809,16 +790,17 @@ gst_dvbsub_overlay_chain_text (GstPad * pad, GstBuffer * buffer) } static GstFlowReturn -gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) +gst_dvbsub_overlay_chain_video (GstPad * pad, GstObject * parent, + GstBuffer * buffer) { - GstDVBSubOverlay *overlay = GST_DVBSUB_OVERLAY (GST_PAD_PARENT (pad)); + GstDVBSubOverlay *overlay = GST_DVBSUB_OVERLAY (parent); GstFlowReturn ret = GST_FLOW_OK; gint64 start, stop; - gint64 cstart, cstop; + guint64 cstart, cstop; gboolean in_seg; GstClockTime vid_running_time, vid_running_time_end; - if (overlay->format == GST_VIDEO_FORMAT_UNKNOWN) + if (GST_VIDEO_INFO_FORMAT (&overlay->info) == GST_VIDEO_FORMAT_UNKNOWN) return GST_FLOW_NOT_NEGOTIATED; if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) @@ -827,10 +809,10 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) start = GST_BUFFER_TIMESTAMP (buffer); GST_LOG_OBJECT (overlay, - "Video segment: %" GST_SEGMENT_FORMAT " --- Subtitle last_stop: %" + "Video segment: %" GST_SEGMENT_FORMAT " --- Subtitle position: %" GST_TIME_FORMAT " --- BUFFER: ts=%" GST_TIME_FORMAT, &overlay->video_segment, - GST_TIME_ARGS (overlay->subtitle_segment.last_stop), + GST_TIME_ARGS (overlay->subtitle_segment.position), GST_TIME_ARGS (start)); /* ignore buffers that are outside of the current segment */ @@ -848,7 +830,7 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) return GST_FLOW_OK; } - buffer = gst_buffer_make_metadata_writable (buffer); + buffer = gst_buffer_make_writable (buffer); GST_BUFFER_TIMESTAMP (buffer) = cstart; if (GST_BUFFER_DURATION_IS_VALID (buffer)) GST_BUFFER_DURATION (buffer) = cstop - cstart; @@ -866,8 +848,7 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) GST_DEBUG_OBJECT (overlay, "Video running time: %" GST_TIME_FORMAT, GST_TIME_ARGS (vid_running_time)); - gst_segment_set_last_stop (&overlay->video_segment, GST_FORMAT_TIME, - GST_BUFFER_TIMESTAMP (buffer)); + overlay->video_segment.position = GST_BUFFER_TIMESTAMP (buffer); g_mutex_lock (overlay->dvbsub_mutex); if (!g_queue_is_empty (overlay->pending_subtitles)) { @@ -891,7 +872,7 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) dvb_subtitles_free (tmp); tmp = NULL; } else if (tmp->pts + tmp->page_time_out * GST_SECOND * - overlay->subtitle_segment.abs_rate >= vid_running_time) { + ABS (overlay->subtitle_segment.rate) >= vid_running_time) { if (candidate) dvb_subtitles_free (candidate); candidate = tmp; @@ -921,7 +902,7 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) && vid_running_time > (overlay->current_subtitle->pts + overlay->current_subtitle->page_time_out * GST_SECOND * - overlay->subtitle_segment.abs_rate)) { + ABS (overlay->subtitle_segment.rate))) { GST_INFO_OBJECT (overlay, "Subtitle page not redefined before fallback page_time_out of %u seconds (missed data?) - deleting current page", overlay->current_subtitle->page_time_out); @@ -931,8 +912,12 @@ gst_dvbsub_overlay_chain_video (GstPad * pad, GstBuffer * buffer) /* Now render it */ if (g_atomic_int_get (&overlay->enable) && overlay->current_subtitle) { + GstVideoFrame frame; + buffer = gst_buffer_make_writable (buffer); - blit_i420 (overlay, overlay->current_subtitle, buffer); + gst_video_frame_map (&frame, &overlay->info, buffer, GST_MAP_WRITE); + blit_i420 (overlay, overlay->current_subtitle, &frame); + gst_video_frame_unmap (&frame); } g_mutex_unlock (overlay->dvbsub_mutex); @@ -949,33 +934,64 @@ missing_timestamp: } static gboolean -gst_dvbsub_overlay_event_video (GstPad * pad, GstEvent * event) +gst_dvbsub_overlay_query_video (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + gboolean ret; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_dvbsub_overlay_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + ret = TRUE; + break; + } + default: + ret = gst_pad_query_default (pad, parent, query); + break; + } + + return ret; +} + +static gboolean +gst_dvbsub_overlay_event_video (GstPad * pad, GstObject * parent, + GstEvent * event) { gboolean ret = FALSE; - GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); + GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (parent); GST_DEBUG_OBJECT (pad, "received video event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_dvbsub_overlay_setcaps_video (pad, caps); + gst_event_unref (event); + break; + } + case GST_EVENT_SEGMENT: { - GstFormat format; - gdouble rate; - gint64 start, stop, time; - gboolean update; + GstSegment seg; GST_DEBUG_OBJECT (render, "received new segment"); - gst_event_parse_new_segment (event, &update, &rate, &format, &start, - &stop, &time); + gst_event_copy_segment (event, &seg); - if (format == GST_FORMAT_TIME) { + if (seg.format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (render, "VIDEO SEGMENT now: %" GST_SEGMENT_FORMAT, &render->video_segment); - gst_segment_set_newsegment (&render->video_segment, update, rate, - format, start, stop, time); + render->video_segment = seg; GST_DEBUG_OBJECT (render, "VIDEO SEGMENT after: %" GST_SEGMENT_FORMAT, &render->video_segment); @@ -995,38 +1011,32 @@ gst_dvbsub_overlay_event_video (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } static gboolean -gst_dvbsub_overlay_event_text (GstPad * pad, GstEvent * event) +gst_dvbsub_overlay_event_text (GstPad * pad, GstObject * parent, + GstEvent * event) { gboolean ret = FALSE; - GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (gst_pad_get_parent (pad)); + GstDVBSubOverlay *render = GST_DVBSUB_OVERLAY (parent); GST_DEBUG_OBJECT (pad, "received text event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - GstFormat format; - gdouble rate; - gint64 start, stop, time; - gboolean update; + GstSegment seg; GST_DEBUG_OBJECT (render, "received new segment"); - gst_event_parse_new_segment (event, &update, &rate, &format, &start, - &stop, &time); + gst_event_copy_segment (event, &seg); - if (format == GST_FORMAT_TIME) { + if (seg.format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (render, "SUBTITLE SEGMENT now: %" GST_SEGMENT_FORMAT, &render->subtitle_segment); - gst_segment_set_newsegment (&render->subtitle_segment, update, rate, - format, start, stop, time); + render->subtitle_segment = seg; GST_DEBUG_OBJECT (render, "SUBTITLE SEGMENT after: %" GST_SEGMENT_FORMAT, @@ -1063,8 +1073,6 @@ gst_dvbsub_overlay_event_text (GstPad * pad, GstEvent * event) break; } - gst_object_unref (render); - return ret; } diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.h b/gst/dvbsuboverlay/gstdvbsuboverlay.h index 012c728eb..e7e227d53 100644 --- a/gst/dvbsuboverlay/gstdvbsuboverlay.h +++ b/gst/dvbsuboverlay/gstdvbsuboverlay.h @@ -50,10 +50,7 @@ struct _GstDVBSubOverlay GstSegment video_segment; GstSegment subtitle_segment; - GstVideoFormat format; - gint width, height; - gint fps_n, fps_d; - gint par_n, par_d; + GstVideoInfo info; DVBSubtitles *current_subtitle; /* The currently active set of subtitle regions, if any */ GQueue *pending_subtitles; /* A queue of raw subtitle region sets with diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c index f57d3c20b..937e27840 100644 --- a/gst/dvdspu/gstdvdspu.c +++ b/gst/dvdspu/gstdvdspu.c @@ -55,7 +55,7 @@ static GstStaticPadTemplate video_sink_factory = GST_STATIC_PAD_TEMPLATE ("video", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv, " "format = (fourcc) { I420 }, " + GST_STATIC_CAPS ("video/x-raw, " "format = (string) { I420 }, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ]") /* FIXME: Can support YV12 one day too */ ); @@ -63,7 +63,7 @@ GST_STATIC_PAD_TEMPLATE ("video", static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv, " "format = (fourcc) { I420 }, " + GST_STATIC_CAPS ("video/x-raw, " "format = (string) { I420 }, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ]") /* FIXME: Can support YV12 one day too */ ); @@ -82,26 +82,35 @@ static const guint32 default_clut[16] = { 0x808080, 0x808080, 0x808080, 0x808080 }; -GST_BOILERPLATE (GstDVDSpu, gst_dvd_spu, GstElement, GST_TYPE_ELEMENT); +#define gst_dvd_spu_parent_class parent_class +G_DEFINE_TYPE (GstDVDSpu, gst_dvd_spu, GST_TYPE_ELEMENT); static void gst_dvd_spu_dispose (GObject * object); static void gst_dvd_spu_finalize (GObject * object); static GstStateChangeReturn gst_dvd_spu_change_state (GstElement * element, GstStateChange transition); -static gboolean gst_dvd_spu_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_dvd_spu_src_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_dvd_spu_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); -static GstCaps *gst_dvd_spu_video_proxy_getcaps (GstPad * pad); +static GstCaps *gst_dvd_spu_video_proxy_getcaps (GstPad * pad, + GstCaps * filter); static gboolean gst_dvd_spu_video_set_caps (GstPad * pad, GstCaps * caps); -static GstFlowReturn gst_dvd_spu_video_chain (GstPad * pad, GstBuffer * buf); -static gboolean gst_dvd_spu_video_event (GstPad * pad, GstEvent * event); -static GstFlowReturn gst_dvd_spu_buffer_alloc (GstPad * sinkpad, guint64 offset, - guint size, GstCaps * caps, GstBuffer ** buf); +static GstFlowReturn gst_dvd_spu_video_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); +static gboolean gst_dvd_spu_video_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_dvd_spu_video_query (GstPad * pad, GstObject * parent, + GstQuery * query); static void gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu, gboolean force); static void gst_dvd_spu_check_still_updates (GstDVDSpu * dvdspu); -static GstFlowReturn gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf); -static gboolean gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_dvd_spu_subpic_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); +static gboolean gst_dvd_spu_subpic_event (GstPad * pad, GstObject * parent, + GstEvent * event); static gboolean gst_dvd_spu_subpic_set_caps (GstPad * pad, GstCaps * caps); static void gst_dvd_spu_clear (GstDVDSpu * dvdspu); @@ -114,60 +123,50 @@ dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf); static void gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event); static void -gst_dvd_spu_base_init (gpointer gclass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &subpic_sink_factory); - gst_element_class_set_details_simple (element_class, "Sub-picture Overlay", - "Mixer/Video/Overlay/SubPicture/DVD/Bluray", - "Parses Sub-Picture command streams and renders the SPU overlay " - "onto the video as it passes through", - "Jan Schmidt <thaytan@noraisin.net>"); - - element_class->change_state = gst_dvd_spu_change_state; -} - -static void gst_dvd_spu_class_init (GstDVDSpuClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; gobject_class->dispose = (GObjectFinalizeFunc) gst_dvd_spu_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_dvd_spu_finalize; + + gstelement_class->change_state = gst_dvd_spu_change_state; + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&video_sink_factory)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&subpic_sink_factory)); + + gst_element_class_set_details_simple (gstelement_class, "Sub-picture Overlay", + "Mixer/Video/Overlay/SubPicture/DVD/Bluray", + "Parses Sub-Picture command streams and renders the SPU overlay " + "onto the video as it passes through", + "Jan Schmidt <thaytan@noraisin.net>"); } static void -gst_dvd_spu_init (GstDVDSpu * dvdspu, GstDVDSpuClass * gclass) +gst_dvd_spu_init (GstDVDSpu * dvdspu) { dvdspu->videosinkpad = gst_pad_new_from_static_template (&video_sink_factory, "video"); - gst_pad_set_setcaps_function (dvdspu->videosinkpad, - gst_dvd_spu_video_set_caps); - gst_pad_set_getcaps_function (dvdspu->videosinkpad, - gst_dvd_spu_video_proxy_getcaps); gst_pad_set_chain_function (dvdspu->videosinkpad, gst_dvd_spu_video_chain); gst_pad_set_event_function (dvdspu->videosinkpad, gst_dvd_spu_video_event); - gst_pad_set_bufferalloc_function (dvdspu->videosinkpad, - gst_dvd_spu_buffer_alloc); + gst_pad_set_query_function (dvdspu->videosinkpad, gst_dvd_spu_video_query); dvdspu->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_set_event_function (dvdspu->srcpad, gst_dvd_spu_src_event); - gst_pad_set_getcaps_function (dvdspu->srcpad, - gst_dvd_spu_video_proxy_getcaps); + gst_pad_set_query_function (dvdspu->srcpad, gst_dvd_spu_src_query); dvdspu->subpic_sinkpad = gst_pad_new_from_static_template (&subpic_sink_factory, "subpicture"); gst_pad_set_chain_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_chain); gst_pad_set_event_function (dvdspu->subpic_sinkpad, gst_dvd_spu_subpic_event); - gst_pad_set_setcaps_function (dvdspu->subpic_sinkpad, - gst_dvd_spu_subpic_set_caps); gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->videosinkpad); gst_element_add_pad (GST_ELEMENT (dvdspu), dvdspu->subpic_sinkpad); @@ -190,8 +189,8 @@ gst_dvd_spu_clear (GstDVDSpu * dvdspu) gst_buffer_replace (&dvdspu->ref_frame, NULL); gst_buffer_replace (&dvdspu->pending_frame, NULL); - dvdspu->spu_state.fps_n = 25; - dvdspu->spu_state.fps_d = 1; + dvdspu->spu_state.info.fps_n = 25; + dvdspu->spu_state.info.fps_d = 1; gst_segment_init (&dvdspu->video_seg, GST_FORMAT_UNDEFINED); } @@ -278,25 +277,10 @@ gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu, gboolean keep_events) } } -/* Proxy buffer allocations on the video sink pad downstream */ -static GstFlowReturn -gst_dvd_spu_buffer_alloc (GstPad * sinkpad, guint64 offset, guint size, - GstCaps * caps, GstBuffer ** buf) -{ - GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (sinkpad)); - GstFlowReturn ret = GST_FLOW_OK; - - ret = gst_pad_alloc_buffer (dvdspu->srcpad, offset, size, caps, buf); - - gst_object_unref (dvdspu); - - return ret; -} - static gboolean -gst_dvd_spu_src_event (GstPad * pad, GstEvent * event) +gst_dvd_spu_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { - GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad)); + GstDVDSpu *dvdspu = GST_DVD_SPU (parent); GstPad *peer; gboolean res = TRUE; @@ -305,8 +289,31 @@ gst_dvd_spu_src_event (GstPad * pad, GstEvent * event) res = gst_pad_send_event (peer, event); gst_object_unref (peer); } + return res; +} + +static gboolean +gst_dvd_spu_src_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_dvd_spu_video_proxy_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } - gst_object_unref (dvdspu); return res; } @@ -315,39 +322,21 @@ gst_dvd_spu_video_set_caps (GstPad * pad, GstCaps * caps) { GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad)); gboolean res = FALSE; - GstStructure *s; - gint w, h; + GstVideoInfo info; gint i; - gint fps_n, fps_d; SpuState *state; - s = gst_caps_get_structure (caps, 0); - - if (!gst_structure_get_int (s, "width", &w) || - !gst_structure_get_int (s, "height", &h) || - !gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) { + if (!gst_video_info_from_caps (&info, caps)) goto done; - } DVD_SPU_LOCK (dvdspu); state = &dvdspu->spu_state; - state->fps_n = fps_n; - state->fps_d = fps_d; - - state->vid_height = h; - state->Y_height = GST_ROUND_UP_2 (h); - state->UV_height = state->Y_height / 2; - - if (state->vid_width != w) { - state->vid_width = w; - state->Y_stride = GST_ROUND_UP_4 (w); - state->UV_stride = GST_ROUND_UP_4 (state->Y_stride / 2); - for (i = 0; i < 3; i++) { - state->comp_bufs[i] = g_realloc (state->comp_bufs[i], - sizeof (guint32) * state->UV_stride); - } + state->info = info; + for (i = 0; i < 3; i++) { + state->comp_bufs[i] = g_realloc (state->comp_bufs[i], + sizeof (guint32) * info.width); } DVD_SPU_UNLOCK (dvdspu); @@ -358,7 +347,7 @@ done: } static GstCaps * -gst_dvd_spu_video_proxy_getcaps (GstPad * pad) +gst_dvd_spu_video_proxy_getcaps (GstPad * pad, GstCaps * filter) { GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad)); GstCaps *caps; @@ -368,7 +357,7 @@ gst_dvd_spu_video_proxy_getcaps (GstPad * pad) * subpicture sink pad */ otherpad = (pad == dvdspu->srcpad) ? dvdspu->videosinkpad : dvdspu->srcpad; - caps = gst_pad_peer_get_caps (otherpad); + caps = gst_pad_peer_query_caps (otherpad, filter); if (caps) { GstCaps *temp; const GstCaps *templ; @@ -386,15 +375,22 @@ gst_dvd_spu_video_proxy_getcaps (GstPad * pad) } static gboolean -gst_dvd_spu_video_event (GstPad * pad, GstEvent * event) +gst_dvd_spu_video_event (GstPad * pad, GstObject * parent, GstEvent * event) { - GstDVDSpu *dvdspu = (GstDVDSpu *) (gst_object_get_parent (GST_OBJECT (pad))); + GstDVDSpu *dvdspu = (GstDVDSpu *) parent; SpuState *state = &dvdspu->spu_state; gboolean res = TRUE; - g_return_val_if_fail (dvdspu != NULL, FALSE); - switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_dvd_spu_video_set_caps (pad, caps); + gst_event_unref (event); + break; + } case GST_EVENT_CUSTOM_DOWNSTREAM: case GST_EVENT_CUSTOM_DOWNSTREAM_OOB: { @@ -404,7 +400,7 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event) GstBuffer *to_push = NULL; /* Forward the event before handling */ - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); GST_DEBUG_OBJECT (dvdspu, "Still frame event on video pad: in-still = %d", in_still); @@ -430,40 +426,33 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event) } else { GST_DEBUG_OBJECT (dvdspu, "Custom event %" GST_PTR_FORMAT " on video pad", event); - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); } break; } - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - gdouble rate, arate; - GstFormat format; - gint64 start, stop, time; + GstSegment seg; - gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, - &start, &stop, &time); + gst_event_copy_segment (event, &seg); - if (format != GST_FORMAT_TIME) + if (seg.format != GST_FORMAT_TIME) return FALSE; /* Only print updates if they have an end time (don't print start_time * updates */ - GST_DEBUG_OBJECT (dvdspu, "video pad NewSegment:" - " Update %d, rate %g arate %g format %d start %" GST_TIME_FORMAT - " %" GST_TIME_FORMAT " position %" GST_TIME_FORMAT, - update, rate, arate, format, GST_TIME_ARGS (start), - GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); + GST_DEBUG_OBJECT (dvdspu, "video pad Segment: %" GST_SEGMENT_FORMAT, + &seg); DVD_SPU_LOCK (dvdspu); - if (update && start > dvdspu->video_seg.last_stop) { + if (seg.start > dvdspu->video_seg.position) { #if 0 g_print ("Segment update for video. Advancing from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT "\n", - GST_TIME_ARGS (dvdspu->video_seg.last_stop), GST_TIME_ARGS (start)); + GST_TIME_ARGS (dvdspu->video_seg.position), GST_TIME_ARGS (start)); #endif - while (dvdspu->video_seg.last_stop < start && + while (dvdspu->video_seg.position < seg.start && !(state->flags & SPU_STATE_STILL_FRAME)) { DVD_SPU_UNLOCK (dvdspu); if (dvdspu_handle_vid_buffer (dvdspu, NULL) != GST_FLOW_OK) { @@ -474,19 +463,17 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event) } } - gst_segment_set_newsegment_full (&dvdspu->video_seg, update, rate, arate, - format, start, stop, time); - + dvdspu->video_seg = seg; DVD_SPU_UNLOCK (dvdspu); - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); break; } case GST_EVENT_FLUSH_START: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); goto done; case GST_EVENT_FLUSH_STOP: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); DVD_SPU_LOCK (dvdspu); gst_segment_init (&dvdspu->video_seg, GST_FORMAT_UNDEFINED); @@ -496,12 +483,11 @@ gst_dvd_spu_video_event (GstPad * pad, GstEvent * event) DVD_SPU_UNLOCK (dvdspu); goto done; default: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); break; } done: - gst_object_unref (dvdspu); return res; #if 0 error: @@ -510,10 +496,35 @@ error: #endif } +static gboolean +gst_dvd_spu_video_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + gboolean res = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_dvd_spu_video_proxy_getcaps (pad, filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + res = TRUE; + break; + } + default: + res = gst_pad_query_default (pad, parent, query); + break; + } + + return res; +} + static GstFlowReturn -gst_dvd_spu_video_chain (GstPad * pad, GstBuffer * buf) +gst_dvd_spu_video_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { - GstDVDSpu *dvdspu = (GstDVDSpu *) (gst_object_get_parent (GST_OBJECT (pad))); + GstDVDSpu *dvdspu = (GstDVDSpu *) parent; GstFlowReturn ret; g_return_val_if_fail (dvdspu != NULL, GST_FLOW_ERROR); @@ -523,8 +534,6 @@ gst_dvd_spu_video_chain (GstPad * pad, GstBuffer * buf) ret = dvdspu_handle_vid_buffer (dvdspu, buf); - gst_object_unref (dvdspu); - return ret; } @@ -538,15 +547,15 @@ dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf) DVD_SPU_LOCK (dvdspu); if (buf == NULL) { - GstClockTime next_ts = dvdspu->video_seg.last_stop; + GstClockTime next_ts = dvdspu->video_seg.position; next_ts += gst_util_uint64_scale_int (GST_SECOND, - dvdspu->spu_state.fps_d, dvdspu->spu_state.fps_n); + dvdspu->spu_state.info.fps_d, dvdspu->spu_state.info.fps_n); /* NULL buffer was passed - use the reference frame and update the timestamp, * or else there's nothing to draw, and just return GST_FLOW_OK */ if (dvdspu->ref_frame == NULL) { - gst_segment_set_last_stop (&dvdspu->video_seg, GST_FORMAT_TIME, next_ts); + dvdspu->video_seg.position = next_ts; goto no_ref_frame; } @@ -563,16 +572,15 @@ dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf) } if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - gst_segment_set_last_stop (&dvdspu->video_seg, GST_FORMAT_TIME, - GST_BUFFER_TIMESTAMP (buf)); + dvdspu->video_seg.position = GST_BUFFER_TIMESTAMP (buf); } new_ts = gst_segment_to_running_time (&dvdspu->video_seg, GST_FORMAT_TIME, - dvdspu->video_seg.last_stop); + dvdspu->video_seg.position); #if 0 g_print ("TS %" GST_TIME_FORMAT " running: %" GST_TIME_FORMAT "\n", - GST_TIME_ARGS (dvdspu->video_seg.last_stop), GST_TIME_ARGS (new_ts)); + GST_TIME_ARGS (dvdspu->video_seg.position), GST_TIME_ARGS (new_ts)); #endif gst_dvd_spu_advance_spu (dvdspu, new_ts); @@ -629,16 +637,21 @@ no_ref_frame: static void gstspu_render (GstDVDSpu * dvdspu, GstBuffer * buf) { + GstVideoFrame frame; + + gst_video_frame_map (&frame, &dvdspu->spu_state.info, buf, GST_MAP_READWRITE); + switch (dvdspu->spu_input_type) { case SPU_INPUT_TYPE_VOBSUB: - gstspu_vobsub_render (dvdspu, buf); + gstspu_vobsub_render (dvdspu, &frame); break; case SPU_INPUT_TYPE_PGS: - gstspu_pgs_render (dvdspu, buf); + gstspu_pgs_render (dvdspu, &frame); break; default: break; } + gst_video_frame_unmap (&frame); } /* With SPU LOCK */ @@ -670,7 +683,7 @@ gst_dvd_spu_redraw_still (GstDVDSpu * dvdspu, gboolean force) } else if (force) { /* Simply output the reference frame */ GstBuffer *buf = gst_buffer_ref (dvdspu->ref_frame); - buf = gst_buffer_make_metadata_writable (buf); + buf = gst_buffer_make_writable (buf); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE; @@ -693,7 +706,7 @@ gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event) gboolean hl_change = FALSE; GST_INFO_OBJECT (dvdspu, "DVD event of type %s on subp pad OOB=%d", - gst_structure_get_string (event->structure, "event"), + gst_structure_get_string (gst_event_get_structure (event), "event"), (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB)); switch (dvdspu->spu_input_type) { @@ -754,13 +767,13 @@ gst_dvd_spu_advance_spu (GstDVDSpu * dvdspu, GstClockTime new_ts) vid_run_ts = gst_segment_to_running_time (&dvdspu->video_seg, GST_FORMAT_TIME, - dvdspu->video_seg.last_stop); + dvdspu->video_seg.position); GST_LOG_OBJECT (dvdspu, "Popped new SPU packet with TS %" GST_TIME_FORMAT - ". Video last_stop=%" GST_TIME_FORMAT " (%" GST_TIME_FORMAT + ". Video position=%" GST_TIME_FORMAT " (%" GST_TIME_FORMAT ") type %s", GST_TIME_ARGS (packet->event_ts), GST_TIME_ARGS (vid_run_ts), - GST_TIME_ARGS (dvdspu->video_seg.last_stop), + GST_TIME_ARGS (dvdspu->video_seg.position), packet->buf ? "buffer" : "event"); if (packet->buf) { @@ -795,9 +808,9 @@ gst_dvd_spu_check_still_updates (GstDVDSpu * dvdspu) if (dvdspu->spu_state.flags & SPU_STATE_STILL_FRAME) { vid_ts = gst_segment_to_running_time (&dvdspu->video_seg, - GST_FORMAT_TIME, dvdspu->video_seg.last_stop); + GST_FORMAT_TIME, dvdspu->video_seg.position); sub_ts = gst_segment_to_running_time (&dvdspu->subp_seg, - GST_FORMAT_TIME, dvdspu->subp_seg.last_stop); + GST_FORMAT_TIME, dvdspu->subp_seg.position); vid_ts = MAX (vid_ts, sub_ts); @@ -816,8 +829,9 @@ submit_new_spu_packet (GstDVDSpu * dvdspu, GstBuffer * buf) GstClockTime run_ts = GST_CLOCK_TIME_NONE; GST_DEBUG_OBJECT (dvdspu, - "Complete subpicture buffer of %u bytes with TS %" GST_TIME_FORMAT, - GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + "Complete subpicture buffer of %" G_GSIZE_FORMAT " bytes with TS %" + GST_TIME_FORMAT, gst_buffer_get_size (buf), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); /* Decide whether to pass this buffer through to the rendering code */ ts = GST_BUFFER_TIMESTAMP (buf); @@ -864,22 +878,22 @@ submit_new_spu_packet (GstDVDSpu * dvdspu, GstBuffer * buf) } static GstFlowReturn -gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf) +gst_dvd_spu_subpic_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { - GstDVDSpu *dvdspu = (GstDVDSpu *) (gst_object_get_parent (GST_OBJECT (pad))); + GstDVDSpu *dvdspu = (GstDVDSpu *) parent; GstFlowReturn ret = GST_FLOW_OK; + gsize size; g_return_val_if_fail (dvdspu != NULL, GST_FLOW_ERROR); GST_INFO_OBJECT (dvdspu, "Have subpicture buffer with timestamp %" - GST_TIME_FORMAT " and size %u", - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_BUFFER_SIZE (buf)); + GST_TIME_FORMAT " and size %" G_GSIZE_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), gst_buffer_get_size (buf)); DVD_SPU_LOCK (dvdspu); if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - gst_segment_set_last_stop (&dvdspu->subp_seg, GST_FORMAT_TIME, - GST_BUFFER_TIMESTAMP (buf)); + dvdspu->subp_seg.position = GST_BUFFER_TIMESTAMP (buf); } if (GST_BUFFER_IS_DISCONT (buf) && dvdspu->partial_spu) { @@ -904,30 +918,31 @@ gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf) if (dvdspu->partial_spu == NULL) goto done; + size = gst_buffer_get_size (dvdspu->partial_spu); + switch (dvdspu->spu_input_type) { case SPU_INPUT_TYPE_VOBSUB: - if (GST_BUFFER_SIZE (dvdspu->partial_spu) > 4) { + if (size > 4) { + guint8 *header[2]; guint16 packet_size; - guint8 *data; - data = GST_BUFFER_DATA (dvdspu->partial_spu); - packet_size = GST_READ_UINT16_BE (data); - - if (packet_size == GST_BUFFER_SIZE (dvdspu->partial_spu)) { + gst_buffer_extract (dvdspu->partial_spu, 0, header, 2); + packet_size = GST_READ_UINT16_BE (header); + if (packet_size == size) { submit_new_spu_packet (dvdspu, dvdspu->partial_spu); dvdspu->partial_spu = NULL; - } else if (packet_size < GST_BUFFER_SIZE (dvdspu->partial_spu)) { + } else if (packet_size < size) { /* Somehow we collected too much - something is wrong. Drop the * packet entirely and wait for a new one */ - GST_DEBUG_OBJECT (dvdspu, "Discarding invalid SPU buffer of size %u", - GST_BUFFER_SIZE (dvdspu->partial_spu)); + GST_DEBUG_OBJECT (dvdspu, + "Discarding invalid SPU buffer of size %" G_GSIZE_FORMAT, size); gst_buffer_unref (dvdspu->partial_spu); dvdspu->partial_spu = NULL; } else { GST_LOG_OBJECT (dvdspu, - "SPU buffer claims to be of size %u. Collected %u so far.", - packet_size, GST_BUFFER_SIZE (dvdspu->partial_spu)); + "SPU buffer claims to be of size %u. Collected %" G_GSIZE_FORMAT + " so far.", packet_size, size); } } break; @@ -936,34 +951,43 @@ gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf) * we've collected */ guint8 packet_type; guint16 packet_size; - guint8 *data = GST_BUFFER_DATA (dvdspu->partial_spu); - guint8 *end = data + GST_BUFFER_SIZE (dvdspu->partial_spu); + guint8 *data, *ptr, *end; + gsize size; + gboolean invalid = FALSE; + + data = gst_buffer_map (dvdspu->partial_spu, &size, NULL, GST_MAP_READ); + + ptr = data; + end = ptr + size; /* FIXME: There's no need to walk the command set each time. We can set a * marker and resume where we left off next time */ /* FIXME: Move the packet parsing and sanity checking into the format-specific modules */ - while (data != end) { - if (data + 3 > end) + while (ptr != end) { + if (ptr + 3 > end) break; - packet_type = *data++; - packet_size = GST_READ_UINT16_BE (data); - data += 2; - if (data + packet_size > end) + packet_type = *ptr++; + packet_size = GST_READ_UINT16_BE (ptr); + ptr += 2; + if (ptr + packet_size > end) break; - data += packet_size; + ptr += packet_size; /* 0x80 is the END command for PGS packets */ - if (packet_type == 0x80 && data != end) { + if (packet_type == 0x80 && ptr != end) { /* Extra cruft on the end of the packet -> assume invalid */ - gst_buffer_unref (dvdspu->partial_spu); - dvdspu->partial_spu = NULL; + invalid = TRUE; break; } } + gst_buffer_unmap (dvdspu->partial_spu, data, size); - if (dvdspu->partial_spu && data == end) { + if (invalid) { + gst_buffer_unref (dvdspu->partial_spu); + dvdspu->partial_spu = NULL; + } else if (ptr == end) { GST_DEBUG_OBJECT (dvdspu, - "Have complete PGS packet of size %u. Enqueueing.", - GST_BUFFER_SIZE (dvdspu->partial_spu)); + "Have complete PGS packet of size %" G_GSIZE_FORMAT ". Enqueueing.", + size); submit_new_spu_packet (dvdspu, dvdspu->partial_spu); dvdspu->partial_spu = NULL; } @@ -976,26 +1000,37 @@ gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf) done: DVD_SPU_UNLOCK (dvdspu); - gst_object_unref (dvdspu); + return ret; + + /* ERRORS */ caps_not_set: - GST_ELEMENT_ERROR (dvdspu, RESOURCE, NO_SPACE_LEFT, - (_("Subpicture format was not configured before data flow")), (NULL)); - ret = GST_FLOW_ERROR; - goto done; + { + GST_ELEMENT_ERROR (dvdspu, RESOURCE, NO_SPACE_LEFT, + (_("Subpicture format was not configured before data flow")), (NULL)); + ret = GST_FLOW_ERROR; + goto done; + } } static gboolean -gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event) +gst_dvd_spu_subpic_event (GstPad * pad, GstObject * parent, GstEvent * event) { - GstDVDSpu *dvdspu = (GstDVDSpu *) (gst_object_get_parent (GST_OBJECT (pad))); + GstDVDSpu *dvdspu = (GstDVDSpu *) parent; gboolean res = TRUE; - g_return_val_if_fail (dvdspu != NULL, FALSE); - /* Some events on the subpicture sink pad just get ignored, like * FLUSH_START */ switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_dvd_spu_subpic_set_caps (pad, caps); + gst_event_unref (event); + break; + } case GST_EVENT_CUSTOM_DOWNSTREAM: case GST_EVENT_CUSTOM_DOWNSTREAM_OOB: { @@ -1003,7 +1038,7 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event) gboolean need_push; if (!gst_structure_has_name (structure, "application/x-gst-dvd")) { - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); break; } @@ -1052,29 +1087,20 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event) break; } - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - gdouble rate; - GstFormat format; - gint64 start, stop, time; - gdouble arate; + GstSegment seg; - gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, - &start, &stop, &time); + gst_event_copy_segment (event, &seg); /* Only print updates if they have an end time (don't print start_time * updates */ - GST_DEBUG_OBJECT (dvdspu, "subpic pad NewSegment:" - " Update %d, rate %g arate %g format %d start %" GST_TIME_FORMAT - " %" GST_TIME_FORMAT " position %" GST_TIME_FORMAT, - update, rate, arate, format, GST_TIME_ARGS (start), - GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); + GST_DEBUG_OBJECT (dvdspu, "subpic pad Segment: %" GST_SEGMENT_FORMAT, + &seg); DVD_SPU_LOCK (dvdspu); - gst_segment_set_newsegment_full (&dvdspu->subp_seg, update, rate, arate, - format, start, stop, time); + dvdspu->subp_seg = seg; GST_LOG_OBJECT (dvdspu, "Subpicture segment now: %" GST_SEGMENT_FORMAT, &dvdspu->subp_seg); DVD_SPU_UNLOCK (dvdspu); @@ -1102,12 +1128,11 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event) goto done; break; default: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); break; } done: - gst_object_unref (dvdspu); return res; } @@ -1151,7 +1176,7 @@ gst_dvd_spu_change_state (GstElement * element, GstStateChange transition) GstDVDSpu *dvdspu = (GstDVDSpu *) element; GstStateChangeReturn ret; - ret = parent_class->change_state (element, transition); + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: diff --git a/gst/dvdspu/gstdvdspu.h b/gst/dvdspu/gstdvdspu.h index 22b48d1da..747b00259 100644 --- a/gst/dvdspu/gstdvdspu.h +++ b/gst/dvdspu/gstdvdspu.h @@ -69,10 +69,7 @@ struct SpuState { GstClockTime next_ts; /* Next event TS in running time */ SpuStateFlags flags; - gint fps_n, fps_d; - gint16 vid_width, vid_height; - gint16 Y_stride, UV_stride; - gint16 Y_height, UV_height; + GstVideoInfo info; guint32 *comp_bufs[3]; /* Compositing buffers for U+V & A */ guint16 comp_left; diff --git a/gst/dvdspu/gstspu-common.h b/gst/dvdspu/gstspu-common.h index 206e88203..ec0b3dfc4 100644 --- a/gst/dvdspu/gstspu-common.h +++ b/gst/dvdspu/gstspu-common.h @@ -20,6 +20,7 @@ #define __GSTSPU_COMMON_H__ #include <glib.h> +#include <gst/video/video.h> G_BEGIN_DECLS diff --git a/gst/dvdspu/gstspu-pgs.c b/gst/dvdspu/gstspu-pgs.c index a244ac993..955cf1a98 100644 --- a/gst/dvdspu/gstspu-pgs.c +++ b/gst/dvdspu/gstspu-pgs.c @@ -171,10 +171,11 @@ dump_rle_data (GstDVDSpu * dvdspu, guint8 * data, guint32 len) static void pgs_composition_object_render (PgsCompositionObject * obj, SpuState * state, - GstBuffer * dest_buf) + GstVideoFrame * frame) { SpuColour *colour; guint8 *planes[3]; /* YUV frame pointers */ + gint strides[3]; guint8 *data, *end; guint16 obj_w; guint16 obj_h G_GNUC_UNUSED; @@ -195,27 +196,27 @@ pgs_composition_object_render (PgsCompositionObject * obj, SpuState * state, * window specified by the object's window_id */ /* Store the start of each plane */ - planes[0] = GST_BUFFER_DATA (dest_buf); - planes[1] = planes[0] + (state->Y_height * state->Y_stride); - planes[2] = planes[1] + (state->UV_height * state->UV_stride); + planes[0] = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + planes[1] = GST_VIDEO_FRAME_COMP_DATA (frame, 1); + planes[2] = GST_VIDEO_FRAME_COMP_DATA (frame, 2); - /* Sanity check */ - g_return_if_fail (planes[2] + (state->UV_height * state->UV_stride) <= - GST_BUFFER_DATA (dest_buf) + GST_BUFFER_SIZE (dest_buf)); + strides[0] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + strides[1] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 1); + strides[2] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 2); - y = MIN (obj->y, state->Y_height); + y = MIN (obj->y, state->info.height); - planes[0] += state->Y_stride * y; - planes[1] += state->UV_stride * (y / 2); - planes[2] += state->UV_stride * (y / 2); + planes[0] += strides[0] * y; + planes[1] += strides[1] * (y / 2); + planes[2] += strides[2] * (y / 2); /* RLE data: */ obj_w = GST_READ_UINT16_BE (data); obj_h = GST_READ_UINT16_BE (data + 2); data += 4; - min_x = MIN (obj->x, state->Y_stride); - max_x = MIN (obj->x + obj_w, state->Y_stride); + min_x = MIN (obj->x, strides[0]); + max_x = MIN (obj->x + obj_w, strides[0]); state->comp_left = x = min_x; state->comp_right = max_x; @@ -283,17 +284,17 @@ pgs_composition_object_render (PgsCompositionObject * obj, SpuState * state, if (!run_len || x > max_x) { x = min_x; - planes[0] += state->Y_stride; + planes[0] += strides[0]; if (y % 2) { gstspu_blend_comp_buffers (state, planes); gstspu_clear_comp_buffers (state); - planes[1] += state->UV_stride; - planes[2] += state->UV_stride; + planes[1] += strides[1]; + planes[2] += strides[2]; } y++; - if (y >= state->Y_height) + if (y >= state->info.height) return; /* Hit the bottom */ } } @@ -678,17 +679,20 @@ parse_pgs_packet (GstDVDSpu * dvdspu, guint8 type, guint8 * payload, gint gstspu_exec_pgs_buffer (GstDVDSpu * dvdspu, GstBuffer * buf) { - guint8 *pos, *end; + guint8 *data, *pos, *end; + gsize size; guint8 type; guint16 packet_len; - pos = GST_BUFFER_DATA (buf); - end = pos + GST_BUFFER_SIZE (buf); + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + + pos = data; + end = pos + size; /* Need at least 3 bytes */ if (pos + 3 > end) { PGS_DUMP ("Not enough bytes to be a PGS packet\n"); - return -1; + goto error; } PGS_DUMP ("Begin dumping command buffer of size %u ts %" GST_TIME_FORMAT "\n", @@ -699,19 +703,27 @@ gstspu_exec_pgs_buffer (GstDVDSpu * dvdspu, GstBuffer * buf) pos += 2; if (pos + packet_len > end) { + gst_buffer_unmap (buf, data, size); PGS_DUMP ("Invalid packet length %u (only have %u bytes)\n", packet_len, end - pos); - return -1; + goto error; } if (parse_pgs_packet (dvdspu, type, pos, packet_len)) - return -1; + goto error; pos += packet_len; } while (pos + 3 <= end); PGS_DUMP ("End dumping command buffer with %u bytes remaining\n", end - pos); - return (pos - GST_BUFFER_DATA (buf)); + return (pos - data); + + /* ERRORS */ +error: + { + gst_buffer_unmap (buf, data, size); + return -1; + } } void @@ -746,7 +758,7 @@ gstspu_pgs_execute_event (GstDVDSpu * dvdspu) } void -gstspu_pgs_render (GstDVDSpu * dvdspu, GstBuffer * buf) +gstspu_pgs_render (GstDVDSpu * dvdspu, GstVideoFrame * frame) { SpuState *state = &dvdspu->spu_state; PgsPresentationSegment *ps = &state->pgs.pres_seg; @@ -758,7 +770,7 @@ gstspu_pgs_render (GstDVDSpu * dvdspu, GstBuffer * buf) for (i = 0; i < ps->objects->len; i++) { PgsCompositionObject *cur = &g_array_index (ps->objects, PgsCompositionObject, i); - pgs_composition_object_render (cur, state, buf); + pgs_composition_object_render (cur, state, frame); } } diff --git a/gst/dvdspu/gstspu-pgs.h b/gst/dvdspu/gstspu-pgs.h index 164f4d815..3304677f2 100644 --- a/gst/dvdspu/gstspu-pgs.h +++ b/gst/dvdspu/gstspu-pgs.h @@ -99,7 +99,7 @@ struct SpuPgsState { void gstspu_pgs_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf); gboolean gstspu_pgs_execute_event (GstDVDSpu *dvdspu); -void gstspu_pgs_render (GstDVDSpu *dvdspu, GstBuffer *buf); +void gstspu_pgs_render (GstDVDSpu *dvdspu, GstVideoFrame *frame); gboolean gstspu_pgs_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event); void gstspu_pgs_flush (GstDVDSpu *dvdspu); diff --git a/gst/dvdspu/gstspu-vobsub-render.c b/gst/dvdspu/gstspu-vobsub-render.c index 830017d33..1254d0aeb 100644 --- a/gst/dvdspu/gstspu-vobsub-render.c +++ b/gst/dvdspu/gstspu-vobsub-render.c @@ -138,7 +138,7 @@ gstspu_vobsub_get_nibble (SpuState * state, guint16 * rle_offset) if (G_UNLIKELY (*rle_offset >= state->vobsub.max_offset)) return 0; /* Overran the buffer */ - ret = GST_BUFFER_DATA (state->vobsub.pix_buf)[(*rle_offset) / 2]; + gst_buffer_extract (state->vobsub.pix_buf, (*rle_offset) / 2, &ret, 1); /* If the offset is even, we shift the answer down 4 bits, otherwise not */ if (*rle_offset & 0x01) @@ -384,24 +384,29 @@ gstspu_vobsub_clear_comp_buffers (SpuState * state) } void -gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) +gstspu_vobsub_render (GstDVDSpu * dvdspu, GstVideoFrame * frame) { SpuState *state = &dvdspu->spu_state; guint8 *planes[3]; /* YUV frame pointers */ gint y, last_y; + gint width, height; + gint strides[3]; /* Set up our initial state */ if (G_UNLIKELY (state->vobsub.pix_buf == NULL)) return; /* Store the start of each plane */ - planes[0] = GST_BUFFER_DATA (buf); - planes[1] = planes[0] + (state->Y_height * state->Y_stride); - planes[2] = planes[1] + (state->UV_height * state->UV_stride); + planes[0] = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + planes[1] = GST_VIDEO_FRAME_COMP_DATA (frame, 1); + planes[2] = GST_VIDEO_FRAME_COMP_DATA (frame, 2); - /* Sanity check */ - g_return_if_fail (planes[2] + (state->UV_height * state->UV_stride) <= - GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf)); + strides[0] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + strides[1] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 1); + strides[2] = GST_VIDEO_FRAME_COMP_STRIDE (frame, 2); + + width = GST_VIDEO_FRAME_WIDTH (frame); + height = GST_VIDEO_FRAME_HEIGHT (frame); GST_DEBUG_OBJECT (dvdspu, "Rendering SPU. disp_rect %d,%d to %d,%d. hl_rect %d,%d to %d,%d", @@ -410,13 +415,12 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) state->vobsub.hl_rect.left, state->vobsub.hl_rect.top, state->vobsub.hl_rect.right, state->vobsub.hl_rect.bottom); - GST_DEBUG_OBJECT (dvdspu, "video size %d,%d", state->vid_width, - state->vid_height); + GST_DEBUG_OBJECT (dvdspu, "video size %d,%d", width, height); /* When reading RLE data, we track the offset in nibbles... */ state->vobsub.cur_offsets[0] = state->vobsub.pix_data[0] * 2; state->vobsub.cur_offsets[1] = state->vobsub.pix_data[1] * 2; - state->vobsub.max_offset = GST_BUFFER_SIZE (state->vobsub.pix_buf) * 2; + state->vobsub.max_offset = gst_buffer_get_size (state->vobsub.pix_buf) * 2; /* Update all the palette caches */ gstspu_vobsub_update_palettes (dvdspu, state); @@ -436,18 +440,18 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) state->vobsub.clip_rect.right = state->vobsub.disp_rect.right; /* center the image when display rectangle exceeds the video width */ - if (state->vid_width <= state->vobsub.disp_rect.right) { + if (width <= state->vobsub.disp_rect.right) { gint left, disp_width; disp_width = state->vobsub.disp_rect.right - state->vobsub.disp_rect.left + 1; - left = (state->vid_width - disp_width) / 2; + left = (width - disp_width) / 2; state->vobsub.disp_rect.left = left; state->vobsub.disp_rect.right = left + disp_width - 1; /* if it clips to the right, shift it left, but only till zero */ - if (state->vobsub.disp_rect.right >= state->vid_width) { - gint shift = state->vobsub.disp_rect.right - state->vid_width - 1; + if (state->vobsub.disp_rect.right >= width) { + gint shift = state->vobsub.disp_rect.right - width - 1; if (shift > state->vobsub.disp_rect.left) shift = state->vobsub.disp_rect.left; state->vobsub.disp_rect.left -= shift; @@ -459,8 +463,8 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) state->vobsub.clip_rect.right = state->vobsub.disp_rect.right; /* clip right after the shift */ - if (state->vobsub.clip_rect.right >= state->vid_width) - state->vobsub.clip_rect.right = state->vid_width - 1; + if (state->vobsub.clip_rect.right >= width) + state->vobsub.clip_rect.right = width - 1; GST_DEBUG_OBJECT (dvdspu, "clipping width to %d,%d", state->vobsub.clip_rect.left, @@ -472,10 +476,10 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) * is and do something more clever. */ state->vobsub.clip_rect.top = state->vobsub.disp_rect.top; state->vobsub.clip_rect.bottom = state->vobsub.disp_rect.bottom; - if (state->vid_height <= state->vobsub.disp_rect.bottom) { + if (height <= state->vobsub.disp_rect.bottom) { /* shift it up, but only till zero */ - gint shift = state->vobsub.disp_rect.bottom - state->vid_height - 1; + gint shift = state->vobsub.disp_rect.bottom - height - 1; if (shift > state->vobsub.disp_rect.top) shift = state->vobsub.disp_rect.top; state->vobsub.disp_rect.top -= shift; @@ -492,8 +496,8 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) state->vobsub.clip_rect.bottom = state->vobsub.disp_rect.bottom; /* clip right after the shift */ - if (state->vobsub.clip_rect.bottom >= state->vid_height) - state->vobsub.clip_rect.bottom = state->vid_height - 1; + if (state->vobsub.clip_rect.bottom >= height) + state->vobsub.clip_rect.bottom = height - 1; GST_DEBUG_OBJECT (dvdspu, "clipping height to %d,%d", state->vobsub.clip_rect.top, @@ -508,9 +512,9 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) last_y = (state->vobsub.disp_rect.bottom - 1) & ~(0x01); /* Update our plane references to the first line of the disp_rect */ - planes[0] += state->Y_stride * y; - planes[1] += state->UV_stride * (y / 2); - planes[2] += state->UV_stride * (y / 2); + planes[0] += strides[0] * y; + planes[1] += strides[1] * (y / 2); + planes[2] += strides[2] * (y / 2); for (state->vobsub.cur_Y = y; state->vobsub.cur_Y <= last_y; state->vobsub.cur_Y++) { @@ -526,7 +530,7 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) gstspu_vobsub_render_line (state, planes, &state->vobsub.cur_offsets[0]); if (!clip) { /* Advance the luminance output pointer */ - planes[0] += state->Y_stride; + planes[0] += strides[0]; } state->vobsub.cur_Y++; @@ -539,9 +543,9 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) gstspu_vobsub_blend_comp_buffers (state, planes); /* Update all the output pointers */ - planes[0] += state->Y_stride; - planes[1] += state->UV_stride; - planes[2] += state->UV_stride; + planes[0] += strides[0]; + planes[1] += strides[1]; + planes[2] += strides[2]; } } if (state->vobsub.cur_Y == state->vobsub.disp_rect.bottom) { @@ -568,24 +572,22 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) guint8 *cur; gint16 pos; - cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->vobsub.disp_rect.top; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->vobsub.disp_rect.top; for (pos = state->vobsub.disp_rect.left + 1; pos < state->vobsub.disp_rect.right; pos++) cur[pos] = (cur[pos] / 2) + 0x8; - cur = - GST_BUFFER_DATA (buf) + - state->Y_stride * state->vobsub.disp_rect.bottom; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->vobsub.disp_rect.bottom; for (pos = state->vobsub.disp_rect.left + 1; pos < state->vobsub.disp_rect.right; pos++) cur[pos] = (cur[pos] / 2) + 0x8; - cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->vobsub.disp_rect.top; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->vobsub.disp_rect.top; for (pos = state->vobsub.disp_rect.top; pos <= state->vobsub.disp_rect.bottom; pos++) { cur[state->vobsub.disp_rect.left] = (cur[state->vobsub.disp_rect.left] / 2) + 0x8; cur[state->vobsub.disp_rect.right] = (cur[state->vobsub.disp_rect.right] / 2) + 0x8; - cur += state->Y_stride; + cur += strides[0]; } } while (0); #endif @@ -595,17 +597,17 @@ gstspu_vobsub_render (GstDVDSpu * dvdspu, GstBuffer * buf) guint8 *cur; gint16 pos; - cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->hl_rect.top; for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++) cur[pos] = (cur[pos] / 2) + 0x8; - cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.bottom; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->hl_rect.bottom; for (pos = state->hl_rect.left + 1; pos < state->hl_rect.right; pos++) cur[pos] = (cur[pos] / 2) + 0x8; - cur = GST_BUFFER_DATA (buf) + state->Y_stride * state->hl_rect.top; + cur = GST_BUFFER_DATA (buf) + strides[0] * state->hl_rect.top; for (pos = state->hl_rect.top; pos <= state->hl_rect.bottom; pos++) { cur[state->hl_rect.left] = (cur[state->hl_rect.left] / 2) + 0x8; cur[state->hl_rect.right] = (cur[state->hl_rect.right] / 2) + 0x8; - cur += state->Y_stride; + cur += strides[0]; } } #endif diff --git a/gst/dvdspu/gstspu-vobsub.c b/gst/dvdspu/gstspu-vobsub.c index 0a2380c9e..b1b76bb2e 100644 --- a/gst/dvdspu/gstspu-vobsub.c +++ b/gst/dvdspu/gstspu-vobsub.c @@ -323,13 +323,14 @@ gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer * buf) { guint8 *start, *end; + gsize size; SpuState *state = &dvdspu->spu_state; #if DUMP_DCSQ gst_dvd_spu_dump_dcsq (dvdspu, event_ts, buf); #endif - if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 4)) + if (G_UNLIKELY (gst_buffer_get_size (buf) < 4)) goto invalid; if (state->vobsub.buf != NULL) { @@ -339,8 +340,8 @@ gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, state->vobsub.buf = buf; state->vobsub.base_ts = event_ts; - start = GST_BUFFER_DATA (state->vobsub.buf); - end = start + GST_BUFFER_SIZE (state->vobsub.buf); + start = gst_buffer_map (state->vobsub.buf, &size, NULL, GST_MAP_READ); + end = start + size; /* Configure the first command block in this buffer as our initial blk */ state->vobsub.cur_cmd_blk = GST_READ_UINT16_BE (start + 2); @@ -351,6 +352,7 @@ gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, g_free (state->vobsub.line_ctrl_i); state->vobsub.line_ctrl_i = NULL; } + gst_buffer_unmap (state->vobsub.buf, start, size); return; invalid: @@ -363,6 +365,7 @@ gstspu_vobsub_execute_event (GstDVDSpu * dvdspu) { guint8 *start, *cmd_blk, *end; guint16 next_blk; + gsize size; SpuState *state = &dvdspu->spu_state; if (state->vobsub.buf == NULL) @@ -372,12 +375,13 @@ gstspu_vobsub_execute_event (GstDVDSpu * dvdspu) " @ offset %u", GST_TIME_ARGS (state->next_ts), state->vobsub.cur_cmd_blk); - start = GST_BUFFER_DATA (state->vobsub.buf); - end = start + GST_BUFFER_SIZE (state->vobsub.buf); + start = gst_buffer_map (state->vobsub.buf, &size, NULL, GST_MAP_READ); + end = start + size; cmd_blk = start + state->vobsub.cur_cmd_blk; if (G_UNLIKELY (cmd_blk + 5 >= end)) { + gst_buffer_unmap (state->vobsub.buf, start, size); /* Invalid. Finish the buffer and loop again */ gst_dvd_spu_finish_spu_buf (dvdspu); return FALSE; @@ -392,9 +396,11 @@ gstspu_vobsub_execute_event (GstDVDSpu * dvdspu) } else { /* Next Block points to the current block, so we're finished with this * SPU buffer */ + gst_buffer_unmap (state->vobsub.buf, start, size); gst_dvd_spu_finish_spu_buf (dvdspu); return FALSE; } + gst_buffer_unmap (state->vobsub.buf, start, size); return TRUE; } diff --git a/gst/dvdspu/gstspu-vobsub.h b/gst/dvdspu/gstspu-vobsub.h index 9b4196bc7..1a0588cd1 100644 --- a/gst/dvdspu/gstspu-vobsub.h +++ b/gst/dvdspu/gstspu-vobsub.h @@ -103,7 +103,7 @@ struct SpuVobsubState { void gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf); gboolean gstspu_vobsub_execute_event (GstDVDSpu *dvdspu); -void gstspu_vobsub_render (GstDVDSpu *dvdspu, GstBuffer *buf); +void gstspu_vobsub_render (GstDVDSpu *dvdspu, GstVideoFrame *frame); gboolean gstspu_vobsub_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event); void gstspu_vobsub_flush (GstDVDSpu *dvdspu); diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 209f656b4..feb07b5bd 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -333,8 +333,10 @@ gst_face_overlay_base_init (gpointer gclass) "Overlays SVG graphics over a detected face in a video stream", "Laura Lucas Alday <lauralucas@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the faceoverlay's class */ diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c index 4c7e241e8..6423bf5b9 100644 --- a/gst/festival/gstfestival.c +++ b/gst/festival/gstfestival.c @@ -184,10 +184,10 @@ gst_festival_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); /* register pads */ - gst_element_class_add_static_pad_template (element_class, - &sink_template_factory); - gst_element_class_add_static_pad_template (element_class, - &src_template_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template_factory)); gst_element_class_set_details_simple (element_class, "Festival Text-to-Speech synthesizer", "Filter/Effect/Audio", diff --git a/gst/fieldanalysis/gstfieldanalysis.c b/gst/fieldanalysis/gstfieldanalysis.c index 404fcfad5..bc6e4c561 100644 --- a/gst/fieldanalysis/gstfieldanalysis.c +++ b/gst/fieldanalysis/gstfieldanalysis.c @@ -136,8 +136,10 @@ gst_field_analysis_base_init (gpointer gclass) "Analyse fields from video frames to identify if they are progressive/telecined/interlaced", "Robert Swain <robert.swain@collabora.co.uk>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } typedef enum @@ -1599,7 +1601,7 @@ gst_field_analysis_process_buffer (GstFieldAnalysis * filter, && telecine_matches & FIELD_ANALYSIS_BOTTOM_TOP)) { /* held is opposite to matched => need both field from prev */ /* if t_b, hold bottom from prev and top from current, else vice-versa */ - res1->holding = 1 + ! !(telecine_matches & FIELD_ANALYSIS_TOP_BOTTOM); + res1->holding = 1 + !!(telecine_matches & FIELD_ANALYSIS_TOP_BOTTOM); res0->holding = 1 + !(telecine_matches & FIELD_ANALYSIS_TOP_BOTTOM); /* push prev TCM */ outbuf = diff --git a/gst/freeze/gstfreeze.c b/gst/freeze/gstfreeze.c index c7884f8f8..0d63eb70a 100644 --- a/gst/freeze/gstfreeze.c +++ b/gst/freeze/gstfreeze.c @@ -89,10 +89,10 @@ gst_freeze_base_init (gpointer klass) "Gergely Nagy <gergely.nagy@neteyes.hu>," " Renato Filho <renato.filho@indt.org.br>"); - gst_element_class_add_static_pad_template (element_class, - &gst_freeze_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_freeze_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_freeze_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_freeze_src_template)); } diff --git a/gst/frei0r/Makefile.am b/gst/frei0r/Makefile.am index 5c876e5e9..3a1ebbd24 100644 --- a/gst/frei0r/Makefile.am +++ b/gst/frei0r/Makefile.am @@ -6,8 +6,8 @@ libgstfrei0r_la_SOURCES = \ gstfrei0rsrc.c \ gstfrei0rmixer.c -libgstfrei0r_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -libgstfrei0r_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) \ +libgstfrei0r_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) +libgstfrei0r_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ libgstfrei0r_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstfrei0r_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/frei0r/gstfrei0r.c b/gst/frei0r/gstfrei0r.c index a6763cd01..5958a2d4d 100644 --- a/gst/frei0r/gstfrei0r.c +++ b/gst/frei0r/gstfrei0r.c @@ -26,7 +26,6 @@ #include "gstfrei0rsrc.h" #include "gstfrei0rmixer.h" -#include <gst/controller/gstcontroller.h> #include <string.h> GST_DEBUG_CATEGORY (frei0r_debug); @@ -669,8 +668,6 @@ plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (frei0r_debug, "frei0r", 0, "frei0r"); - gst_controller_init (NULL, NULL); - gst_plugin_add_dependency_simple (plugin, "FREI0R_PATH:HOME/.frei0r-1/lib", "/usr/lib/frei0r-1:/usr/local/lib/frei0r-1:" diff --git a/gst/frei0r/gstfrei0rfilter.c b/gst/frei0r/gstfrei0rfilter.c index 15aded1c8..b148131e6 100644 --- a/gst/frei0r/gstfrei0rfilter.c +++ b/gst/frei0r/gstfrei0rfilter.c @@ -81,7 +81,7 @@ gst_frei0r_filter_before_transform (GstBaseTransform * trans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) - gst_object_sync_values (G_OBJECT (self), timestamp); + gst_object_sync_values (GST_OBJECT (self), timestamp); } static GstFlowReturn @@ -206,11 +206,9 @@ gst_frei0r_filter_class_init (GstFrei0rFilterClass * klass, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_caps_ref (caps)); gst_element_class_add_pad_template (gstelement_class, templ); - gst_object_unref (templ); templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); gst_element_class_add_pad_template (gstelement_class, templ); - gst_object_unref (templ); gsttrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_frei0r_filter_set_caps); gsttrans_class->stop = GST_DEBUG_FUNCPTR (gst_frei0r_filter_stop); diff --git a/gst/frei0r/gstfrei0rmixer.c b/gst/frei0r/gstfrei0rmixer.c index 3b0bf2e27..fd8ff7e60 100644 --- a/gst/frei0r/gstfrei0rmixer.c +++ b/gst/frei0r/gstfrei0rmixer.c @@ -598,7 +598,7 @@ gst_frei0r_mixer_collected (GstCollectPads2 * pads, GstFrei0rMixer * self) GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) - gst_object_sync_values (G_OBJECT (self), timestamp); + gst_object_sync_values (GST_OBJECT (self), timestamp); gst_buffer_copy_metadata (outbuf, inbuf0, GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS); diff --git a/gst/frei0r/gstfrei0rsrc.c b/gst/frei0r/gstfrei0rsrc.c index cfbd42f34..b3a8347c3 100644 --- a/gst/frei0r/gstfrei0rsrc.c +++ b/gst/frei0r/gstfrei0rsrc.c @@ -122,7 +122,7 @@ gst_frei0r_src_create (GstPushSrc * src, GstBuffer ** buf) GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) - gst_object_sync_values (G_OBJECT (self), timestamp); + gst_object_sync_values (GST_OBJECT (self), timestamp); time = ((gdouble) GST_BUFFER_TIMESTAMP (outbuf)) / GST_SECOND; @@ -366,7 +366,6 @@ gst_frei0r_src_class_init (GstFrei0rSrcClass * klass, templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); gst_element_class_add_pad_template (gstelement_class, templ); - gst_object_unref (templ); gstbasesrc_class->set_caps = gst_frei0r_src_set_caps; gstbasesrc_class->get_caps = gst_frei0r_src_get_caps; diff --git a/gst/gaudieffects/Makefile.am b/gst/gaudieffects/Makefile.am index 54e747722..9537e7af6 100644 --- a/gst/gaudieffects/Makefile.am +++ b/gst/gaudieffects/Makefile.am @@ -2,8 +2,8 @@ plugin_LTLIBRARIES = libgstgaudieffects.la libgstgaudieffects_la_SOURCES = gstburn.c gstchromium.c gstdilate.c \ gstdodge.c gstexclusion.c gstgaussblur.c gstsolarize.c gstplugin.c -libgstgaudieffects_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) -libgstgaudieffects_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(LIBM) +libgstgaudieffects_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstgaudieffects_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_LIBS) $(LIBM) libgstgaudieffects_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgaudieffects_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/gaudieffects/gstburn.c b/gst/gaudieffects/gstburn.c index 9bd3bce1a..2aedfffb3 100644 --- a/gst/gaudieffects/gstburn.c +++ b/gst/gaudieffects/gstburn.c @@ -138,8 +138,10 @@ gst_burn_base_init (gpointer gclass) "Burn adjusts the colors in the video signal.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the burn's class. */ @@ -263,7 +265,7 @@ gst_burn_transform (GstBaseTransform * btrans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (filter), stream_time); + gst_object_sync_values (GST_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); adjustment = filter->adjustment; diff --git a/gst/gaudieffects/gstchromium.c b/gst/gaudieffects/gstchromium.c index fc91dbaa6..ea8e01a9d 100644 --- a/gst/gaudieffects/gstchromium.c +++ b/gst/gaudieffects/gstchromium.c @@ -154,8 +154,10 @@ gst_chromium_base_init (gpointer gclass) "Chromium breaks the colors of the video signal.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the chromium's class. */ @@ -292,7 +294,7 @@ gst_chromium_transform (GstBaseTransform * btrans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (filter), stream_time); + gst_object_sync_values (GST_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); edge_a = filter->edge_a; diff --git a/gst/gaudieffects/gstdilate.c b/gst/gaudieffects/gstdilate.c index 72e6eb083..321709979 100644 --- a/gst/gaudieffects/gstdilate.c +++ b/gst/gaudieffects/gstdilate.c @@ -139,8 +139,10 @@ gst_dilate_base_init (gpointer gclass) "Dilate copies the brightest pixel around.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the dilate's class. */ @@ -264,7 +266,7 @@ gst_dilate_transform (GstBaseTransform * btrans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (filter), stream_time); + gst_object_sync_values (GST_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); erode = filter->erode; diff --git a/gst/gaudieffects/gstdodge.c b/gst/gaudieffects/gstdodge.c index 64cfd0149..ff61aa7e5 100644 --- a/gst/gaudieffects/gstdodge.c +++ b/gst/gaudieffects/gstdodge.c @@ -135,8 +135,10 @@ gst_dodge_base_init (gpointer gclass) "Dodge saturates the colors in the video signal.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the dodge's class. */ diff --git a/gst/gaudieffects/gstexclusion.c b/gst/gaudieffects/gstexclusion.c index 4d5fc7add..bfdebdfe2 100644 --- a/gst/gaudieffects/gstexclusion.c +++ b/gst/gaudieffects/gstexclusion.c @@ -140,8 +140,10 @@ gst_exclusion_base_init (gpointer gclass) "Exclusion exclodes the colors in the video signal.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the exclusion's class. */ @@ -261,7 +263,7 @@ gst_exclusion_transform (GstBaseTransform * btrans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (filter), stream_time); + gst_object_sync_values (GST_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); factor = filter->factor; diff --git a/gst/gaudieffects/gstgaussblur.c b/gst/gaudieffects/gstgaussblur.c index 2409f7552..861bbf9dd 100644 --- a/gst/gaudieffects/gstgaussblur.c +++ b/gst/gaudieffects/gstgaussblur.c @@ -71,8 +71,10 @@ gauss_blur_base_init (gpointer gclass) "Perform Gaussian blur/sharpen on a video", "Jan Schmidt <thaytan@noraisin.net>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } static void @@ -167,7 +169,7 @@ gauss_blur_process_frame (GstBaseTransform * btrans, stream_time = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (gb), stream_time); + gst_object_sync_values (GST_OBJECT (gb), stream_time); GST_OBJECT_LOCK (gb); sigma = gb->sigma; diff --git a/gst/gaudieffects/gstplugin.c b/gst/gaudieffects/gstplugin.c index 143efb310..536bcb7e0 100644 --- a/gst/gaudieffects/gstplugin.c +++ b/gst/gaudieffects/gstplugin.c @@ -48,7 +48,6 @@ #endif #include <gst/gst.h> -#include <gst/controller/gstcontroller.h> #include "gstplugin.h" @@ -66,8 +65,6 @@ plugin_init (GstPlugin * plugin) { gboolean ret = TRUE; - gst_controller_init (NULL, NULL); - ret &= gst_burn_plugin_init (plugin); ret &= gst_chromium_plugin_init (plugin); ret &= gst_dilate_plugin_init (plugin); diff --git a/gst/gaudieffects/gstsolarize.c b/gst/gaudieffects/gstsolarize.c index 0c961374f..e5023d22b 100644 --- a/gst/gaudieffects/gstsolarize.c +++ b/gst/gaudieffects/gstsolarize.c @@ -144,8 +144,10 @@ gst_solarize_base_init (gpointer gclass) "Solarize tunable inverse in the video signal.", "Luis de Bethencourt <luis@debethencourt.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* Initialize the solarize's class. */ @@ -290,7 +292,7 @@ gst_solarize_transform (GstBaseTransform * btrans, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (filter), stream_time); + gst_object_sync_values (GST_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); threshold = filter->threshold; diff --git a/gst/geometrictransform/Makefile.am b/gst/geometrictransform/Makefile.am index e304ed0b0..907204463 100644 --- a/gst/geometrictransform/Makefile.am +++ b/gst/geometrictransform/Makefile.am @@ -21,12 +21,10 @@ libgstgeometrictransform_la_SOURCES = plugin.c \ gstfisheye.c libgstgeometrictransform_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_CONTROLLER_CFLAGS) + $(GST_PLUGINS_BASE_CFLAGS) libgstgeometrictransform_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ -lgstinterfaces-@GST_MAJORMINOR@ \ - $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) $(LIBM) libgstgeometrictransform_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c index 8e78de7ab..11e45fb50 100644 --- a/gst/geometrictransform/gstgeometrictransform.c +++ b/gst/geometrictransform/gstgeometrictransform.c @@ -246,7 +246,7 @@ gst_geometric_transform_before_transform (GstBaseTransform * trans, GST_DEBUG_OBJECT (gt, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) - gst_object_sync_values (G_OBJECT (gt), stream_time); + gst_object_sync_values (GST_OBJECT (gt), stream_time); } static GstFlowReturn @@ -357,10 +357,10 @@ gst_geometric_transform_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_geometric_transform_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_geometric_transform_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_geometric_transform_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_geometric_transform_src_template)); } static void diff --git a/gst/h264parse/gsth264parse.c b/gst/h264parse/gsth264parse.c index 8ae60755e..90a537bb7 100644 --- a/gst/h264parse/gsth264parse.c +++ b/gst/h264parse/gsth264parse.c @@ -895,10 +895,10 @@ gst_h264_parse_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, - &sinktemplate); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (gstelement_class, "H264Parse", "Codec/Parser/Video", "Parses raw h264 stream", diff --git a/gst/hdvparse/gsthdvparse.c b/gst/hdvparse/gsthdvparse.c index 28e62092e..9a610f7cb 100644 --- a/gst/hdvparse/gsthdvparse.c +++ b/gst/hdvparse/gsthdvparse.c @@ -116,9 +116,10 @@ gst_hdvparse_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "HDVParser", "Data/Parser", "HDV private stream Parser", "Edward Hervey <bilboed@bilboed.com>"); diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index 92e5f6828..504df27fc 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -46,7 +46,7 @@ #include <gst/base/gsttypefindhelper.h> #include "gsthlsdemux.h" -static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src%d", +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); @@ -132,9 +132,11 @@ gst_hls_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "HLS Demuxer", diff --git a/gst/id3tag/gstid3mux.c b/gst/id3tag/gstid3mux.c index 1ed7e5c9c..f2330d2b1 100644 --- a/gst/id3tag/gstid3mux.c +++ b/gst/id3tag/gstid3mux.c @@ -98,10 +98,11 @@ gst_id3_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "ID3 v1 and v2 Muxer", "Formatter/Metadata", diff --git a/gst/id3tag/id3tag.c b/gst/id3tag/id3tag.c index 3a0e4d48d..fc69a49c4 100644 --- a/gst/id3tag/id3tag.c +++ b/gst/id3tag/id3tag.c @@ -483,7 +483,7 @@ add_id3v2frame_tag (GstId3v2Tag * id3v2tag, const GstTagList * list, GstBuffer *buf; val = gst_tag_list_get_value_index (list, tag, i); - buf = (GstBuffer *) gst_value_get_mini_object (val); + buf = gst_value_get_buffer (val); if (buf && GST_BUFFER_CAPS (buf)) { GstStructure *s; @@ -693,7 +693,7 @@ add_image_tag (GstId3v2Tag * id3v2tag, const GstTagList * list, GST_DEBUG ("image %u/%u", n + 1, num_tags); val = gst_tag_list_get_value_index (list, tag, n); - image = (GstBuffer *) gst_value_get_mini_object (val); + image = gst_value_get_buffer (val); if (GST_IS_BUFFER (image) && GST_BUFFER_SIZE (image) > 0 && GST_BUFFER_CAPS (image) != NULL && diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c index 3f65d32b7..d5eb98b0f 100644 --- a/gst/inter/gstinteraudiosink.c +++ b/gst/inter/gstinteraudiosink.c @@ -109,8 +109,8 @@ gst_inter_audio_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_inter_audio_sink_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_inter_audio_sink_sink_template)); gst_element_class_set_details_simple (element_class, "FIXME Long name", "Generic", "FIXME Description", "FIXME <fixme@example.com>"); diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c index 4a959f90f..df7c16f70 100644 --- a/gst/inter/gstinteraudiosrc.c +++ b/gst/inter/gstinteraudiosrc.c @@ -111,8 +111,8 @@ gst_inter_audio_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_inter_audio_src_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_inter_audio_src_src_template)); gst_element_class_set_details_simple (element_class, "FIXME Long name", "Generic", "FIXME Description", "FIXME <fixme@example.com>"); diff --git a/gst/inter/gstintervideosink.c b/gst/inter/gstintervideosink.c index cb0eea66a..940d7b27e 100644 --- a/gst/inter/gstintervideosink.c +++ b/gst/inter/gstintervideosink.c @@ -103,8 +103,8 @@ gst_inter_video_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_inter_video_sink_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_inter_video_sink_sink_template)); gst_element_class_set_details_simple (element_class, "FIXME Long name", "Generic", "FIXME Description", "FIXME <fixme@example.com>"); diff --git a/gst/inter/gstintervideosrc.c b/gst/inter/gstintervideosrc.c index 3a805c0c8..04d965530 100644 --- a/gst/inter/gstintervideosrc.c +++ b/gst/inter/gstintervideosrc.c @@ -107,8 +107,8 @@ gst_inter_video_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_inter_video_src_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_inter_video_src_src_template)); gst_element_class_set_details_simple (element_class, "FIXME Long name", "Generic", "FIXME Description", "FIXME <fixme@example.com>"); diff --git a/gst/interlace/gstinterlace.c b/gst/interlace/gstinterlace.c index 0e86f8570..c6181ecad 100644 --- a/gst/interlace/gstinterlace.c +++ b/gst/interlace/gstinterlace.c @@ -226,10 +226,10 @@ gst_interlace_base_init (gpointer g_class) "Creates an interlaced video from progressive frames", "David Schleef <ds@schleef.org>"); - gst_element_class_add_static_pad_template (element_class, - &gst_interlace_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_interlace_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_interlace_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_interlace_src_template)); } static void diff --git a/gst/ivfparse/gstivfparse.c b/gst/ivfparse/gstivfparse.c index 0ebbe0717..ed79ab723 100644 --- a/gst/ivfparse/gstivfparse.c +++ b/gst/ivfparse/gstivfparse.c @@ -84,8 +84,10 @@ gst_ivf_parse_base_init (gpointer gclass) "Codec/Demuxer", "Demuxes a IVF stream", "Philip Jägenstedt <philipj@opera.com>"); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); } /* initialize the ivfparse's class */ diff --git a/gst/jp2kdecimator/gstjp2kdecimator.c b/gst/jp2kdecimator/gstjp2kdecimator.c index f72b6a22f..98b50bb25 100644 --- a/gst/jp2kdecimator/gstjp2kdecimator.c +++ b/gst/jp2kdecimator/gstjp2kdecimator.c @@ -100,10 +100,10 @@ gst_jp2k_decimator_base_init (gpointer g_class) "Removes information from JPEG2000 streams without recompression", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - gst_element_class_add_static_pad_template (gstelement_class, - &sink_pad_template); - gst_element_class_add_static_pad_template (gstelement_class, - &src_pad_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_pad_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_pad_template)); } static void diff --git a/gst/jp2kdecimator/jp2kcodestream.c b/gst/jp2kdecimator/jp2kcodestream.c index 6fb28788e..cbff65414 100644 --- a/gst/jp2kdecimator/jp2kcodestream.c +++ b/gst/jp2kdecimator/jp2kcodestream.c @@ -413,8 +413,8 @@ init_packet_iterator (GstJP2kDecimator * self, PacketIterator * it, it->n_layers = (tile->cod) ? tile->cod->n_layers : header->cod.n_layers; it->n_resolutions = 1 + - ((tile->cod) ? tile->cod->n_decompositions : header-> - cod.n_decompositions); + ((tile->cod) ? tile->cod->n_decompositions : header->cod. + n_decompositions); it->n_components = header->siz.n_components; it->tx0 = tile->tx0; @@ -457,8 +457,8 @@ init_packet_iterator (GstJP2kDecimator * self, PacketIterator * it, } order = - (tile->cod) ? tile->cod->progression_order : header-> - cod.progression_order; + (tile->cod) ? tile->cod->progression_order : header->cod. + progression_order; if (order == PROGRESSION_ORDER_LRCP) { it->next = packet_iterator_next_lrcp; } else if (order == PROGRESSION_ORDER_RLCP) { @@ -574,8 +574,8 @@ parse_cod (GstJP2kDecimator * self, GstByteReader * reader, } Scod = gst_byte_reader_get_uint8_unchecked (reader); - cod->sop = ! !(Scod & 0x02); - cod->eph = ! !(Scod & 0x04); + cod->sop = !!(Scod & 0x02); + cod->eph = !!(Scod & 0x04); /* SGcod */ cod->progression_order = gst_byte_reader_get_uint8_unchecked (reader); @@ -642,8 +642,8 @@ write_cod (GstJP2kDecimator * self, GstByteWriter * writer, /* Scod */ tmp = - (cod->PPx ? 0x01 : 0x00) | (cod-> - sop ? 0x02 : 0x00) | (cod->eph ? 0x04 : 0x00); + (cod->PPx ? 0x01 : 0x00) | (cod->sop ? 0x02 : 0x00) | (cod-> + eph ? 0x04 : 0x00); gst_byte_writer_put_uint8_unchecked (writer, tmp); /* SGcod */ diff --git a/gst/jpegformat/gstjifmux.c b/gst/jpegformat/gstjifmux.c index 56e6ff71a..b9552b18a 100644 --- a/gst/jpegformat/gstjifmux.c +++ b/gst/jpegformat/gstjifmux.c @@ -114,39 +114,10 @@ static GstFlowReturn gst_jif_mux_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_jif_mux_change_state (GstElement * element, GstStateChange transition); - -static void -gst_jif_type_init (GType type) -{ - static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; - static const GInterfaceInfo tag_xmp_writer_info = { NULL, NULL, NULL }; - - g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); - g_type_add_interface_static (type, GST_TYPE_TAG_XMP_WRITER, - &tag_xmp_writer_info); - - GST_DEBUG_CATEGORY_INIT (jif_mux_debug, "jifmux", 0, - "JPEG interchange format muxer"); -} - -GST_BOILERPLATE_FULL (GstJifMux, gst_jif_mux, GstElement, GST_TYPE_ELEMENT, - gst_jif_type_init); - -static void -gst_jif_mux_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_jif_mux_src_pad_template); - gst_element_class_add_static_pad_template (element_class, - &gst_jif_mux_sink_pad_template); - gst_element_class_set_details_simple (element_class, - "JPEG stream muxer", - "Video/Formatter", - "Remuxes JPEG images with markers and tags", - "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>"); -} +#define gst_jif_mux_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstJifMux, gst_jif_mux, GST_TYPE_ELEMENT, + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL); + G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_XMP_WRITER, NULL)); static void gst_jif_mux_class_init (GstJifMuxClass * klass) @@ -159,13 +130,27 @@ gst_jif_mux_class_init (GstJifMuxClass * klass) g_type_class_add_private (gobject_class, sizeof (GstJifMuxPrivate)); + gobject_class->finalize = gst_jif_mux_finalize; + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_jif_mux_change_state); - gobject_class->finalize = gst_jif_mux_finalize; + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_jif_mux_src_pad_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_jif_mux_sink_pad_template)); + + gst_element_class_set_details_simple (gstelement_class, + "JPEG stream muxer", + "Video/Formatter", + "Remuxes JPEG images with markers and tags", + "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>"); + + GST_DEBUG_CATEGORY_INIT (jif_mux_debug, "jifmux", 0, + "JPEG interchange format muxer"); } static void -gst_jif_mux_init (GstJifMux * self, GstJifMuxClass * g_class) +gst_jif_mux_init (GstJifMux * self) { GstPad *sinkpad; @@ -176,8 +161,6 @@ gst_jif_mux_init (GstJifMux * self, GstJifMuxClass * g_class) sinkpad = gst_pad_new_from_static_template (&gst_jif_mux_sink_pad_template, "sink"); gst_pad_set_chain_function (sinkpad, GST_DEBUG_FUNCPTR (gst_jif_mux_chain)); - gst_pad_set_setcaps_function (sinkpad, - GST_DEBUG_FUNCPTR (gst_jif_mux_sink_setcaps)); gst_pad_set_event_function (sinkpad, GST_DEBUG_FUNCPTR (gst_jif_mux_sink_event)); gst_element_add_pad (GST_ELEMENT (self), sinkpad); @@ -219,6 +202,15 @@ gst_jif_mux_sink_event (GstPad * pad, GstEvent * event) gboolean ret; switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + ret = gst_jif_mux_sink_setcaps (pad, caps); + gst_event_unref (event); + break; + } case GST_EVENT_TAG:{ GstTagList *list; GstTagSetter *setter = GST_TAG_SETTER (self); @@ -227,12 +219,14 @@ gst_jif_mux_sink_event (GstPad * pad, GstEvent * event) gst_event_parse_tag (event, &list); gst_tag_setter_merge_tags (setter, list, mode); + + ret = gst_pad_event_default (pad, event); break; } default: + ret = gst_pad_event_default (pad, event); break; } - ret = gst_pad_event_default (pad, event); return ret; } @@ -276,13 +270,18 @@ gst_jif_mux_new_marker (guint8 marker, guint16 size, const guint8 * data, static gboolean gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf) { - GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buf); + GstByteReader reader; GstJifMuxMarker *m; guint8 marker = 0; guint16 size = 0; const guint8 *data = NULL; + guint8 *bdata; + gsize bsize; + + bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ); + gst_byte_reader_init (&reader, bdata, bsize); - GST_LOG_OBJECT (self, "Received buffer of size: %u", GST_BUFFER_SIZE (buf)); + GST_LOG_OBJECT (self, "Received buffer of size: %u", bsize); if (!gst_byte_reader_peek_uint8 (&reader, &marker)) goto error; @@ -330,21 +329,23 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf) if (marker == SOS) { gint eoi_pos = -1; gint i; + guint8 *mdata; + gsize msize; /* search the last 5 bytes for the EOI marker */ - g_assert (GST_BUFFER_SIZE (buf) >= 5); + mdata = gst_buffer_map (buf, &msize, NULL, GST_MAP_READ); + g_assert (msize >= 5); for (i = 5; i >= 2; i--) { - if (GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf) - i] == 0xFF && - GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf) - i + 1] == EOI) { - eoi_pos = GST_BUFFER_SIZE (buf) - i; + if (mdata[msize - i] == 0xFF && mdata[msize - i + 1] == EOI) { + eoi_pos = msize - i; break; } } - if (eoi_pos == -1) { GST_WARNING_OBJECT (self, "Couldn't find an EOI marker"); - eoi_pos = GST_BUFFER_SIZE (buf); + eoi_pos = msize; } + gst_buffer_unmap (buf, mdata, msize); /* remaining size except EOI is scan data */ self->priv->scan_size = eoi_pos - gst_byte_reader_get_pos (&reader); @@ -359,17 +360,23 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf) goto error; } GST_INFO_OBJECT (self, "done parsing at 0x%x / 0x%x", - gst_byte_reader_get_pos (&reader), GST_BUFFER_SIZE (buf)); + gst_byte_reader_get_pos (&reader), bsize); done: self->priv->markers = g_list_reverse (self->priv->markers); + gst_buffer_unmap (buf, bdata, bsize); + return TRUE; + /* ERRORS */ error: - GST_WARNING_OBJECT (self, - "Error parsing image header (need more that %u bytes available)", - gst_byte_reader_get_remaining (&reader)); - return FALSE; + { + GST_WARNING_OBJECT (self, + "Error parsing image header (need more that %u bytes available)", + gst_byte_reader_get_remaining (&reader)); + gst_buffer_unmap (buf, bdata, bsize); + return FALSE; + } } static gboolean @@ -531,25 +538,25 @@ gst_jif_mux_mangle_markers (GstJifMux * self) /* Add EXIF */ { GstBuffer *exif_data; + gsize exif_size; guint8 *data; GstJifMuxMarker *m; GList *pos; /* insert into self->markers list */ exif_data = gst_tag_list_to_exif_buffer_with_tiff_header (tags); - if (exif_data && - GST_BUFFER_SIZE (exif_data) + 8 >= G_GUINT64_CONSTANT (65536)) { + exif_size = exif_data ? gst_buffer_get_size (exif_data) : 0; + + if (exif_data && exif_size + 8 >= G_GUINT64_CONSTANT (65536)) { GST_WARNING_OBJECT (self, "Exif tags data size exceed maximum size"); gst_buffer_unref (exif_data); exif_data = NULL; } if (exif_data) { - data = g_malloc0 (GST_BUFFER_SIZE (exif_data) + 6); + data = g_malloc0 (exif_size + 6); memcpy (data, "Exif", 4); - memcpy (data + 6, GST_BUFFER_DATA (exif_data), - GST_BUFFER_SIZE (exif_data)); - m = gst_jif_mux_new_marker (APP1, GST_BUFFER_SIZE (exif_data) + 6, data, - TRUE); + gst_buffer_extract (exif_data, 0, data + 6, exif_size); + m = gst_jif_mux_new_marker (APP1, exif_size + 6, data, TRUE); gst_buffer_unref (exif_data); if (app1_exif) { @@ -578,13 +585,14 @@ gst_jif_mux_mangle_markers (GstJifMux * self) gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (self), tags, FALSE); if (xmp_data) { - guint8 *data, *xmp = GST_BUFFER_DATA (xmp_data); - guint size = GST_BUFFER_SIZE (xmp_data); + guint8 *data; + gsize size; GList *pos; + size = gst_buffer_get_size (xmp_data); data = g_malloc (size + 29); memcpy (data, "http://ns.adobe.com/xap/1.0/\0", 29); - memcpy (&data[29], xmp, size); + gst_buffer_extract (xmp_data, 0, &data[29], size); m = gst_jif_mux_new_marker (APP1, size + 29, data, TRUE); /* @@ -640,11 +648,12 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf, { GstBuffer *buf; GstByteWriter *writer; - GstFlowReturn fret; GstJifMuxMarker *m; GList *node; guint size = self->priv->scan_size; gboolean writer_status = TRUE; + guint8 *bdata; + gsize bsize; /* iterate list and collect size */ for (node = self->priv->markers; node; node = g_list_next (node)) { @@ -658,21 +667,19 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf, size += 2; } GST_INFO_OBJECT (self, "old size: %u, new size: %u", - GST_BUFFER_SIZE (old_buf), size); + gst_buffer_get_size (old_buf), size); /* allocate new buffer */ - fret = gst_pad_alloc_buffer_and_set_caps (self->priv->srcpad, - GST_BUFFER_OFFSET (old_buf), size, GST_PAD_CAPS (self->priv->srcpad), - &buf); - if (fret != GST_FLOW_OK) - goto no_buffer; + buf = gst_buffer_new_allocate (NULL, size, 0); /* copy buffer metadata */ - gst_buffer_copy_metadata (buf, old_buf, - GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS); + gst_buffer_copy_into (buf, old_buf, + GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1); /* memcopy markers */ - writer = gst_byte_writer_new_with_buffer (buf, TRUE); + bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_WRITE); + writer = gst_byte_writer_new_with_data (bdata, bsize, TRUE); + for (node = self->priv->markers; node && writer_status; node = g_list_next (node)) { m = (GstJifMuxMarker *) node->data; @@ -694,6 +701,7 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf, self->priv->scan_size); } } + gst_buffer_unmap (buf, bdata, bsize); gst_byte_writer_free (writer); if (!writer_status) { @@ -704,11 +712,6 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf, *new_buf = buf; return GST_FLOW_OK; - -no_buffer: - GST_WARNING_OBJECT (self, "failed to allocate output buffer, flow_ret = %s", - gst_flow_get_name (fret)); - return fret; } static GstFlowReturn @@ -717,15 +720,11 @@ gst_jif_mux_chain (GstPad * pad, GstBuffer * buf) GstJifMux *self = GST_JIF_MUX (GST_PAD_PARENT (pad)); GstFlowReturn fret = GST_FLOW_OK; - if (GST_BUFFER_CAPS (buf) == NULL) { - GST_WARNING_OBJECT (self, "Rejecting buffer without caps"); - gst_buffer_unref (buf); - return GST_FLOW_NOT_NEGOTIATED; - } - +#if 0 GST_MEMDUMP ("jpeg beg", GST_BUFFER_DATA (buf), 64); GST_MEMDUMP ("jpeg end", GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf) - 64, 64); +#endif /* we should have received a whole picture from SOI to EOI * build a list of markers */ diff --git a/gst/jpegformat/gstjpegparse.c b/gst/jpegformat/gstjpegparse.c index 1d4eaf9a2..fd977dc79 100644 --- a/gst/jpegformat/gstjpegparse.c +++ b/gst/jpegformat/gstjpegparse.c @@ -59,7 +59,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " - "format = (fourcc) { I420, Y41B, UYVY, YV12 }, " + "format = (string) { I420, Y41B, UYVY, YV12 }, " "width = (int) [ 0, MAX ]," "height = (int) [ 0, MAX ], " "interlaced = (boolean) { true, false }, " @@ -99,8 +99,8 @@ struct _GstJpegParsePrivate /* TRUE if the image is interlaced */ gboolean interlaced; - /* fourcc color space */ - guint32 fourcc; + /* format color space */ + const gchar *format; /* TRUE if the src caps sets a specific framerate */ gboolean has_fps; @@ -124,31 +124,12 @@ static void gst_jpeg_parse_dispose (GObject * object); static GstFlowReturn gst_jpeg_parse_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_jpeg_parse_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_jpeg_parse_sink_event (GstPad * pad, GstEvent * event); -static GstCaps *gst_jpeg_parse_src_getcaps (GstPad * pad); +static GstCaps *gst_jpeg_parse_src_getcaps (GstPad * pad, GstCaps * filter); static GstStateChangeReturn gst_jpeg_parse_change_state (GstElement * element, GstStateChange transition); -#define _do_init(bla) \ - GST_DEBUG_CATEGORY_INIT (jpeg_parse_debug, "jpegparse", 0, "JPEG parser"); - -GST_BOILERPLATE_FULL (GstJpegParse, gst_jpeg_parse, GstElement, - GST_TYPE_ELEMENT, _do_init); - -static void -gst_jpeg_parse_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_jpeg_parse_src_pad_template); - gst_element_class_add_static_pad_template (element_class, - &gst_jpeg_parse_sink_pad_template); - gst_element_class_set_details_simple (element_class, - "JPEG stream parser", - "Video/Parser", - "Parse JPEG images into single-frame buffers", - "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>"); -} +#define gst_jpeg_parse_parent_class parent_class +G_DEFINE_TYPE (GstJpegParse, gst_jpeg_parse, GST_TYPE_ELEMENT); static void gst_jpeg_parse_class_init (GstJpegParseClass * klass) @@ -164,10 +145,23 @@ gst_jpeg_parse_class_init (GstJpegParseClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_jpeg_parse_change_state); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_jpeg_parse_src_pad_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_jpeg_parse_sink_pad_template)); + + gst_element_class_set_details_simple (gstelement_class, + "JPEG stream parser", + "Video/Parser", + "Parse JPEG images into single-frame buffers", + "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>"); + + GST_DEBUG_CATEGORY_INIT (jpeg_parse_debug, "jpegparse", 0, "JPEG parser"); } static void -gst_jpeg_parse_init (GstJpegParse * parse, GstJpegParseClass * g_class) +gst_jpeg_parse_init (GstJpegParse * parse) { GstPad *sinkpad; @@ -181,8 +175,6 @@ gst_jpeg_parse_init (GstJpegParse * parse, GstJpegParseClass * g_class) GST_DEBUG_FUNCPTR (gst_jpeg_parse_chain)); gst_pad_set_event_function (sinkpad, GST_DEBUG_FUNCPTR (gst_jpeg_parse_sink_event)); - gst_pad_set_setcaps_function (sinkpad, - GST_DEBUG_FUNCPTR (gst_jpeg_parse_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (parse), sinkpad); parse->priv->srcpad = @@ -234,12 +226,11 @@ gst_jpeg_parse_sink_setcaps (GstPad * pad, GstCaps * caps) } static GstCaps * -gst_jpeg_parse_src_getcaps (GstPad * pad) +gst_jpeg_parse_src_getcaps (GstPad * pad, GstCaps * filter) { GstCaps *result; - if ((result = GST_PAD_CAPS (pad))) { - result = gst_caps_ref (result); + if ((result = gst_pad_get_current_caps (pad))) { GST_DEBUG_OBJECT (pad, "using pad caps %" GST_PTR_FORMAT, result); } else { result = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad))); @@ -487,21 +478,21 @@ gst_jpeg_parse_sof (GstJpegParse * parse, GstByteReader * reader) } if (numcomps == 1) { - /* gray image - no fourcc */ - parse->priv->fourcc = 0; + /* gray image - no format */ + parse->priv->format = ""; } else if (numcomps == 3) { temp = (blockWidth[0] * blockHeight[0]) / (blockWidth[1] * blockHeight[1]); if (temp == 4 && blockHeight[0] == 2) - parse->priv->fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); + parse->priv->format = "I420"; else if (temp == 4 && blockHeight[0] == 4) - parse->priv->fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); + parse->priv->format = "Y41B"; else if (temp == 2) - parse->priv->fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); + parse->priv->format = "UYVY"; else if (temp == 1) - parse->priv->fourcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); + parse->priv->format = "YV12"; else - parse->priv->fourcc = 0; + parse->priv->format = ""; } else { return FALSE; } @@ -517,7 +508,8 @@ gst_jpeg_parse_remove_marker (GstJpegParse * parse, { guint16 size = 0; guint pos = gst_byte_reader_get_pos (reader); - guint8 *data = GST_BUFFER_DATA (buffer); + guint8 *data; + gsize bsize; if (!gst_byte_reader_peek_uint16_be (reader, &size)) return FALSE; @@ -526,9 +518,9 @@ gst_jpeg_parse_remove_marker (GstJpegParse * parse, GST_LOG_OBJECT (parse, "unhandled marker %x removing %u bytes", marker, size); - memmove (&data[pos], &data[pos + size], - GST_BUFFER_SIZE (buffer) - (pos + size)); - GST_BUFFER_SIZE (buffer) -= size; + data = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READWRITE); + memmove (&data[pos], &data[pos + size], bsize - (pos + size)); + gst_buffer_unmap (buffer, data, bsize - size); if (!gst_byte_reader_set_pos (reader, pos - size)) return FALSE; @@ -579,14 +571,12 @@ get_tag_list (GstJpegParse * parse) static inline void extract_and_queue_tags (GstJpegParse * parse, guint size, guint8 * data, - GstTagList * (*tag_func) (const GstBuffer * buff)) + GstTagList * (*tag_func) (GstBuffer * buff)) { GstTagList *tags; GstBuffer *buf; - buf = gst_buffer_new (); - GST_BUFFER_DATA (buf) = data; - GST_BUFFER_SIZE (buf) = size; + buf = gst_buffer_new_wrapped_full (data, NULL, 0, size); tags = tag_func (buf); gst_buffer_unref (buf); @@ -702,9 +692,14 @@ gst_jpeg_parse_com (GstJpegParse * parse, GstByteReader * reader) static gboolean gst_jpeg_parse_read_header (GstJpegParse * parse, GstBuffer * buffer) { - GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); + GstByteReader reader; guint8 marker = 0; gboolean foundSOF = FALSE; + guint8 *data; + gsize size; + + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + gst_byte_reader_init (&reader, data, size); if (!gst_byte_reader_peek_uint8 (&reader, &marker)) goto error; @@ -720,7 +715,7 @@ gst_jpeg_parse_read_header (GstJpegParse * parse, GstBuffer * buffer) switch (marker) { case SOS: /* start of scan (begins compressed data) */ - return foundSOF; + goto done; case SOI: break; @@ -751,12 +746,12 @@ gst_jpeg_parse_read_header (GstJpegParse * parse, GstBuffer * buffer) parse->priv->interlaced = TRUE; /* fall through */ case SOF0: - foundSOF = TRUE; /* parse Start Of Frame */ if (!gst_jpeg_parse_sof (parse, &reader)) goto error; - return TRUE; + foundSOF = TRUE; + goto done; default: if (marker == JPG || (marker >= JPG0 && marker <= JPG13)) { @@ -766,25 +761,35 @@ gst_jpeg_parse_read_header (GstJpegParse * parse, GstBuffer * buffer) } else if (marker >= APP0 && marker <= APP15) { if (!gst_jpeg_parse_skip_marker (parse, &reader, marker)) goto error; - } else { - 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; - } + } else + goto unhandled; } if (!gst_byte_reader_peek_uint8 (&reader, &marker)) goto error; } +done: + gst_buffer_unmap (buffer, data, size); 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; + { + GST_WARNING_OBJECT (parse, + "Error parsing image header (need more than %u bytes available)", + gst_byte_reader_get_remaining (&reader)); + gst_buffer_unmap (buffer, data, size); + 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. */ + gst_buffer_unmap (buffer, data, size); + return FALSE; + } } static gboolean @@ -801,7 +806,7 @@ gst_jpeg_parse_set_new_caps (GstJpegParse * parse, gboolean header_ok) if (header_ok == TRUE) { gst_caps_set_simple (caps, - "format", GST_TYPE_FOURCC, parse->priv->fourcc, + "format", G_TYPE_STRING, parse->priv->format, "interlaced", G_TYPE_BOOLEAN, parse->priv->interlaced, "width", G_TYPE_INT, parse->priv->width, "height", G_TYPE_INT, parse->priv->height, NULL); @@ -896,8 +901,6 @@ gst_jpeg_parse_push_buffer (GstJpegParse * parse, guint len) GST_BUFFER_DURATION (outbuf) = parse->priv->duration; - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (parse->priv->srcpad)); - GST_LOG_OBJECT (parse, "pushing buffer (ts=%" GST_TIME_FORMAT ", len=%u)", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), len); @@ -957,6 +960,15 @@ gst_jpeg_parse_sink_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (parse, "event : %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + res = gst_jpeg_parse_sink_setcaps (pad, caps); + gst_event_unref (event); + break; + } case GST_EVENT_FLUSH_STOP: parse->priv->next_ts = GST_CLOCK_TIME_NONE; parse->priv->last_offset = 0; @@ -972,7 +984,7 @@ gst_jpeg_parse_sink_event (GstPad * pad, GstEvent * event) res = gst_pad_push_event (parse->priv->srcpad, event); break; } - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: /* Discard any data in the adapter. There should have been an EOS before * to flush it. */ gst_adapter_clear (parse->priv->adapter); diff --git a/gst/legacyresample/gstlegacyresample.c b/gst/legacyresample/gstlegacyresample.c index 46bb0bf59..95c924eae 100644 --- a/gst/legacyresample/gstlegacyresample.c +++ b/gst/legacyresample/gstlegacyresample.c @@ -135,10 +135,10 @@ gst_legacyresample_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_legacyresample_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_legacyresample_sink_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_legacyresample_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_legacyresample_sink_template)); gst_element_class_set_details_simple (gstelement_class, "Audio scaler", "Filter/Converter/Audio", diff --git a/gst/librfb/gstrfbsrc.c b/gst/librfb/gstrfbsrc.c index 879892b01..c6e5a13bb 100644 --- a/gst/librfb/gstrfbsrc.c +++ b/gst/librfb/gstrfbsrc.c @@ -89,8 +89,8 @@ gst_rfb_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_rfb_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rfb_src_template)); gst_element_class_set_details_simple (element_class, "Rfb source", "Source/Video", diff --git a/gst/liveadder/liveadder.c b/gst/liveadder/liveadder.c index 205bd020d..ec232a709 100644 --- a/gst/liveadder/liveadder.c +++ b/gst/liveadder/liveadder.c @@ -54,7 +54,7 @@ GST_DEBUG_CATEGORY_STATIC (live_adder_debug); #define GST_CAT_DEFAULT (live_adder_debug) static GstStaticPadTemplate gst_live_adder_sink_template = - GST_STATIC_PAD_TEMPLATE ("sink%d", + GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " @@ -158,10 +158,10 @@ gst_live_adder_base_init (gpointer klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; - gst_element_class_add_static_pad_template (gstelement_class, - &gst_live_adder_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_live_adder_sink_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_live_adder_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_live_adder_sink_template)); gst_element_class_set_details_simple (gstelement_class, "Live Adder element", "Generic/Audio", "Mixes live/discontinuous audio streams", @@ -1384,7 +1384,7 @@ gst_live_adder_request_new_pad (GstElement * element, GstPadTemplate * templ, padcount = g_atomic_int_exchange_and_add (&adder->padcount, 1); #endif - name = g_strdup_printf ("sink%d", padcount); + name = g_strdup_printf ("sink_%u", padcount); newpad = gst_pad_new_from_template (templ, name); GST_DEBUG_OBJECT (adder, "request new pad %s", name); g_free (name); diff --git a/gst/mixmatrix/mixmatrix.c b/gst/mixmatrix/mixmatrix.c index fd3ad29e3..5c1d26e63 100644 --- a/gst/mixmatrix/mixmatrix.c +++ b/gst/mixmatrix/mixmatrix.c @@ -85,14 +85,14 @@ enum }; static GstStaticPadTemplate mixmatrix_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink%d", +GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) ); static GstStaticPadTemplate mixmatrix_src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", +GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) @@ -148,10 +148,10 @@ gst_mixmatrix_base_init (GstMixMatrixClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &mixmatrix_sink_template); - gst_element_class_add_static_pad_template (element_class, - &mixmatrix_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mixmatrix_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mixmatrix_src_template)); gst_element_class_set_details_simple (element_class, "Mixing Matrix", "Filter/Editor/Audio", "Mix N audio channels together into M channels", @@ -370,7 +370,7 @@ gst_mixmatrix_request_new_pad (GstElement * element, GstPadTemplate * templ, mix = GST_MIXMATRIX (element); /* figure out if it's a sink pad */ - if (sscanf (name, "sink%d", &padnum)) { + if (sscanf (name, "sink_%u", &padnum)) { /* check to see if it already exists */ if (padnum < mix->sinkpadalloc && mix->sinkpads[padnum]) return mix->sinkpads[padnum]; @@ -393,7 +393,7 @@ gst_mixmatrix_request_new_pad (GstElement * element, GstPadTemplate * templ, mix->sinkpads[padnum] = pad; } /* or it's a src pad */ - else if (sscanf (name, "src%d", &padnum)) { + else if (sscanf (name, "src_%u", &padnum)) { /* check to see if it already exists */ if (padnum < mix->srcpadalloc && mix->srcpads[padnum]) return mix->srcpads[padnum]; diff --git a/gst/mpeg1sys/gstmpeg1systemencode.c b/gst/mpeg1sys/gstmpeg1systemencode.c index cc7dc7fd5..282009005 100644 --- a/gst/mpeg1sys/gstmpeg1systemencode.c +++ b/gst/mpeg1sys/gstmpeg1systemencode.c @@ -47,7 +47,7 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("video/mpeg, " "systemstream = (boolean) TRUE") ); static GstStaticPadTemplate video_sink_factory = -GST_STATIC_PAD_TEMPLATE ("video_%d", +GST_STATIC_PAD_TEMPLATE ("video_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpeg, " @@ -55,7 +55,7 @@ GST_STATIC_PAD_TEMPLATE ("video_%d", ); static GstStaticPadTemplate audio_sink_factory = -GST_STATIC_PAD_TEMPLATE ("audio_%d", +GST_STATIC_PAD_TEMPLATE ("audio_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/mpeg, " @@ -110,11 +110,12 @@ gst_system_encode_base_init (GstMPEG1SystemEncodeClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &audio_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_factory)); gst_element_class_set_details_simple (element_class, "MPEG-1 muxer", "Codec/Muxer", "Multiplexes MPEG-1 Streams", "Wim Taymans <wim.taymans@chello.be>"); diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c index 164321ec4..d77fd23ad 100644 --- a/gst/mpegdemux/mpegtsparse.c +++ b/gst/mpegdemux/mpegtsparse.c @@ -93,13 +93,13 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", ); static GstStaticPadTemplate src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); static GstStaticPadTemplate program_template = -GST_STATIC_PAD_TEMPLATE ("program_%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("program_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); @@ -222,11 +222,12 @@ mpegts_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_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_add_static_pad_template (element_class, - &program_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&program_template)); gst_element_class_set_details_simple (element_class, "MPEG transport stream parser", "Codec/Parser", @@ -403,7 +404,7 @@ mpegts_parse_activate_program (MpegTSParse * parse, MpegTSParsePad *tspad; gchar *pad_name; - pad_name = g_strdup_printf ("program_%d", program->program_number); + pad_name = g_strdup_printf ("program_%u", program->program_number); tspad = mpegts_parse_create_tspad (parse, pad_name); tspad->program_number = program->program_number; @@ -668,7 +669,7 @@ mpegts_parse_request_new_pad (GstElement * element, GstPadTemplate * template, parse = GST_MPEGTS_PARSE (element); GST_OBJECT_LOCK (element); - name = g_strdup_printf ("src%d", parse->req_pads++); + name = g_strdup_printf ("src_%u", parse->req_pads++); GST_OBJECT_UNLOCK (element); pad = mpegts_parse_create_tspad (parse, name)->pad; diff --git a/gst/mpegpsmux/mpegpsmux.c b/gst/mpegpsmux/mpegpsmux.c index 218f4fb0e..3fff4be51 100644 --- a/gst/mpegpsmux/mpegpsmux.c +++ b/gst/mpegpsmux/mpegpsmux.c @@ -60,7 +60,7 @@ enum #define DEFAULT_AGGREGATE_GOPS FALSE static GstStaticPadTemplate mpegpsmux_sink_factory = - GST_STATIC_PAD_TEMPLATE ("sink_%d", + GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpeg, " @@ -112,10 +112,10 @@ mpegpsmux_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &mpegpsmux_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &mpegpsmux_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mpegpsmux_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mpegpsmux_src_factory)); gst_element_class_set_details_simple (element_class, "MPEG Program Stream Muxer", "Codec/Muxer", diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index d8c7073e5..886d6da3e 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -77,22 +77,35 @@ static void mpegts_base_dispose (GObject * object); static void mpegts_base_finalize (GObject * object); static void mpegts_base_free_program (MpegTSBaseProgram * program); static void mpegts_base_free_stream (MpegTSBaseStream * ptream); -static gboolean mpegts_base_sink_activate (GstPad * pad); -static gboolean mpegts_base_sink_activate_pull (GstPad * pad, gboolean active); -static gboolean mpegts_base_sink_activate_push (GstPad * pad, gboolean active); -static GstFlowReturn mpegts_base_chain (GstPad * pad, GstBuffer * buf); -static gboolean mpegts_base_sink_event (GstPad * pad, GstEvent * event); +static gboolean mpegts_base_sink_activate (GstPad * pad, GstObject * parent); +static gboolean mpegts_base_sink_activate_mode (GstPad * pad, + GstObject * parent, GstPadMode mode, gboolean active); +static GstFlowReturn mpegts_base_chain (GstPad * pad, GstObject * parent, + GstBuffer * buf); +static gboolean mpegts_base_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); static GstStateChangeReturn mpegts_base_change_state (GstElement * element, GstStateChange transition); -static void _extra_init (GType type); + static void mpegts_base_get_tags_from_sdt (MpegTSBase * base, GstStructure * sdt_info); static void mpegts_base_get_tags_from_eit (MpegTSBase * base, GstStructure * eit_info); -GST_BOILERPLATE_FULL (MpegTSBase, mpegts_base, GstElement, GST_TYPE_ELEMENT, - _extra_init); +static void +_extra_init (void) +{ + QUARK_PROGRAMS = g_quark_from_string ("programs"); + QUARK_PROGRAM_NUMBER = g_quark_from_string ("program-number"); + QUARK_PID = g_quark_from_string ("pid"); + QUARK_PCR_PID = g_quark_from_string ("pcr-pid"); + QUARK_STREAMS = g_quark_from_string ("streams"); + QUARK_STREAM_TYPE = g_quark_from_string ("stream-type"); +} +#define mpegts_base_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (MpegTSBase, mpegts_base, GST_TYPE_ELEMENT, + _extra_init ()); static const guint32 crc_tab[256] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, @@ -154,26 +167,6 @@ mpegts_base_calc_crc32 (guint8 * data, guint datalen) } static void -_extra_init (GType type) -{ - QUARK_PROGRAMS = g_quark_from_string ("programs"); - QUARK_PROGRAM_NUMBER = g_quark_from_string ("program-number"); - QUARK_PID = g_quark_from_string ("pid"); - QUARK_PCR_PID = g_quark_from_string ("pcr-pid"); - QUARK_STREAMS = g_quark_from_string ("streams"); - QUARK_STREAM_TYPE = g_quark_from_string ("stream-type"); -} - -static void -mpegts_base_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, - &sink_template); -} - -static void mpegts_base_class_init (MpegTSBaseClass * klass) { GObjectClass *gobject_class; @@ -181,13 +174,14 @@ mpegts_base_class_init (MpegTSBaseClass * klass) element_class = GST_ELEMENT_CLASS (klass); element_class->change_state = mpegts_base_change_state; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = mpegts_base_set_property; gobject_class->get_property = mpegts_base_get_property; gobject_class->dispose = mpegts_base_dispose; gobject_class->finalize = mpegts_base_finalize; - } static void @@ -227,14 +221,12 @@ mpegts_base_reset (MpegTSBase * base) } static void -mpegts_base_init (MpegTSBase * base, MpegTSBaseClass * klass) +mpegts_base_init (MpegTSBase * base) { base->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_activate_function (base->sinkpad, mpegts_base_sink_activate); - gst_pad_set_activatepull_function (base->sinkpad, - mpegts_base_sink_activate_pull); - gst_pad_set_activatepush_function (base->sinkpad, - mpegts_base_sink_activate_push); + gst_pad_set_activatemode_function (base->sinkpad, + mpegts_base_sink_activate_mode); gst_pad_set_chain_function (base->sinkpad, mpegts_base_chain); gst_pad_set_event_function (base->sinkpad, mpegts_base_sink_event); gst_element_add_pad (GST_ELEMENT (base), base->sinkpad); @@ -485,21 +477,30 @@ mpegts_base_free_program (MpegTSBaseProgram * program) /* FIXME : This is being called by tsdemux::find_timestamps() * We need to avoid re-entrant code like that */ +static gboolean +mpegts_base_stop_program (MpegTSBase * base, MpegTSBaseProgram * program) +{ + MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); + + GST_DEBUG_OBJECT (base, "program_number : %d", program->program_number); + + if (klass->program_stopped) + klass->program_stopped (base, program); + + return TRUE; +} + void mpegts_base_remove_program (MpegTSBase * base, gint program_number) { MpegTSBaseProgram *program; - MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); - GST_DEBUG_OBJECT (base, "program_number : %d", program_number); + program = + (MpegTSBaseProgram *) g_hash_table_lookup (base->programs, + GINT_TO_POINTER (program_number)); + if (program) + mpegts_base_stop_program (base, program); - if (klass->program_stopped) { - program = - (MpegTSBaseProgram *) g_hash_table_lookup (base->programs, - GINT_TO_POINTER (program_number)); - if (program) - klass->program_stopped (base, program); - } g_hash_table_remove (base->programs, GINT_TO_POINTER (program_number)); } @@ -956,11 +957,16 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section) /* table ids 0x70 - 0x73 do not have a crc */ if (G_LIKELY (section->table_id < 0x70 || section->table_id > 0x73)) { - if (G_UNLIKELY (mpegts_base_calc_crc32 (GST_BUFFER_DATA (section->buffer), - GST_BUFFER_SIZE (section->buffer)) != 0)) { + gpointer data; + gsize size; + + data = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + if (G_UNLIKELY (mpegts_base_calc_crc32 (data, size) != 0)) { + gst_buffer_unmap (section->buffer, data, size); GST_WARNING_OBJECT (base, "bad crc in psi pid 0x%x", section->pid); return FALSE; } + gst_buffer_unmap (section->buffer, data, size); } switch (section->table_id) { @@ -1092,7 +1098,7 @@ mpegts_base_get_tags_from_sdt (MpegTSBase * base, GstStructure * sdt_info) program = mpegts_base_get_program (base, program_number); if (program && !program->tags) { - program->tags = gst_tag_list_new_full (GST_TAG_ARTIST, + program->tags = gst_tag_list_new (GST_TAG_ARTIST, gst_structure_get_string (service, "name"), NULL); } } @@ -1133,27 +1139,33 @@ mpegts_base_get_tags_from_eit (MpegTSBase * base, GstStructure * eit_info) gst_structure_get_uint (event, "duration", &duration); program->event_id = event_id; - program->tags = gst_tag_list_new_full (GST_TAG_TITLE, + program->tags = gst_tag_list_new (GST_TAG_TITLE, title, GST_TAG_DURATION, duration * GST_SECOND, NULL); } } } } -static void +static gboolean remove_each_program (gpointer key, MpegTSBaseProgram * program, MpegTSBase * base) { /* First deactivate it */ mpegts_base_deactivate_program (base, program); - /* Then remove it */ - mpegts_base_remove_program (base, program->program_number); + + /* Then stop it */ + mpegts_base_stop_program (base, program); + + /* And tell _foreach_remove() to remove it */ + return TRUE; } static gboolean gst_mpegts_base_handle_eos (MpegTSBase * base) { - g_hash_table_foreach (base->programs, (GHFunc) remove_each_program, base); + g_hash_table_foreach_remove (base->programs, (GHRFunc) remove_each_program, + base); + /* finally remove */ return TRUE; } @@ -1171,39 +1183,28 @@ mpegts_base_flush (MpegTSBase * base) } static gboolean -mpegts_base_sink_event (GstPad * pad, GstEvent * event) +mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res = TRUE; - MpegTSBase *base = GST_MPEGTS_BASE (gst_object_get_parent (GST_OBJECT (pad))); + MpegTSBase *base = GST_MPEGTS_BASE (parent); GST_WARNING_OBJECT (base, "Got event %s", gst_event_type_get_name (GST_EVENT_TYPE (event))); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - gdouble rate, applied_rate; - GstFormat format; - gint64 start, stop, position; - - gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, - &format, &start, &stop, &position); - GST_DEBUG_OBJECT (base, - "Segment update:%d, rate:%f, applied_rate:%f, format:%s", update, - rate, applied_rate, gst_format_get_name (format)); - GST_DEBUG_OBJECT (base, - " start:%" G_GINT64_FORMAT ", stop:%" G_GINT64_FORMAT - ", position:%" G_GINT64_FORMAT, start, stop, position); - gst_segment_set_newsegment_full (&base->segment, update, rate, - applied_rate, format, start, stop, position); + gst_event_copy_segment (event, &base->segment); + gst_event_unref (event); + base->in_gap = GST_CLOCK_TIME_NONE; base->first_buf_ts = GST_CLOCK_TIME_NONE; } break; case GST_EVENT_EOS: res = gst_mpegts_base_handle_eos (base); + gst_event_unref (event); break; case GST_EVENT_FLUSH_START: mpegts_packetizer_flush (base->packetizer); @@ -1220,8 +1221,6 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) res = GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, event); gst_event_unref (event); } - - gst_object_unref (base); return res; } @@ -1241,7 +1240,7 @@ mpegts_base_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, } static GstFlowReturn -mpegts_base_chain (GstPad * pad, GstBuffer * buf) +mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstFlowReturn res = GST_FLOW_OK; MpegTSBase *base; @@ -1250,7 +1249,7 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) MpegTSPacketizer2 *packetizer; MpegTSPacketizerPacket packet; - base = GST_MPEGTS_BASE (gst_object_get_parent (GST_OBJECT (pad))); + base = GST_MPEGTS_BASE (parent); packetizer = base->packetizer; if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) && @@ -1261,17 +1260,26 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) } mpegts_packetizer_push (base->packetizer, buf); - while (((pret = - mpegts_packetizer_next_packet (base->packetizer, - &packet)) != PACKET_NEED_MORE) && res == GST_FLOW_OK) { + + while (res == GST_FLOW_OK) { + pret = mpegts_packetizer_next_packet (base->packetizer, &packet); + + /* If we don't have enough data, return */ + if (G_UNLIKELY (pret == PACKET_NEED_MORE)) + break; + + /* bad header, skip the packet */ if (G_UNLIKELY (pret == PACKET_BAD)) - /* bad header, skip the packet */ goto next; + GST_DEBUG ("Got packet (buffer:%p)", packet.buffer); + /* base PSI data */ if (packet.payload != NULL && mpegts_base_is_psi (base, &packet)) { MpegTSPacketizerSection section; + based = mpegts_packetizer_push_section (packetizer, &packet, §ion); + if (G_UNLIKELY (!based)) /* bad section data */ goto next; @@ -1279,26 +1287,28 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) if (G_LIKELY (section.complete)) { /* section complete */ based = mpegts_base_handle_psi (base, §ion); + + GST_DEBUG ("Unreffing section buffer %p", section.buffer); gst_buffer_unref (section.buffer); if (G_UNLIKELY (!based)) /* bad PSI table */ goto next; } + /* we need to push section packet downstream */ res = mpegts_base_push (base, &packet, §ion); - } else if (MPEGTS_BIT_IS_SET (base->is_pes, packet.pid)) { /* push the packet downstream */ res = mpegts_base_push (base, &packet, NULL); - } else + } else { gst_buffer_unref (packet.buffer); + } next: mpegts_packetizer_clear_packet (base->packetizer, &packet); } - gst_object_unref (base); return res; } @@ -1349,6 +1359,7 @@ mpegts_base_scan (MpegTSBase * base) ret = GST_FLOW_ERROR; beach: + GST_DEBUG ("Returning %s", gst_flow_get_name (ret)); mpegts_packetizer_clear (base->packetizer); return ret; @@ -1359,6 +1370,7 @@ static void mpegts_base_loop (MpegTSBase * base) { GstFlowReturn ret = GST_FLOW_ERROR; + switch (base->mode) { case BASE_MODE_SCANNING: /* Find first sync point */ @@ -1382,8 +1394,8 @@ mpegts_base_loop (MpegTSBase * base) 100 * base->packetsize, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto error; - base->seek_offset += GST_BUFFER_SIZE (buf); - ret = mpegts_base_chain (base->sinkpad, buf); + base->seek_offset += gst_buffer_get_size (buf); + ret = mpegts_base_chain (base->sinkpad, GST_OBJECT_CAST (base), buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto error; } @@ -1398,6 +1410,7 @@ mpegts_base_loop (MpegTSBase * base) error: { const gchar *reason = gst_flow_get_name (ret); + GST_DEBUG_OBJECT (base, "Pausing task, reason %s", reason); if (ret == GST_FLOW_UNEXPECTED) GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, gst_event_new_eos ()); @@ -1477,7 +1490,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, if (flush) { /* send a FLUSH_STOP for the sinkpad, since we need data for seeking */ GST_DEBUG_OBJECT (base, "sending flush stop"); - gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop ()); + gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop (TRUE)); } if (flags & (GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_SKIP)) { @@ -1505,7 +1518,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, GST_DEBUG_OBJECT (base, "sending flush stop"); //gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop ()); GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, - gst_event_new_flush_stop ()); + gst_event_new_flush_stop (TRUE)); } //else done: @@ -1517,36 +1530,60 @@ push_mode: static gboolean -mpegts_base_sink_activate (GstPad * pad) +mpegts_base_sink_activate (GstPad * sinkpad, GstObject * parent) { - if (gst_pad_check_pull_range (pad)) { - GST_DEBUG_OBJECT (pad, "activating pull"); - return gst_pad_activate_pull (pad, TRUE); - } else { - GST_DEBUG_OBJECT (pad, "activating push"); - return gst_pad_activate_push (pad, TRUE); + GstQuery *query; + gboolean pull_mode; + + query = gst_query_new_scheduling (); + + if (!gst_pad_peer_query (sinkpad, query)) { + gst_query_unref (query); + goto activate_push; } -} -static gboolean -mpegts_base_sink_activate_pull (GstPad * pad, gboolean active) -{ - MpegTSBase *base = GST_MPEGTS_BASE (GST_OBJECT_PARENT (pad)); - if (active) { - base->mode = BASE_MODE_SCANNING; - return gst_pad_start_task (pad, (GstTaskFunction) mpegts_base_loop, base); - } else - return gst_pad_stop_task (pad); + pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); + gst_query_unref (query); + + if (!pull_mode) + goto activate_push; + + GST_DEBUG_OBJECT (sinkpad, "activating pull"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE); + +activate_push: + { + GST_DEBUG_OBJECT (sinkpad, "activating push"); + return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE); + } } static gboolean -mpegts_base_sink_activate_push (GstPad * pad, gboolean active) +mpegts_base_sink_activate_mode (GstPad * pad, GstObject * parent, + GstPadMode mode, gboolean active) { - MpegTSBase *base = GST_MPEGTS_BASE (GST_OBJECT_PARENT (pad)); - base->mode = BASE_MODE_PUSHING; - return TRUE; -} + gboolean res; + MpegTSBase *base = GST_MPEGTS_BASE (parent); + switch (mode) { + case GST_PAD_MODE_PUSH: + base->mode = BASE_MODE_PUSHING; + res = TRUE; + break; + case GST_PAD_MODE_PULL: + if (active) { + base->mode = BASE_MODE_SCANNING; + res = + gst_pad_start_task (pad, (GstTaskFunction) mpegts_base_loop, base); + } else + res = gst_pad_stop_task (pad); + break; + default: + res = FALSE; + break; + } + return res; +} static GstStateChangeReturn mpegts_base_change_state (GstElement * element, GstStateChange transition) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 25d75cfa8..afd47aa8e 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -287,6 +287,8 @@ mpegts_packetizer_parse_packet (MpegTSPacketizer2 * packetizer, packet->data = data; + gst_buffer_unmap (packet->buffer, packet->bufdata, packet->bufsize); + if (packet->adaptation_field_control & 0x02) if (!mpegts_packetizer_parse_adaptation_field_control (packetizer, packet)) return FALSE; @@ -304,15 +306,17 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer2 * packetizer, MpegTSPacketizerStream * stream, MpegTSPacketizerSection * section) { guint8 tmp; - guint8 *data, *crc_data; + guint8 *bufdata, *data, *crc_data; + gsize size; MpegTSPacketizerStreamSubtable *subtable; GSList *subtable_list = NULL; section->complete = TRUE; + /* get the section buffer, pass the ownership to the caller */ section->buffer = gst_adapter_take_buffer (stream->section_adapter, 3 + stream->section_length); - data = GST_BUFFER_DATA (section->buffer); + bufdata = data = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); GST_BUFFER_OFFSET (section->buffer) = stream->offset; section->table_id = *data++; @@ -348,8 +352,7 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer2 * packetizer, goto not_applicable; /* CRC is at the end of the section */ - crc_data = - GST_BUFFER_DATA (section->buffer) + GST_BUFFER_SIZE (section->buffer) - 4; + crc_data = bufdata + size - 4; section->crc = GST_READ_UINT32_BE (crc_data); if (section->version_number == subtable->version_number && @@ -360,6 +363,8 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer2 * packetizer, subtable->crc = section->crc; stream->section_table_id = section->table_id; + gst_buffer_unmap (section->buffer, bufdata, size); + return TRUE; not_applicable: @@ -368,6 +373,7 @@ not_applicable: section->pid, section->table_id, section->subtable_extension, section->current_next_indicator, section->version_number, section->crc); section->complete = FALSE; + gst_buffer_unmap (section->buffer, bufdata, size); gst_buffer_unref (section->buffer); return TRUE; } @@ -421,7 +427,8 @@ mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer, MpegTSPacketizerSection * section) { GstStructure *pat_info = NULL; - guint8 *data, *end; + guint8 *bufdata, *data, *end; + gsize size; guint transport_stream_id; guint8 tmp; guint program_number; @@ -431,7 +438,7 @@ mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer, GstStructure *entry = NULL; gchar *struct_name; - data = GST_BUFFER_DATA (section->buffer); + bufdata = data = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -447,11 +454,13 @@ mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer, /* skip section_number and last_section_number */ data += 2; - pat_info = gst_structure_id_new (QUARK_PAT, + pat_info = gst_structure_new_id (QUARK_PAT, QUARK_TRANSPORT_STREAM_ID, G_TYPE_UINT, transport_stream_id, NULL); g_value_init (&entries, GST_TYPE_LIST); + /* stop at the CRC */ - end = GST_BUFFER_DATA (section->buffer) + GST_BUFFER_SIZE (section->buffer); + end = bufdata + size; + while (data < end - 4) { program_number = GST_READ_UINT16_BE (data); data += 2; @@ -460,7 +469,7 @@ mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer, data += 2; struct_name = g_strdup_printf ("program-%d", program_number); - entry = gst_structure_new (struct_name, NULL); + entry = gst_structure_new_empty (struct_name); g_free (struct_name); gst_structure_id_set (entry, QUARK_PROGRAM_NUMBER, G_TYPE_UINT, program_number, QUARK_PID, G_TYPE_UINT, pmt_pid, NULL); @@ -474,6 +483,8 @@ mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer, gst_structure_id_set_value (pat_info, QUARK_PROGRAMS, &entries); g_value_unset (&entries); + gst_buffer_unmap (section->buffer, bufdata, size); + if (data != end - 4) { /* FIXME: check the CRC before parsing the packet */ GST_ERROR ("at the end of PAT data != end - 4"); @@ -490,7 +501,8 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, MpegTSPacketizerSection * section) { GstStructure *pmt = NULL; - guint8 *data, *end; + guint8 *bufdata, *data, *end; + gsize size; guint16 program_number; guint8 tmp; guint pcr_pid; @@ -504,15 +516,16 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, GstStructure *stream_info = NULL; gchar *struct_name; + data = bufdata = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + /* fixed header + CRC == 16 */ - if (GST_BUFFER_SIZE (section->buffer) < 16) { + if (size < 16) { GST_WARNING ("PID %d invalid PMT size %d", section->pid, section->section_length); goto error; } - data = GST_BUFFER_DATA (section->buffer); - end = data + GST_BUFFER_SIZE (section->buffer); + end = data + size; section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -534,7 +547,7 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, program_info_length = GST_READ_UINT16_BE (data) & 0x0FFF; data += 2; - pmt = gst_structure_id_new (QUARK_PMT, + pmt = gst_structure_new_id (QUARK_PMT, QUARK_PROGRAM_NUMBER, G_TYPE_UINT, program_number, QUARK_PCR_PID, G_TYPE_UINT, pcr_pid, QUARK_VERSION_NUMBER, G_TYPE_UINT, section->version_number, NULL); @@ -580,7 +593,7 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, } struct_name = g_strdup_printf ("pid-%d", pid); - stream_info = gst_structure_new (struct_name, NULL); + stream_info = gst_structure_new_empty (struct_name); g_free (struct_name); gst_structure_id_set (stream_info, QUARK_PID, G_TYPE_UINT, pid, QUARK_STREAM_TYPE, G_TYPE_UINT, @@ -682,6 +695,8 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, gst_structure_id_set_value (pmt, QUARK_STREAMS, &programs); g_value_unset (&programs); + gst_buffer_unmap (section->buffer, bufdata, size); + g_assert (data == end - 4); return pmt; @@ -689,6 +704,7 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, error: if (pmt) gst_structure_free (pmt); + gst_buffer_unmap (section->buffer, bufdata, size); return NULL; } @@ -698,7 +714,8 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer2 * packetizer, MpegTSPacketizerSection * section) { GstStructure *nit = NULL, *transport = NULL, *delivery_structure = NULL; - guint8 *data, *end, *entry_begin; + guint8 *bufdata, *data, *end, *entry_begin; + gsize size; guint16 network_id, transport_stream_id, original_network_id; guint tmp; guint16 descriptors_loop_length, transport_stream_loop_length; @@ -707,15 +724,17 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer2 * packetizer, GValueArray *descriptors = NULL; GST_DEBUG ("NIT"); + + data = bufdata = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + /* fixed header + CRC == 16 */ - if (GST_BUFFER_SIZE (section->buffer) < 23) { + if (size < 23) { GST_WARNING ("PID %d invalid NIT size %d", section->pid, section->section_length); goto error; } - data = GST_BUFFER_DATA (section->buffer); - end = data + GST_BUFFER_SIZE (section->buffer); + end = data + size; section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -740,7 +759,7 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer2 * packetizer, descriptors_loop_length = GST_READ_UINT16_BE (data) & 0x0FFF; data += 2; - nit = gst_structure_id_new (QUARK_NIT, + nit = gst_structure_new_id (QUARK_NIT, QUARK_NETWORK_ID, G_TYPE_UINT, network_id, QUARK_VERSION_NUMBER, G_TYPE_UINT, section->version_number, QUARK_CURRENT_NEXT_INDICATOR, G_TYPE_UINT, @@ -818,7 +837,7 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer2 * packetizer, data += 2; transport_name = g_strdup_printf ("transport-%d", transport_stream_id); - transport = gst_structure_new (transport_name, NULL); + transport = gst_structure_new_empty (transport_name); g_free (transport_name); gst_structure_id_set (transport, QUARK_TRANSPORT_STREAM_ID, G_TYPE_UINT, transport_stream_id, @@ -1303,15 +1322,16 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer2 * packetizer, } if (data != end - 4) { - GST_WARNING ("PID %d invalid NIT parsed %d length %d", - section->pid, (gint) (data - GST_BUFFER_DATA (section->buffer)), - GST_BUFFER_SIZE (section->buffer)); + GST_WARNING ("PID %d invalid NIT parsed %d length %" G_GSIZE_FORMAT, + section->pid, (gint) (data - bufdata), size); goto error; } gst_structure_id_set_value (nit, QUARK_TRANSPORTS, &transports); g_value_unset (&transports); + gst_buffer_unmap (section->buffer, bufdata, size); + GST_DEBUG ("NIT %" GST_PTR_FORMAT, nit); return nit; @@ -1320,6 +1340,8 @@ error: if (nit) gst_structure_free (nit); + gst_buffer_unmap (section->buffer, bufdata, size); + if (GST_VALUE_HOLDS_LIST (&transports)) g_value_unset (&transports); @@ -1331,7 +1353,8 @@ mpegts_packetizer_parse_sdt (MpegTSPacketizer2 * packetizer, MpegTSPacketizerSection * section) { GstStructure *sdt = NULL, *service = NULL; - guint8 *data, *end, *entry_begin; + guint8 *data, *bufdata, *end, *entry_begin; + gsize size; guint16 transport_stream_id, original_network_id, service_id; guint tmp; guint sdt_info_length; @@ -1343,15 +1366,17 @@ mpegts_packetizer_parse_sdt (MpegTSPacketizer2 * packetizer, GValue service_value = { 0 }; GST_DEBUG ("SDT"); + + data = bufdata = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + /* fixed header + CRC == 16 */ - if (GST_BUFFER_SIZE (section->buffer) < 14) { + if (size < 14) { GST_WARNING ("PID %d invalid SDT size %d", section->pid, section->section_length); goto error; } - data = GST_BUFFER_DATA (section->buffer); - end = data + GST_BUFFER_SIZE (section->buffer); + end = data + size; section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -1379,7 +1404,7 @@ mpegts_packetizer_parse_sdt (MpegTSPacketizer2 * packetizer, /* skip reserved byte */ data += 1; - sdt = gst_structure_id_new (QUARK_SDT, + sdt = gst_structure_new_id (QUARK_SDT, QUARK_TRANSPORT_STREAM_ID, G_TYPE_UINT, transport_stream_id, QUARK_VERSION_NUMBER, G_TYPE_UINT, section->version_number, QUARK_CURRENT_NEXT_INDICATOR, G_TYPE_UINT, @@ -1418,7 +1443,7 @@ mpegts_packetizer_parse_sdt (MpegTSPacketizer2 * packetizer, /* TODO send tag event down relevant pad for channel name and provider */ service_name = g_strdup_printf ("service-%d", service_id); - service = gst_structure_new (service_name, NULL); + service = gst_structure_new_empty (service_name); g_free (service_name); if (descriptors_loop_length) { @@ -1508,21 +1533,24 @@ mpegts_packetizer_parse_sdt (MpegTSPacketizer2 * packetizer, } if (data != end - 4) { - GST_WARNING ("PID %d invalid SDT parsed %d length %d", - section->pid, (gint) (data - GST_BUFFER_DATA (section->buffer)), - GST_BUFFER_SIZE (section->buffer)); + GST_WARNING ("PID %d invalid SDT parsed %d length %" G_GSIZE_FORMAT, + section->pid, (gint) (data - bufdata), size); goto error; } gst_structure_id_set_value (sdt, QUARK_SERVICES, &services); g_value_unset (&services); + gst_buffer_unmap (section->buffer, bufdata, size); + return sdt; error: if (sdt) gst_structure_free (sdt); + gst_buffer_unmap (section->buffer, bufdata, size); + if (GST_VALUE_HOLDS_LIST (&services)) g_value_unset (&services); @@ -1541,7 +1569,8 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer2 * packetizer, guint16 mjd; guint year, month, day, hour, minute, second; guint duration; - guint8 *data, *end, *duration_ptr, *utc_ptr; + guint8 *data, *bufdata, *end, *duration_ptr, *utc_ptr; + gsize size; guint16 descriptors_loop_length; GValue events = { 0 }; GValue event_value = { 0 }; @@ -1549,15 +1578,16 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer2 * packetizer, gchar *event_name; guint tmp; + data = bufdata = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + /* fixed header + CRC == 16 */ - if (GST_BUFFER_SIZE (section->buffer) < 18) { + if (size < 18) { GST_WARNING ("PID %d invalid EIT size %d", section->pid, section->section_length); goto error; } - data = GST_BUFFER_DATA (section->buffer); - end = data + GST_BUFFER_SIZE (section->buffer); + end = data + size; section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -1588,7 +1618,7 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer2 * packetizer, last_table_id = *data; data += 1; - eit = gst_structure_id_new (QUARK_EIT, + eit = gst_structure_new_id (QUARK_EIT, QUARK_VERSION_NUMBER, G_TYPE_UINT, section->version_number, QUARK_CURRENT_NEXT_INDICATOR, G_TYPE_UINT, section->current_next_indicator, QUARK_SERVICE_ID, G_TYPE_UINT, @@ -1967,15 +1997,16 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer2 * packetizer, } if (data != end - 4) { - GST_WARNING ("PID %d invalid EIT parsed %d length %d", - section->pid, (gint) (data - GST_BUFFER_DATA (section->buffer)), - GST_BUFFER_SIZE (section->buffer)); + GST_WARNING ("PID %d invalid EIT parsed %d length %" G_GSIZE_FORMAT, + section->pid, (gint) (data - bufdata), size); goto error; } gst_structure_id_set_value (eit, QUARK_EVENTS, &events); g_value_unset (&events); + gst_buffer_unmap (section->buffer, bufdata, size); + GST_DEBUG ("EIT %" GST_PTR_FORMAT, eit); return eit; @@ -1984,6 +2015,8 @@ error: if (eit) gst_structure_free (eit); + gst_buffer_unmap (section->buffer, bufdata, size); + if (GST_VALUE_HOLDS_LIST (&events)) g_value_unset (&events); @@ -1997,18 +2030,21 @@ mpegts_packetizer_parse_tdt (MpegTSPacketizer2 * packetizer, GstStructure *tdt = NULL; guint16 mjd; guint year, month, day, hour, minute, second; - guint8 *data, *end, *utc_ptr; + guint8 *data, *bufdata, *end, *utc_ptr; + gsize size; GST_DEBUG ("TDT"); + + data = bufdata = gst_buffer_map (section->buffer, &size, 0, GST_MAP_READ); + /* length always 8 */ - if (G_UNLIKELY (GST_BUFFER_SIZE (section->buffer) != 8)) { + if (G_UNLIKELY (size != 8)) { GST_WARNING ("PID %d invalid TDT size %d", section->pid, section->section_length); goto error; } - data = GST_BUFFER_DATA (section->buffer); - end = data + GST_BUFFER_SIZE (section->buffer); + end = data + size; section->table_id = *data++; section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF; @@ -2049,12 +2085,16 @@ mpegts_packetizer_parse_tdt (MpegTSPacketizer2 * packetizer, "hour", G_TYPE_UINT, hour, "minute", G_TYPE_UINT, minute, "second", G_TYPE_UINT, second, NULL); + gst_buffer_unmap (section->buffer, bufdata, size); + return tdt; error: if (tdt) gst_structure_free (tdt); + gst_buffer_unmap (section->buffer, bufdata, size); + return NULL; } @@ -2132,8 +2172,8 @@ mpegts_packetizer_push (MpegTSPacketizer2 * packetizer, GstBuffer * buffer) packetizer->offset = GST_BUFFER_OFFSET (buffer); } - GST_DEBUG ("Pushing %u byte from offset %" G_GUINT64_FORMAT, - GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer)); + GST_DEBUG ("Pushing %" G_GSIZE_FORMAT " byte from offset %" G_GUINT64_FORMAT, + gst_buffer_get_size (buffer), GST_BUFFER_OFFSET (buffer)); gst_adapter_push (packetizer->adapter, buffer); } @@ -2227,77 +2267,87 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer, packet->buffer = NULL; + /* Resync if needed */ if (G_UNLIKELY (!packetizer->know_packet_size)) { if (!mpegts_try_discover_packet_size (packetizer)) return PACKET_NEED_MORE; } while ((avail = packetizer->adapter->size) >= packetizer->packet_size) { + guint i; + GstBuffer *tmpbuf; + guint8 *bufdata; + packet->buffer = gst_adapter_take_buffer (packetizer->adapter, packetizer->packet_size); + + bufdata = packet->bufdata = packet->data_start = + gst_buffer_map (packet->buffer, &packet->bufsize, 0, GST_MAP_READ); + /* M2TS packets don't start with the sync byte, all other variants do */ - if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) { - packet->data_start = GST_BUFFER_DATA (packet->buffer) + 4; - } else { - packet->data_start = GST_BUFFER_DATA (packet->buffer); - } + if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) + packet->data_start += 4; + /* ALL mpeg-ts variants contain 188 bytes of data. Those with bigger packet * sizes contain either extra data (timesync, FEC, ..) either before or after * the data */ packet->data_end = packet->data_start + 188; GST_BUFFER_OFFSET (packet->buffer) = packet->offset = packetizer->offset; GST_DEBUG ("offset %" G_GUINT64_FORMAT, packet->offset); + packetizer->offset += packetizer->packet_size; - GST_MEMDUMP ("buffer", GST_BUFFER_DATA (packet->buffer), 16); + GST_MEMDUMP ("buffer", bufdata, 16); GST_MEMDUMP ("data_start", packet->data_start, 16); /* Check sync byte */ - if (G_UNLIKELY (packet->data_start[0] != 0x47)) { - guint i; - GstBuffer *tmpbuf; - - GST_LOG ("Lost sync %d", packetizer->packet_size); - /* Find the 0x47 in the buffer */ - for (i = 0; i < packetizer->packet_size; i++) - if (GST_BUFFER_DATA (packet->buffer)[i] == 0x47) - break; - if (G_UNLIKELY (i == packetizer->packet_size)) { - GST_ERROR ("REALLY lost the sync"); - gst_buffer_unref (packet->buffer); - goto done; - } + if (G_LIKELY (packet->data_start[0] == 0x47)) + goto got_valid_packet; - if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) { - if (i >= 4) - i -= 4; - else - i += 188; - } + GST_LOG ("Lost sync %d", packetizer->packet_size); + + /* Find the 0x47 in the buffer */ + for (i = 0; i < packetizer->packet_size; i++) + if (bufdata[i] == 0x47) + break; - /* Pop out the remaining data... */ - GST_BUFFER_DATA (packet->buffer) += i; - GST_BUFFER_SIZE (packet->buffer) -= i; - GST_BUFFER_OFFSET (packet->buffer) += i; - tmpbuf = - gst_adapter_take_buffer (packetizer->adapter, - packetizer->adapter->size); - /* ... and push everything back in */ - gst_adapter_push (packetizer->adapter, packet->buffer); - gst_adapter_push (packetizer->adapter, tmpbuf); - continue; + if (G_UNLIKELY (i == packetizer->packet_size)) { + GST_ERROR ("REALLY lost the sync"); + gst_buffer_unmap (packet->buffer, bufdata, packet->bufsize); + gst_buffer_unref (packet->buffer); + goto done; } - return mpegts_packetizer_parse_packet (packetizer, packet); + if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) { + if (i >= 4) + i -= 4; + else + i += 188; + } + + /* Pop out the remaining data... */ + gst_buffer_resize (packet->buffer, i, packet->bufsize - i); + GST_BUFFER_OFFSET (packet->buffer) += i; + tmpbuf = + gst_adapter_take_buffer (packetizer->adapter, + packetizer->adapter->size); + /* ... and push everything back in */ + gst_adapter_push (packetizer->adapter, packet->buffer); + gst_adapter_push (packetizer->adapter, tmpbuf); } done: return PACKET_NEED_MORE; + +got_valid_packet: + return mpegts_packetizer_parse_packet (packetizer, packet); } void mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer, MpegTSPacketizerPacket * packet) { + GST_DEBUG ("packet:%p, buffer:%p", packet, packet->buffer); + memset (packet, 0, sizeof (MpegTSPacketizerPacket)); } @@ -2332,8 +2382,9 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, if (packet->pid == 0x14) { table_id = data[0]; section->section_length = GST_READ_UINT24_BE (data) & 0x000FFF; - section->buffer = gst_buffer_create_sub (packet->buffer, - data - GST_BUFFER_DATA (packet->buffer), section->section_length + 3); + section->buffer = + gst_buffer_copy_region (packet->buffer, GST_BUFFER_COPY_ALL, + data - packet->bufdata, section->section_length + 3); section->table_id = table_id; section->complete = TRUE; res = TRUE; @@ -2344,8 +2395,8 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, /* create a sub buffer from the start of the section (table_id and * section_length included) to the end */ - sub_buf = gst_buffer_create_sub (packet->buffer, - data - GST_BUFFER_DATA (packet->buffer), packet->data_end - data); + sub_buf = gst_buffer_copy_region (packet->buffer, GST_BUFFER_COPY_ALL, + data - packet->bufdata, packet->data_end - data); stream = packetizer->streams[packet->pid]; @@ -2370,10 +2421,11 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, if (stream->continuity_counter != CONTINUITY_UNSET) { GST_DEBUG ("PID %d table_id %d sub_table_extension %d payload_unit_start_indicator set but section " - "not complete (last_continuity: %d continuity: %d sec len %d buffer %d avail %d", - packet->pid, table_id, subtable_extension, stream->continuity_counter, - packet->continuity_counter, section_length, GST_BUFFER_SIZE (sub_buf), - stream->section_adapter->size); + "not complete (last_continuity: %d continuity: %d sec len %d buffer %" + G_GSIZE_FORMAT " avail %" G_GSIZE_FORMAT, packet->pid, table_id, + subtable_extension, stream->continuity_counter, + packet->continuity_counter, section_length, + gst_buffer_get_size (sub_buf), stream->section_adapter->size); mpegts_packetizer_clear_section (packetizer, stream); } else { GST_DEBUG diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 832862577..d70a10104 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -94,9 +94,13 @@ typedef struct guint8 continuity_counter; guint8 *payload; - guint8 *data_start; + /* temporary copies of gst_buffer_map */ + guint8 *bufdata; + gsize bufsize; + + guint8 *data_start; /* Location of 0x47 marker byte */ guint8 *data_end; - guint8 *data; + guint8 *data; /* Location of post-TS-header data */ guint8 afc_flags; guint64 pcr; @@ -144,7 +148,7 @@ gboolean mpegts_packetizer_has_packets (MpegTSPacketizer2 *packetizer); MpegTSPacketizerPacketReturn mpegts_packetizer_next_packet (MpegTSPacketizer2 *packetizer, MpegTSPacketizerPacket *packet); void mpegts_packetizer_clear_packet (MpegTSPacketizer2 *packetizer, - MpegTSPacketizerPacket *packet); + MpegTSPacketizerPacket *packet); void mpegts_packetizer_remove_stream(MpegTSPacketizer2 *packetizer, gint16 pid); diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c index 26dde896a..1c3f625b1 100644 --- a/gst/mpegtsdemux/mpegtsparse.c +++ b/gst/mpegtsdemux/mpegtsparse.c @@ -70,13 +70,13 @@ struct _MpegTSParsePad }; static GstStaticPadTemplate src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); static GstStaticPadTemplate program_template = -GST_STATIC_PAD_TEMPLATE ("program_%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("program_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); @@ -113,28 +113,14 @@ static void mpegts_parse_reset_selected_programs (MpegTSParse2 * parse, static void mpegts_parse_pad_removed (GstElement * element, GstPad * pad); static GstPad *mpegts_parse_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name); + GstPadTemplate * templ, const gchar * name, const GstCaps * caps); static void mpegts_parse_release_pad (GstElement * element, GstPad * pad); -static gboolean mpegts_parse_src_pad_query (GstPad * pad, GstQuery * query); +static gboolean mpegts_parse_src_pad_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean push_event (MpegTSBase * base, GstEvent * event); -GST_BOILERPLATE (MpegTSParse2, mpegts_parse, MpegTSBase, GST_TYPE_MPEGTS_BASE); - -static void -mpegts_parse_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &program_template); - - gst_element_class_set_details_simple (element_class, - "MPEG transport stream parser", "Codec/Parser", - "Parses MPEG2 transport streams", - "Alessandro Decina <alessandro@nnva.org>, " - "Zaheer Abbas Merali <zaheerabbas at merali dot org>"); -} +#define mpegts_parse_parent_class parent_class +G_DEFINE_TYPE (MpegTSParse2, mpegts_parse, GST_TYPE_MPEGTS_BASE); static void mpegts_parse_class_init (MpegTSParse2Class * klass) @@ -148,6 +134,17 @@ mpegts_parse_class_init (MpegTSParse2Class * klass) element_class->request_new_pad = mpegts_parse_request_new_pad; element_class->release_pad = mpegts_parse_release_pad; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&program_template)); + + gst_element_class_set_details_simple (element_class, + "MPEG transport stream parser", "Codec/Parser", + "Parses MPEG2 transport streams", + "Alessandro Decina <alessandro@nnva.org>, " + "Zaheer Abbas Merali <zaheerabbas at merali dot org>"); + gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = mpegts_parse_set_property; gobject_class->get_property = mpegts_parse_get_property; @@ -167,7 +164,7 @@ mpegts_parse_class_init (MpegTSParse2Class * klass) } static void -mpegts_parse_init (MpegTSParse2 * parse, MpegTSParse2Class * klass) +mpegts_parse_init (MpegTSParse2 * parse) { parse->need_sync_program_pads = FALSE; parse->program_numbers = g_strdup (""); @@ -225,7 +222,7 @@ mpegts_parse_activate_program (MpegTSParse2 * parse, gchar *pad_name; pad_name = - g_strdup_printf ("program_%d", + g_strdup_printf ("program_%u", ((MpegTSBaseProgram *) program)->program_number); tspad = mpegts_parse_create_tspad (parse, pad_name); @@ -428,7 +425,7 @@ mpegts_parse_pad_removed (GstElement * element, GstPad * pad) static GstPad * mpegts_parse_request_new_pad (GstElement * element, GstPadTemplate * template, - const gchar * unused) + const gchar * unused, const GstCaps * caps) { MpegTSParse2 *parse; gchar *name; @@ -440,7 +437,7 @@ mpegts_parse_request_new_pad (GstElement * element, GstPadTemplate * template, parse = GST_MPEGTS_PARSE (element); GST_OBJECT_LOCK (element); - name = g_strdup_printf ("src%d", parse->req_pads++); + name = g_strdup_printf ("src_%u", parse->req_pads++); GST_OBJECT_UNLOCK (element); pad = mpegts_parse_create_tspad (parse, name)->pad; @@ -510,8 +507,7 @@ mpegts_parse_tspad_push (MpegTSParse2 * parse, MpegTSParsePad * tspad, MpegTSBaseProgram *bp = (MpegTSBaseProgram *) tspad->program; pad_pids = bp->streams; if (bp->tags) { - gst_element_found_tags_for_pad (GST_ELEMENT_CAST (parse), tspad->pad, - bp->tags); + gst_pad_push_event (tspad->pad, gst_event_new_tag (bp->tags)); bp->tags = NULL; } } else { @@ -563,9 +559,15 @@ mpegts_parse_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, mpegts_parse_sync_program_pads (parse); pid = packet->pid; + +#if 0 buffer = gst_buffer_make_metadata_writable (packet->buffer); + /* we have the same caps on all the src pads */ gst_buffer_set_caps (buffer, base->packetizer->caps); +#else + buffer = packet->buffer; +#endif GST_OBJECT_LOCK (parse); /* clear tspad->pushed on pads */ @@ -673,9 +675,9 @@ mpegts_parse_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program) } static gboolean -mpegts_parse_src_pad_query (GstPad * pad, GstQuery * query) +mpegts_parse_src_pad_query (GstPad * pad, GstObject * parent, GstQuery * query) { - MpegTSParse2 *parse = GST_MPEGTS_PARSE (gst_pad_get_parent (pad)); + MpegTSParse2 *parse = GST_MPEGTS_PARSE (parent); gboolean res; switch (GST_QUERY_TYPE (query)) { @@ -698,9 +700,8 @@ mpegts_parse_src_pad_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); } - gst_object_unref (parse); return res; } diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 118ffb598..174e81348 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -112,8 +112,6 @@ struct _TSDemuxStream guint8 nbpending; /* Current data to be pushed out */ - GstBufferList *current; - GstBufferListIterator *currentit; GList *currentlist; /* Current PTS for this stream */ @@ -130,7 +128,7 @@ struct _TSDemuxStream "video/x-dirac;" \ "video/x-wmv," \ "wmvversion = (int) 3, " \ - "format = (fourcc) WVC1" \ + "format = (string) WVC1" \ ) #define AUDIO_CAPS \ @@ -185,8 +183,8 @@ enum }; /* Pad functions */ -static const GstQueryType *gst_ts_demux_srcpad_query_types (GstPad * pad); -static gboolean gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query); +static gboolean gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, + GstQuery * query); /* mpegtsbase methods */ @@ -221,13 +219,9 @@ static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream); static gboolean push_event (MpegTSBase * base, GstEvent * event); -static void _extra_init (GType type); - -GST_BOILERPLATE_FULL (GstTSDemux, gst_ts_demux, MpegTSBase, - GST_TYPE_MPEGTS_BASE, _extra_init); static void -_extra_init (GType type) +_extra_init (void) { QUARK_TSDEMUX = g_quark_from_string ("tsdemux"); QUARK_PID = g_quark_from_string ("pid"); @@ -238,32 +232,15 @@ _extra_init (GType type) QUARK_OFFSET = g_quark_from_string ("offset"); } -static void -gst_ts_demux_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, - &video_template); - gst_element_class_add_static_pad_template (element_class, - &audio_template); - gst_element_class_add_static_pad_template (element_class, - &subpicture_template); - gst_element_class_add_static_pad_template (element_class, - &private_template); - - gst_element_class_set_details_simple (element_class, - "MPEG transport stream demuxer", - "Codec/Demuxer", - "Demuxes MPEG2 transport streams", - "Zaheer Abbas Merali <zaheerabbas at merali dot org>\n" - "Edward Hervey <edward.hervey@collabora.co.uk>"); -} +#define gst_ts_demux_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstTSDemux, gst_ts_demux, GST_TYPE_MPEGTS_BASE, + _extra_init ()); static void gst_ts_demux_class_init (GstTSDemuxClass * klass) { GObjectClass *gobject_class; + GstElementClass *element_class; MpegTSBaseClass *ts_class; gobject_class = G_OBJECT_CLASS (klass); @@ -281,6 +258,22 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) "Emit messages for every pcr/opcr/pts/dts", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + element_class = GST_ELEMENT_CLASS (klass); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&subpicture_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&private_template)); + + gst_element_class_set_details_simple (element_class, + "MPEG transport stream demuxer", + "Codec/Demuxer", + "Demuxes MPEG2 transport streams", + "Zaheer Abbas Merali <zaheerabbas at merali dot org>\n" + "Edward Hervey <edward.hervey@collabora.co.uk>"); ts_class = GST_MPEGTS_BASE_CLASS (klass); ts_class->reset = GST_DEBUG_FUNCPTR (gst_ts_demux_reset); @@ -295,7 +288,7 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) } static void -gst_ts_demux_init (GstTSDemux * demux, GstTSDemuxClass * klass) +gst_ts_demux_init (GstTSDemux * demux) { demux->need_newsegment = TRUE; demux->program_number = -1; @@ -379,27 +372,15 @@ gst_ts_demux_get_property (GObject * object, guint prop_id, } } -static const GstQueryType * -gst_ts_demux_srcpad_query_types (GstPad * pad) -{ - static const GstQueryType query_types[] = { - GST_QUERY_DURATION, - GST_QUERY_SEEKING, - 0 - }; - - return query_types; -} - static gboolean -gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) +gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = TRUE; GstFormat format; GstTSDemux *demux; MpegTSBase *base; - demux = GST_TS_DEMUX (gst_pad_get_parent (pad)); + demux = GST_TS_DEMUX (parent); base = GST_MPEGTS_BASE (demux); switch (GST_QUERY_TYPE (query)) { @@ -436,10 +417,9 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) } break; default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); } - gst_object_unref (demux); return res; } @@ -619,8 +599,7 @@ gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment, guint16 pid) max_loop_cnt = (segment->flags & GST_SEEK_FLAG_ACCURATE) ? 25 : 10; seektime = - MAX (0, - segment->last_stop - SEEK_TIMESTAMP_OFFSET) + demux->first_pcr.gsttime; + MAX (0, segment->stop - SEEK_TIMESTAMP_OFFSET) + demux->first_pcr.gsttime; seekpcroffset.gsttime = seektime; GST_DEBUG ("seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (seektime)); @@ -793,7 +772,9 @@ gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment, guint16 pid) seektime -= demux->first_pcr.gsttime; +#if 0 segment->last_stop = seektime; +#endif segment->time = seektime; /* we stop at the end */ @@ -842,24 +823,21 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid) /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &demux->segment, sizeof (GstSegment)); + /* configure the segment with the seek variables */ GST_DEBUG_OBJECT (demux, "configuring seek"); GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %" - GST_TIME_FORMAT " time: %" GST_TIME_FORMAT " accum: %" GST_TIME_FORMAT - " last_stop: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT, + GST_TIME_FORMAT " time: %" GST_TIME_FORMAT + " duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop), - GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.accum), - GST_TIME_ARGS (seeksegment.last_stop), - GST_TIME_ARGS (seeksegment.duration)); - gst_segment_set_seek (&seeksegment, rate, format, flags, start_type, start, + GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.duration)); + gst_segment_do_seek (&seeksegment, rate, format, flags, start_type, start, stop_type, stop, &update); GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %" - GST_TIME_FORMAT " time: %" GST_TIME_FORMAT " accum: %" GST_TIME_FORMAT - " last_stop: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT, + GST_TIME_FORMAT " time: %" GST_TIME_FORMAT + " duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop), - GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.accum), - GST_TIME_ARGS (seeksegment.last_stop), - GST_TIME_ARGS (seeksegment.duration)); + GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.duration)); res = gst_ts_demux_perform_seek (base, &seeksegment, pid); if (G_UNLIKELY (res != GST_FLOW_OK)) { @@ -873,7 +851,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid) if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_segment_start (GST_OBJECT_CAST (demux), - demux->segment.format, demux->segment.last_stop)); + demux->segment.format, demux->segment.stop)); } done: @@ -881,10 +859,10 @@ done: } static gboolean -gst_ts_demux_srcpad_event (GstPad * pad, GstEvent * event) +gst_ts_demux_srcpad_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res = TRUE; - GstTSDemux *demux = GST_TS_DEMUX (gst_pad_get_parent (pad)); + GstTSDemux *demux = GST_TS_DEMUX (parent); GST_DEBUG_OBJECT (pad, "Got event %s", gst_event_type_get_name (GST_EVENT_TYPE (event))); @@ -897,10 +875,9 @@ gst_ts_demux_srcpad_event (GstPad * pad, GstEvent * event) gst_event_unref (event); break; default: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (pad, parent, event); } - gst_object_unref (demux); return res; } @@ -921,6 +898,8 @@ push_event (MpegTSBase * base, GstEvent * event) } } + gst_event_unref (event); + return TRUE; } @@ -1000,7 +979,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, GST_LOG ("ac3 audio"); template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-ac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-ac3"); g_free (desc); break; } @@ -1011,7 +990,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, GST_LOG ("ac3 audio"); template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-eac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-eac3"); g_free (desc); break; } @@ -1022,7 +1001,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, GST_LOG ("teletext"); template = gst_static_pad_template_get (&private_template); name = g_strdup_printf ("private_%04x", bstream->pid); - caps = gst_caps_new_simple ("private/teletext", NULL); + caps = gst_caps_new_empty_simple ("private/teletext"); g_free (desc); break; } @@ -1033,7 +1012,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, GST_LOG ("subtitling"); template = gst_static_pad_template_get (&private_template); name = g_strdup_printf ("private_%04x", bstream->pid); - caps = gst_caps_new_simple ("subpicture/x-dvb", NULL); + caps = gst_caps_new_empty_simple ("subpicture/x-dvb"); g_free (desc); } /* hack for itv hd (sid 10510, video pid 3401 */ @@ -1097,7 +1076,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, /* dirac in hex */ template = gst_static_pad_template_get (&video_template); name = g_strdup_printf ("video_%04x", bstream->pid); - caps = gst_caps_new_simple ("video/x-dirac", NULL); + caps = gst_caps_new_empty_simple ("video/x-dirac"); } } g_free (desc); @@ -1117,8 +1096,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, name = g_strdup_printf ("video_%04x", bstream->pid); caps = gst_caps_new_simple ("video/x-wmv", "wmvversion", G_TYPE_INT, 3, - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('W', 'V', 'C', '1'), - NULL); + "format", G_TYPE_STRING, "WVC1", NULL); } } g_free (desc); @@ -1133,7 +1111,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, if (DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) { template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-eac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-eac3"); } g_free (desc); } @@ -1147,7 +1125,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, if (desc) { template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-eac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-eac3"); g_free (desc); break; } @@ -1164,57 +1142,61 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, g_free (desc); template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-ac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-ac3"); break; } case ST_BD_AUDIO_EAC3: template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-eac3", NULL); + caps = gst_caps_new_empty_simple ("audio/x-eac3"); break; case ST_PS_AUDIO_DTS: template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-dts", NULL); + caps = gst_caps_new_empty_simple ("audio/x-dts"); break; case ST_PS_AUDIO_LPCM: template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-lpcm", NULL); + caps = gst_caps_new_empty_simple ("audio/x-lpcm"); break; case ST_BD_AUDIO_LPCM: template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-private-ts-lpcm", NULL); + caps = gst_caps_new_empty_simple ("audio/x-private-ts-lpcm"); break; case ST_PS_DVD_SUBPICTURE: template = gst_static_pad_template_get (&subpicture_template); name = g_strdup_printf ("subpicture_%04x", bstream->pid); - caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); + caps = gst_caps_new_empty_simple ("video/x-dvd-subpicture"); break; case ST_BD_PGS_SUBPICTURE: template = gst_static_pad_template_get (&subpicture_template); name = g_strdup_printf ("subpicture_%04x", bstream->pid); - caps = gst_caps_new_simple ("subpicture/x-pgs", NULL); + caps = gst_caps_new_empty_simple ("subpicture/x-pgs"); break; default: GST_WARNING ("Non-media stream (stream_type:0x%x). Not creating pad", bstream->stream_type); break; } + if (template && name && caps) { GST_LOG ("stream:%p creating pad with name %s and caps %s", stream, name, gst_caps_to_string (caps)); pad = gst_pad_new_from_template (template, name); gst_pad_use_fixed_caps (pad); gst_pad_set_caps (pad, caps); - gst_pad_set_query_type_function (pad, gst_ts_demux_srcpad_query_types); gst_pad_set_query_function (pad, gst_ts_demux_srcpad_query); gst_pad_set_event_function (pad, gst_ts_demux_srcpad_event); - gst_caps_unref (caps); } - g_free (name); + if (name) + g_free (name); + if (template) + gst_object_unref (template); + if (caps) + gst_caps_unref (caps); return pad; } @@ -1293,8 +1275,6 @@ gst_ts_demux_stream_flush (TSDemuxStream * stream) gst_buffer_unref (stream->pendingbuffers[i]); memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS); stream->nbpending = 0; - - stream->current = NULL; } static void @@ -1379,6 +1359,7 @@ process_section (MpegTSBase * base) next: mpegts_packetizer_clear_packet (base->packetizer, &packet); } + return done; } @@ -1557,7 +1538,6 @@ find_timestamps (MpegTSBase * base, guint64 initoff, guint64 * offset) GstFlowReturn ret = GST_FLOW_OK; GstBuffer *buf; gboolean done = FALSE; - GstFormat format = GST_FORMAT_BYTES; gint64 total_bytes; guint64 scan_offset; guint i = 0; @@ -1604,8 +1584,8 @@ find_timestamps (MpegTSBase * base, guint64 initoff, guint64 * offset) demux->program = NULL; /* Find end position */ - if (G_UNLIKELY (!gst_pad_query_peer_duration (base->sinkpad, &format, - &total_bytes) || format != GST_FORMAT_BYTES)) { + if (G_UNLIKELY (!gst_pad_peer_query_duration (base->sinkpad, GST_FORMAT_BYTES, + &total_bytes))) { GST_WARNING_OBJECT (base, "Couldn't get upstream size in bytes"); ret = GST_FLOW_ERROR; mpegts_packetizer_clear (base->packetizer); @@ -1645,9 +1625,8 @@ find_timestamps (MpegTSBase * base, guint64 initoff, guint64 * offset) verify_timestamps (base, &initial, &final); - gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME, - demux->last_pcr.gsttime - demux->first_pcr.gsttime); - demux->duration = demux->last_pcr.gsttime - demux->first_pcr.gsttime; + demux->duration = demux->segment.duration = + demux->last_pcr.gsttime - demux->first_pcr.gsttime; GST_DEBUG ("Done, duration:%" GST_TIME_FORMAT, GST_TIME_ARGS (demux->duration)); @@ -1703,7 +1682,9 @@ process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, pcrpattern = 0x47000020 | ((program->pcr_pid & 0x1fff) << 8); for (i = 0; (i < 20) && (nbpcr < numpcr); i++) { - guint offset, size; + guint offset; + gsize size, bufsize; + gpointer data; ret = gst_pad_pull_range (base->sinkpad, @@ -1712,17 +1693,21 @@ process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, if (G_UNLIKELY (ret != GST_FLOW_OK)) goto beach; - gst_byte_reader_init_from_buffer (&br, buf); + data = gst_buffer_map (buf, &bufsize, 0, GST_MAP_READ); + size = bufsize; + + gst_byte_reader_init (&br, data, size); offset = 0; - size = GST_BUFFER_SIZE (buf); resync: offset = gst_byte_reader_masked_scan_uint32 (&br, 0xff000000, 0x47000000, 0, base->packetsize); - if (offset == -1) + if (offset == -1) { + gst_buffer_unmap (buf, data, bufsize); continue; + } while ((nbpcr < numpcr) && (size >= base->packetsize)) { @@ -1771,6 +1756,7 @@ process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, size -= base->packetsize; offset += base->packetsize; } + gst_buffer_unmap (buf, data, bufsize); } beach: @@ -1827,7 +1813,7 @@ gst_ts_demux_record_pcr (GstTSDemux * demux, TSDemuxStream * stream, if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; - st = gst_structure_id_empty_new (QUARK_TSDEMUX); + st = gst_structure_new_id_empty (QUARK_TSDEMUX); gst_structure_id_set (st, QUARK_PID, G_TYPE_UINT, bs->pid, QUARK_OFFSET, G_TYPE_UINT64, offset, QUARK_PCR, G_TYPE_UINT64, pcr, @@ -1849,7 +1835,7 @@ gst_ts_demux_record_opcr (GstTSDemux * demux, TSDemuxStream * stream, if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; - st = gst_structure_id_empty_new (QUARK_TSDEMUX); + st = gst_structure_new_id_empty (QUARK_TSDEMUX); gst_structure_id_set (st, QUARK_PID, G_TYPE_UINT, bs->pid, QUARK_OFFSET, G_TYPE_UINT64, offset, @@ -1871,7 +1857,7 @@ gst_ts_demux_record_pts (GstTSDemux * demux, TSDemuxStream * stream, if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; - st = gst_structure_id_empty_new (QUARK_TSDEMUX); + st = gst_structure_new_id_empty (QUARK_TSDEMUX); gst_structure_id_set (st, QUARK_PID, G_TYPE_UINT, bs->pid, QUARK_OFFSET, G_TYPE_UINT64, offset, QUARK_PTS, G_TYPE_UINT64, pts, @@ -1893,7 +1879,7 @@ gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream, if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; - st = gst_structure_id_empty_new (QUARK_TSDEMUX); + st = gst_structure_new_id_empty (QUARK_TSDEMUX); gst_structure_id_set (st, QUARK_PID, G_TYPE_UINT, bs->pid, QUARK_OFFSET, G_TYPE_UINT64, offset, QUARK_DTS, G_TYPE_UINT64, dts, @@ -1934,21 +1920,22 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) { MpegTSBase *base = (MpegTSBase *) demux; PESHeader header; + GstBuffer *buf = stream->pendingbuffers[0]; GstFlowReturn res = GST_FLOW_OK; gint offset = 0; guint8 *data; - guint32 length; + gsize length; guint64 bufferoffset; GstClockTime time; PESParsingResult parseres; - data = GST_BUFFER_DATA (stream->pendingbuffers[0]); - length = GST_BUFFER_SIZE (stream->pendingbuffers[0]); - bufferoffset = GST_BUFFER_OFFSET (stream->pendingbuffers[0]); + data = gst_buffer_map (buf, &length, 0, GST_MAP_READ); + bufferoffset = GST_BUFFER_OFFSET (buf); GST_MEMDUMP ("Header buffer", data, MIN (length, 32)); parseres = mpegts_parse_pes_header (data, length, &header, &offset); + if (G_UNLIKELY (parseres == PES_PARSING_NEED_MORE)) goto discont; if (G_UNLIKELY (parseres == PES_PARSING_BAD)) { @@ -2012,30 +1999,25 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) if (!GST_CLOCK_TIME_IS_VALID (base->in_gap)) base->in_gap = 0; - GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = time + base->in_gap; + GST_BUFFER_TIMESTAMP (buf) = time + base->in_gap; } if (header.DTS != -1) gst_ts_demux_record_dts (demux, stream, header.DTS, bufferoffset); + gst_buffer_unmap (buf, data, length); + /* Remove PES headers */ GST_DEBUG ("Moving data forward by %d bytes", header.header_size); - GST_BUFFER_DATA (stream->pendingbuffers[0]) += header.header_size; - GST_BUFFER_SIZE (stream->pendingbuffers[0]) -= header.header_size; + gst_buffer_resize (buf, header.header_size, length - header.header_size); /* FIXME : responsible for switching to PENDING_PACKET_BUFFER and * creating the bufferlist */ if (1) { /* Append to the buffer list */ - if (G_UNLIKELY (stream->current == NULL)) { + if (G_UNLIKELY (stream->currentlist == NULL)) { guint8 i; - /* Create a new bufferlist */ - stream->current = gst_buffer_list_new (); - stream->currentit = gst_buffer_list_iterate (stream->current); - stream->currentlist = NULL; - gst_buffer_list_iterator_add_group (stream->currentit); - /* Push pending buffers into the list */ for (i = stream->nbpending; i; i--) stream->currentlist = @@ -2062,14 +2044,21 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream, MpegTSPacketizerPacket * packet) { GstBuffer *buf; + guint8 *data; + gsize size; GST_DEBUG ("state:%d", stream->state); buf = packet->buffer; - /* HACK : Instead of creating a new buffer, we just modify the data/size - * of the buffer to point to the payload */ - GST_BUFFER_DATA (buf) = packet->payload; - GST_BUFFER_SIZE (buf) = packet->data_end - packet->payload; + data = gst_buffer_map (buf, &size, 0, GST_MAP_READ); + + GST_DEBUG ("Resizing buffer to %d (size:%d) (Was %" G_GSIZE_FORMAT + " bytes long)", (int) (packet->payload - data), + (int) (packet->data_end - packet->payload), size); + gst_buffer_unmap (buf, data, size); + + gst_buffer_resize (buf, packet->payload - data, + packet->data_end - packet->payload); if (stream->state == PENDING_PACKET_EMPTY) { if (G_UNLIKELY (!packet->payload_unit_start_indicator)) { @@ -2078,10 +2067,6 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream, } else { GST_LOG ("EMPTY=>HEADER"); stream->state = PENDING_PACKET_HEADER; - if (stream->pad) { - GST_DEBUG ("Setting pad caps on buffer %p", buf); - gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad)); - } } } @@ -2174,9 +2159,8 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) GST_DEBUG ("new segment: start: %" GST_TIME_FORMAT " stop: %" GST_TIME_FORMAT " time: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); - newsegmentevent = - gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, start, stop, - position); + + newsegmentevent = gst_event_new_segment (&demux->segment); push_event ((MpegTSBase *) demux, newsegmentevent); @@ -2187,13 +2171,15 @@ static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) { GstFlowReturn res = GST_FLOW_OK; + GList *tmp; MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; + GstBuffer *buf; GST_DEBUG ("stream:%p, pid:0x%04x stream_type:%d state:%d pad:%s:%s", stream, bs->pid, bs->stream_type, stream->state, GST_DEBUG_PAD_NAME (stream->pad)); - if (G_UNLIKELY (stream->current == NULL)) { + if (G_UNLIKELY (stream->currentlist == NULL)) { GST_LOG ("stream->current == NULL"); goto beach; } @@ -2209,8 +2195,7 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) if (G_UNLIKELY (stream->pad == NULL)) { g_list_foreach (stream->currentlist, (GFunc) gst_buffer_unref, NULL); g_list_free (stream->currentlist); - gst_buffer_list_iterator_free (stream->currentit); - gst_buffer_list_unref (stream->current); + stream->currentlist = NULL; goto beach; } @@ -2219,16 +2204,19 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) /* We have a confirmed buffer, let's push it out */ GST_LOG ("Putting pending data into GstBufferList"); + stream->currentlist = g_list_reverse (stream->currentlist); - gst_buffer_list_iterator_add_list (stream->currentit, stream->currentlist); - gst_buffer_list_iterator_free (stream->currentit); + buf = (GstBuffer *) stream->currentlist->data; + + for (tmp = stream->currentlist->next; tmp; tmp = tmp->next) { + buf = gst_buffer_join (buf, (GstBuffer *) tmp->data); + } GST_DEBUG_OBJECT (stream->pad, - "Pushing buffer list with timestamp: %" GST_TIME_FORMAT, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (gst_buffer_list_get - (stream->current, 0, 0)))); + "Pushing buffer with timestamp: %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); - res = gst_pad_push_list (stream->pad, stream->current); + res = gst_pad_push (stream->pad, buf); GST_DEBUG_OBJECT (stream->pad, "Returned %s", gst_flow_get_name (res)); res = tsdemux_combine_flows (demux, stream, res); GST_DEBUG_OBJECT (stream->pad, "combined %s", gst_flow_get_name (res)); @@ -2239,7 +2227,9 @@ beach: stream->state = PENDING_PACKET_EMPTY; memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS); stream->nbpending = 0; - stream->current = NULL; + if (stream->currentlist) + g_list_free (stream->currentlist); + stream->currentlist = NULL; return res; } @@ -2250,8 +2240,10 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, { GstFlowReturn res = GST_FLOW_OK; +#if 0 GST_DEBUG ("buffer:%p, data:%p", GST_BUFFER_DATA (packet->buffer), packet->data); +#endif GST_LOG ("pid 0x%04x pusi:%d, afc:%d, cont:%d, payload:%p", packet->pid, packet->payload_unit_start_indicator, @@ -2259,8 +2251,8 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, packet->continuity_counter, packet->payload); if (section) { - GST_DEBUG ("section complete:%d, buffer size %d", - section->complete, GST_BUFFER_SIZE (section->buffer)); + GST_DEBUG ("section complete:%d, buffer size %" G_GSIZE_FORMAT, + section->complete, gst_buffer_get_size (section->buffer)); gst_buffer_unref (packet->buffer); return res; } @@ -2303,6 +2295,8 @@ gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, TSDemuxStream *stream = NULL; GstFlowReturn res = GST_FLOW_OK; + GST_DEBUG ("packet->buffer %p", packet->buffer); + if (G_LIKELY (demux->program)) { stream = (TSDemuxStream *) demux->program->streams[packet->pid]; diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 395cf3e13..c74d4970d 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -70,6 +70,7 @@ struct _GstTSDemux MpegTSBaseProgram *program; /* Current program */ guint current_program_number; gboolean need_newsegment; + /* Downstream segment */ GstSegment segment; GstClockTime duration; /* Total duration */ diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c index f4b375ea9..3e3b3f9e1 100644 --- a/gst/mpegtsmux/mpegtsmux.c +++ b/gst/mpegtsmux/mpegtsmux.c @@ -108,7 +108,7 @@ enum }; static GstStaticPadTemplate mpegtsmux_sink_factory = - GST_STATIC_PAD_TEMPLATE ("sink_%d", + GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpeg, " @@ -164,10 +164,10 @@ mpegtsmux_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &mpegtsmux_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &mpegtsmux_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mpegtsmux_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mpegtsmux_src_factory)); gst_element_class_set_details_simple (element_class, "MPEG Transport Stream Muxer", "Codec/Muxer", diff --git a/gst/mpegvideoparse/mpegvideoparse.c b/gst/mpegvideoparse/mpegvideoparse.c index c91ed072b..52a34c10f 100644 --- a/gst/mpegvideoparse/mpegvideoparse.c +++ b/gst/mpegvideoparse/mpegvideoparse.c @@ -127,9 +127,10 @@ gst_mpegvideoparse_base_init (MpegVideoParseClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "MPEG video elementary stream parser", diff --git a/gst/mve/gstmvedemux.c b/gst/mve/gstmvedemux.c index 8a0cc5ce8..a101a9059 100644 --- a/gst/mve/gstmvedemux.c +++ b/gst/mve/gstmvedemux.c @@ -1090,12 +1090,12 @@ gst_mve_demux_base_init (GstMveDemuxClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &sink_template); - gst_element_class_add_static_pad_template (element_class, - &vidsrc_template); - gst_element_class_add_static_pad_template (element_class, - &audsrc_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vidsrc_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audsrc_template)); gst_element_class_set_details_simple (element_class, "MVE Demuxer", "Codec/Demuxer", "Demultiplex an Interplay movie (MVE) stream into audio and video", diff --git a/gst/mve/gstmvemux.c b/gst/mve/gstmvemux.c index 87165f46f..e6c2fcb6c 100644 --- a/gst/mve/gstmvemux.c +++ b/gst/mve/gstmvemux.c @@ -1349,11 +1349,12 @@ gst_mve_mux_base_init (GstMveMuxClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, - &audio_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &video_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_sink_factory)); gst_element_class_set_details_simple (element_class, "MVE Multiplexer", "Codec/Muxer", diff --git a/gst/mxf/mxfaes-bwf.c b/gst/mxf/mxfaes-bwf.c index d8862d75b..b9217ba6e 100644 --- a/gst/mxf/mxfaes-bwf.c +++ b/gst/mxf/mxfaes-bwf.c @@ -540,7 +540,7 @@ G_DEFINE_TYPE (MXFMetadataAES3AudioEssenceDescriptor, MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR); static void -mxf_metadata_aes3_audio_essence_descriptor_finalize (GstMiniObject * object) +mxf_metadata_aes3_audio_essence_descriptor_finalize (GObject * object) { MXFMetadataAES3AudioEssenceDescriptor *self = MXF_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR (object); @@ -554,7 +554,7 @@ mxf_metadata_aes3_audio_essence_descriptor_finalize (GstMiniObject * object) g_free (self->fixed_user_data); self->fixed_user_data = NULL; - GST_MINI_OBJECT_CLASS + G_OBJECT_CLASS (mxf_metadata_aes3_audio_essence_descriptor_parent_class)->finalize (object); } @@ -1058,11 +1058,10 @@ static void (MXFMetadataAES3AudioEssenceDescriptorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = - mxf_metadata_aes3_audio_essence_descriptor_finalize; + object_class->finalize = mxf_metadata_aes3_audio_essence_descriptor_finalize; metadata_base_class->handle_tag = mxf_metadata_aes3_audio_essence_descriptor_handle_tag; metadata_base_class->name_quark = MXF_QUARK (AES3_AUDIO_ESSENCE_DESCRIPTOR); @@ -1353,24 +1352,24 @@ mxf_aes_bwf_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags, if (!track->parent.descriptor[i]) continue; - if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track-> - parent.descriptor[i]) + if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent. + descriptor[i]) && (track->parent.descriptor[i]->essence_container.u[14] == 0x01 || track->parent.descriptor[i]->essence_container.u[14] == 0x02 || track->parent.descriptor[i]->essence_container.u[14] == 0x08)) { - s = (MXFMetadataGenericSoundEssenceDescriptor *) track-> - parent.descriptor[i]; + s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent. + descriptor[i]; bwf = TRUE; break; } else - if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track-> - parent.descriptor[i]) + if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent. + descriptor[i]) && (track->parent.descriptor[i]->essence_container.u[14] == 0x03 || track->parent.descriptor[i]->essence_container.u[14] == 0x04 || track->parent.descriptor[i]->essence_container.u[14] == 0x09)) { - s = (MXFMetadataGenericSoundEssenceDescriptor *) track-> - parent.descriptor[i]; + s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent. + descriptor[i]; bwf = FALSE; break; } @@ -1461,7 +1460,7 @@ mxf_bwf_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, } ret = (MXFMetadataWaveAudioEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR, NULL); memcpy (&ret->parent.parent.essence_container, &bwf_essence_container_ul, 16); if (endianness == G_LITTLE_ENDIAN) @@ -1477,7 +1476,7 @@ mxf_bwf_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!mxf_metadata_generic_sound_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/mxf/mxfalaw.c b/gst/mxf/mxfalaw.c index a71162841..49b37237b 100644 --- a/gst/mxf/mxfalaw.c +++ b/gst/mxf/mxfalaw.c @@ -210,14 +210,14 @@ mxf_alaw_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, } ret = (MXFMetadataGenericSoundEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR, NULL); memcpy (&ret->parent.essence_container, &alaw_essence_container_ul, 16); memcpy (&ret->sound_essence_compression, &mxf_sound_essence_compression_alaw, 16); if (!mxf_metadata_generic_sound_essence_descriptor_from_caps (ret, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 13ab13b60..496ee38f7 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -611,11 +611,11 @@ gst_mxf_demux_choose_package (GstMXFDemux * demux) for (i = 0; i < demux->preface->content_storage->n_packages; i++) { if (demux->preface->content_storage->packages[i] && - MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->content_storage-> - packages[i])) { + MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface-> + content_storage->packages[i])) { ret = - MXF_METADATA_GENERIC_PACKAGE (demux->preface->content_storage-> - packages[i]); + MXF_METADATA_GENERIC_PACKAGE (demux->preface-> + content_storage->packages[i]); break; } } @@ -775,8 +775,8 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux) essence_container); if (track->parent.type == MXF_METADATA_TRACK_PICTURE_ESSENCE) { - if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent. - descriptor[0])) + if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track-> + parent.descriptor[0])) mxf_ul_to_string (&MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.descriptor[0])->picture_essence_coding, essence_compression); @@ -785,8 +785,8 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux) g_strdup_printf ("video/x-mxf-%s-%s", essence_container, essence_compression); } else if (track->parent.type == MXF_METADATA_TRACK_SOUND_ESSENCE) { - if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent. - descriptor[0])) + if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track-> + parent.descriptor[0])) mxf_ul_to_string (&MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.descriptor[0])->sound_essence_compression, essence_compression); @@ -795,8 +795,8 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux) g_strdup_printf ("audio/x-mxf-%s-%s", essence_container, essence_compression); } else if (track->parent.type == MXF_METADATA_TRACK_DATA_ESSENCE) { - if (MXF_IS_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (track->parent. - descriptor[0])) + if (MXF_IS_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (track-> + parent.descriptor[0])) mxf_ul_to_string (&MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (track->parent.descriptor[0])->data_essence_coding, essence_compression); @@ -1261,7 +1261,7 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key, mxf_uuid_to_string (&MXF_METADATA_BASE (metadata)->instance_uid, str), g_type_name (G_TYPE_FROM_INSTANCE (old)), g_type_name (G_TYPE_FROM_INSTANCE (metadata))); - gst_mini_object_unref (GST_MINI_OBJECT (metadata)); + g_object_unref (metadata); return GST_FLOW_ERROR; } else if (old && MXF_METADATA_BASE (old)->offset >= @@ -1273,7 +1273,7 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key, GST_DEBUG_OBJECT (demux, "Metadata with instance uid %s already exists and is newer", mxf_uuid_to_string (&MXF_METADATA_BASE (metadata)->instance_uid, str)); - gst_mini_object_unref (GST_MINI_OBJECT (metadata)); + g_object_unref (metadata); return GST_FLOW_OK; } @@ -1351,7 +1351,7 @@ gst_mxf_demux_handle_descriptive_metadata (GstMXFDemux * demux, mxf_uuid_to_string (&MXF_METADATA_BASE (m)->instance_uid, str), g_type_name (G_TYPE_FROM_INSTANCE (old)), g_type_name (G_TYPE_FROM_INSTANCE (m))); - gst_mini_object_unref (GST_MINI_OBJECT (m)); + g_object_unref (m); return GST_FLOW_ERROR; } else if (old && MXF_METADATA_BASE (old)->offset >= MXF_METADATA_BASE (m)->offset) { @@ -1362,7 +1362,7 @@ gst_mxf_demux_handle_descriptive_metadata (GstMXFDemux * demux, GST_DEBUG_OBJECT (demux, "Metadata with instance uid %s already exists and is newer", mxf_uuid_to_string (&MXF_METADATA_BASE (m)->instance_uid, str)); - gst_mini_object_unref (GST_MINI_OBJECT (m)); + g_object_unref (m); return GST_FLOW_OK; } @@ -1421,8 +1421,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad, pad->current_component_index); pad->current_component = - MXF_METADATA_SOURCE_CLIP (sequence->structural_components[pad-> - current_component_index]); + MXF_METADATA_SOURCE_CLIP (sequence-> + structural_components[pad->current_component_index]); if (pad->current_component == NULL) { GST_ERROR_OBJECT (demux, "No such structural component"); return GST_FLOW_ERROR; @@ -1430,8 +1430,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad, if (!pad->current_component->source_package || !pad->current_component->source_package->top_level - || !MXF_METADATA_GENERIC_PACKAGE (pad->current_component-> - source_package)->tracks) { + || !MXF_METADATA_GENERIC_PACKAGE (pad-> + current_component->source_package)->tracks) { GST_ERROR_OBJECT (demux, "Invalid component"); return GST_FLOW_ERROR; } @@ -2998,8 +2998,8 @@ gst_mxf_demux_pad_set_last_stop (GstMXFDemux * demux, GstMXFDemuxPad * p, for (i = 0; i < p->material_track->parent.sequence->n_structural_components; i++) { clip = - MXF_METADATA_SOURCE_CLIP (p->material_track->parent.sequence-> - structural_components[i]); + MXF_METADATA_SOURCE_CLIP (p->material_track->parent. + sequence->structural_components[i]); if (clip->parent.duration <= 0) break; @@ -3077,8 +3077,8 @@ gst_mxf_demux_seek_push (GstMXFDemux * demux, GstEvent * event) if (format != GST_FORMAT_TIME) goto wrong_format; - flush = ! !(flags & GST_SEEK_FLAG_FLUSH); - keyframe = ! !(flags & GST_SEEK_FLAG_KEY_UNIT); + flush = !!(flags & GST_SEEK_FLAG_FLUSH); + keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT); /* Work on a copy until we are sure the seek succeeded. */ memcpy (&seeksegment, &demux->segment, sizeof (GstSegment)); @@ -3210,8 +3210,8 @@ gst_mxf_demux_seek_pull (GstMXFDemux * demux, GstEvent * event) if (rate <= 0.0) goto wrong_rate; - flush = ! !(flags & GST_SEEK_FLAG_FLUSH); - keyframe = ! !(flags & GST_SEEK_FLAG_KEY_UNIT); + flush = !!(flags & GST_SEEK_FLAG_FLUSH); + keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT); if (flush) { GstEvent *e; @@ -3962,10 +3962,10 @@ gst_mxf_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &mxf_sink_template); - gst_element_class_add_static_pad_template (element_class, - &mxf_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mxf_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mxf_src_template)); gst_element_class_set_details_simple (element_class, "MXF Demuxer", "Codec/Demuxer", "Demux MXF files", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); diff --git a/gst/mxf/mxfdms1.c b/gst/mxf/mxfdms1.c index 7de27b7d2..c69e0e75e 100644 --- a/gst/mxf/mxfdms1.c +++ b/gst/mxf/mxfdms1.c @@ -167,14 +167,14 @@ G_DEFINE_ABSTRACT_TYPE (MXFDMS1Thesaurus, mxf_dms1_thesaurus, MXF_TYPE_DMS1_TEXT_LANGUAGE); static void -mxf_dms1_thesaurus_finalize (GstMiniObject * object) +mxf_dms1_thesaurus_finalize (GObject * object) { MXFDMS1Thesaurus *self = MXF_DMS1_THESAURUS (object); g_free (self->thesaurus_name); self->thesaurus_name = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_thesaurus_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_thesaurus_parent_class)->finalize (object); } static gboolean @@ -215,10 +215,10 @@ mxf_dms1_thesaurus_init (MXFDMS1Thesaurus * self) static void mxf_dms1_thesaurus_class_init (MXFDMS1ThesaurusClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; - miniobject_class->finalize = mxf_dms1_thesaurus_finalize; + object_class->finalize = mxf_dms1_thesaurus_finalize; metadatabase_class->handle_tag = mxf_dms1_thesaurus_handle_tag; } @@ -233,7 +233,7 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MXFDMS1Framework, mxf_dms1_framework, mxf_dms1_framework_interface_init)); static void -mxf_dms1_framework_finalize (GstMiniObject * object) +mxf_dms1_framework_finalize (GObject * object) { MXFDMS1Framework *self = MXF_DMS1_FRAMEWORK (object); @@ -270,7 +270,7 @@ mxf_dms1_framework_finalize (GstMiniObject * object) g_free (self->location_sets); self->location_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_framework_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_framework_parent_class)->finalize (object); } static gboolean @@ -545,10 +545,10 @@ mxf_dms1_framework_init (MXFDMS1Framework * self) static void mxf_dms1_framework_class_init (MXFDMS1FrameworkClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; - miniobject_class->finalize = mxf_dms1_framework_finalize; + object_class->finalize = mxf_dms1_framework_finalize; metadatabase_class->handle_tag = mxf_dms1_framework_handle_tag; metadatabase_class->resolve = mxf_dms1_framework_resolve; } @@ -557,7 +557,7 @@ G_DEFINE_ABSTRACT_TYPE (MXFDMS1ProductionClipFramework, mxf_dms1_production_clip_framework, MXF_TYPE_DMS1_FRAMEWORK); static void -mxf_dms1_production_clip_framework_finalize (GstMiniObject * object) +mxf_dms1_production_clip_framework_finalize (GObject * object) { MXFDMS1ProductionClipFramework *self = MXF_DMS1_PRODUCTION_CLIP_FRAMEWORK (object); @@ -574,7 +574,7 @@ mxf_dms1_production_clip_framework_finalize (GstMiniObject * object) g_free (self->contract_sets); self->contract_sets = NULL; - GST_MINI_OBJECT_CLASS + G_OBJECT_CLASS (mxf_dms1_production_clip_framework_parent_class)->finalize (object); } @@ -737,10 +737,10 @@ static void mxf_dms1_production_clip_framework_class_init (MXFDMS1ProductionClipFrameworkClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; - miniobject_class->finalize = mxf_dms1_production_clip_framework_finalize; + object_class->finalize = mxf_dms1_production_clip_framework_finalize; metadatabase_class->handle_tag = mxf_dms1_production_clip_framework_handle_tag; metadatabase_class->resolve = mxf_dms1_production_clip_framework_resolve; @@ -750,7 +750,7 @@ G_DEFINE_TYPE (MXFDMS1ProductionFramework, mxf_dms1_production_framework, MXF_TYPE_DMS1_PRODUCTION_CLIP_FRAMEWORK); static void -mxf_dms1_production_framework_finalize (GstMiniObject * object) +mxf_dms1_production_framework_finalize (GObject * object) { MXFDMS1ProductionFramework *self = MXF_DMS1_PRODUCTION_FRAMEWORK (object); @@ -793,7 +793,7 @@ mxf_dms1_production_framework_finalize (GstMiniObject * object) g_free (self->setting_period_sets); self->setting_period_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_production_framework_parent_class)->finalize + G_OBJECT_CLASS (mxf_dms1_production_framework_parent_class)->finalize (object); } @@ -1055,11 +1055,11 @@ static void mxf_dms1_production_framework_class_init (MXFDMS1ProductionFrameworkClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_production_framework_finalize; + object_class->finalize = mxf_dms1_production_framework_finalize; metadatabase_class->handle_tag = mxf_dms1_production_framework_handle_tag; metadatabase_class->resolve = mxf_dms1_production_framework_resolve; @@ -1070,7 +1070,7 @@ G_DEFINE_TYPE (MXFDMS1ClipFramework, mxf_dms1_clip_framework, MXF_TYPE_DMS1_PRODUCTION_CLIP_FRAMEWORK); static void -mxf_dms1_clip_framework_finalize (GstMiniObject * object) +mxf_dms1_clip_framework_finalize (GObject * object) { MXFDMS1ClipFramework *self = MXF_DMS1_CLIP_FRAMEWORK (object); @@ -1098,8 +1098,7 @@ mxf_dms1_clip_framework_finalize (GstMiniObject * object) g_free (self->device_parameters_sets); self->device_parameters_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_clip_framework_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_clip_framework_parent_class)->finalize (object); } static gboolean @@ -1329,11 +1328,11 @@ mxf_dms1_clip_framework_init (MXFDMS1ClipFramework * self) static void mxf_dms1_clip_framework_class_init (MXFDMS1ClipFrameworkClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_clip_framework_finalize; + object_class->finalize = mxf_dms1_clip_framework_finalize; metadatabase_class->handle_tag = mxf_dms1_clip_framework_handle_tag; metadatabase_class->resolve = mxf_dms1_clip_framework_resolve; dm_class->type = 0x010200; @@ -1343,7 +1342,7 @@ G_DEFINE_TYPE (MXFDMS1SceneFramework, mxf_dms1_scene_framework, MXF_TYPE_DMS1_FRAMEWORK); static void -mxf_dms1_scene_framework_finalize (GstMiniObject * object) +mxf_dms1_scene_framework_finalize (GObject * object) { MXFDMS1SceneFramework *self = MXF_DMS1_SCENE_FRAMEWORK (object); @@ -1359,8 +1358,7 @@ mxf_dms1_scene_framework_finalize (GstMiniObject * object) g_free (self->shot_scene_sets); self->shot_scene_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_scene_framework_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_scene_framework_parent_class)->finalize (object); } static gboolean @@ -1492,11 +1490,11 @@ mxf_dms1_scene_framework_init (MXFDMS1SceneFramework * self) static void mxf_dms1_scene_framework_class_init (MXFDMS1SceneFrameworkClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_scene_framework_finalize; + object_class->finalize = mxf_dms1_scene_framework_finalize; metadatabase_class->handle_tag = mxf_dms1_scene_framework_handle_tag; metadatabase_class->resolve = mxf_dms1_scene_framework_resolve; dm_class->type = 0x010300; @@ -1505,7 +1503,7 @@ mxf_dms1_scene_framework_class_init (MXFDMS1SceneFrameworkClass * klass) G_DEFINE_TYPE (MXFDMS1Titles, mxf_dms1_titles, MXF_TYPE_DMS1_TEXT_LANGUAGE); static void -mxf_dms1_titles_finalize (GstMiniObject * object) +mxf_dms1_titles_finalize (GObject * object) { MXFDMS1Titles *self = MXF_DMS1_TITLES (object); @@ -1524,7 +1522,7 @@ mxf_dms1_titles_finalize (GstMiniObject * object) g_free (self->version_title); self->version_title = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_titles_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_titles_parent_class)->finalize (object); } static gboolean @@ -1592,11 +1590,11 @@ mxf_dms1_titles_init (MXFDMS1Titles * self) static void mxf_dms1_titles_class_init (MXFDMS1TitlesClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_titles_finalize; + object_class->finalize = mxf_dms1_titles_finalize; metadatabase_class->handle_tag = mxf_dms1_titles_handle_tag; dm_class->type = 0x100100; } @@ -1605,7 +1603,7 @@ G_DEFINE_TYPE (MXFDMS1Identification, mxf_dms1_identification, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_identification_finalize (GstMiniObject * object) +mxf_dms1_identification_finalize (GObject * object) { MXFDMS1Identification *self = MXF_DMS1_IDENTIFICATION (object); @@ -1615,8 +1613,7 @@ mxf_dms1_identification_finalize (GstMiniObject * object) g_free (self->identification_issuing_authority); self->identification_issuing_authority = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_identification_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_identification_parent_class)->finalize (object); } static gboolean @@ -1700,11 +1697,11 @@ mxf_dms1_identification_init (MXFDMS1Identification * self) static void mxf_dms1_identification_class_init (MXFDMS1IdentificationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_identification_finalize; + object_class->finalize = mxf_dms1_identification_finalize; metadatabase_class->handle_tag = mxf_dms1_identification_handle_tag; dm_class->type = 0x110100; } @@ -1713,7 +1710,7 @@ G_DEFINE_TYPE (MXFDMS1GroupRelationship, mxf_dms1_group_relationship, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_group_relationship_finalize (GstMiniObject * object) +mxf_dms1_group_relationship_finalize (GObject * object) { MXFDMS1GroupRelationship *self = MXF_DMS1_GROUP_RELATIONSHIP (object); @@ -1726,8 +1723,7 @@ mxf_dms1_group_relationship_finalize (GstMiniObject * object) g_free (self->group_synopsis); self->group_synopsis = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_group_relationship_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_group_relationship_parent_class)->finalize (object); } static gboolean @@ -1834,11 +1830,11 @@ mxf_dms1_group_relationship_init (MXFDMS1GroupRelationship * self) static void mxf_dms1_group_relationship_class_init (MXFDMS1GroupRelationshipClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_group_relationship_finalize; + object_class->finalize = mxf_dms1_group_relationship_finalize; metadatabase_class->handle_tag = mxf_dms1_group_relationship_handle_tag; dm_class->type = 0x120100; } @@ -1846,7 +1842,7 @@ mxf_dms1_group_relationship_class_init (MXFDMS1GroupRelationshipClass * klass) G_DEFINE_TYPE (MXFDMS1Branding, mxf_dms1_branding, MXF_TYPE_DMS1_TEXT_LANGUAGE); static void -mxf_dms1_branding_finalize (GstMiniObject * object) +mxf_dms1_branding_finalize (GObject * object) { MXFDMS1Branding *self = MXF_DMS1_BRANDING (object); @@ -1856,7 +1852,7 @@ mxf_dms1_branding_finalize (GstMiniObject * object) g_free (self->brand_original_title); self->brand_original_title = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_branding_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_branding_parent_class)->finalize (object); } static gboolean @@ -1906,11 +1902,11 @@ mxf_dms1_branding_init (MXFDMS1Branding * self) static void mxf_dms1_branding_class_init (MXFDMS1BrandingClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_branding_finalize; + object_class->finalize = mxf_dms1_branding_finalize; metadatabase_class->handle_tag = mxf_dms1_branding_handle_tag; dm_class->type = 0x130100; } @@ -1918,7 +1914,7 @@ mxf_dms1_branding_class_init (MXFDMS1BrandingClass * klass) G_DEFINE_TYPE (MXFDMS1Event, mxf_dms1_event, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_event_finalize (GstMiniObject * object) +mxf_dms1_event_finalize (GObject * object) { MXFDMS1Event *self = MXF_DMS1_EVENT (object); @@ -1937,7 +1933,7 @@ mxf_dms1_event_finalize (GstMiniObject * object) g_free (self->annotation_sets); self->annotation_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_event_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_event_parent_class)->finalize (object); } static gboolean @@ -2083,11 +2079,11 @@ mxf_dms1_event_init (MXFDMS1Event * self) static void mxf_dms1_event_class_init (MXFDMS1EventClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_event_finalize; + object_class->finalize = mxf_dms1_event_finalize; metadatabase_class->handle_tag = mxf_dms1_event_handle_tag; metadatabase_class->resolve = mxf_dms1_event_resolve; dm_class->type = 0x140100; @@ -2096,7 +2092,7 @@ mxf_dms1_event_class_init (MXFDMS1EventClass * klass) G_DEFINE_TYPE (MXFDMS1Publication, mxf_dms1_publication, MXF_TYPE_DMS1); static void -mxf_dms1_publication_finalize (GstMiniObject * object) +mxf_dms1_publication_finalize (GObject * object) { MXFDMS1Publication *self = MXF_DMS1_PUBLICATION (object); @@ -2112,7 +2108,7 @@ mxf_dms1_publication_finalize (GstMiniObject * object) g_free (self->publication_region); self->publication_region = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_publication_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_publication_parent_class)->finalize (object); } static gboolean @@ -2179,11 +2175,11 @@ mxf_dms1_publication_init (MXFDMS1Publication * self) static void mxf_dms1_publication_class_init (MXFDMS1PublicationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_publication_finalize; + object_class->finalize = mxf_dms1_publication_finalize; metadatabase_class->handle_tag = mxf_dms1_publication_handle_tag; dm_class->type = 0x140200; } @@ -2191,7 +2187,7 @@ mxf_dms1_publication_class_init (MXFDMS1PublicationClass * klass) G_DEFINE_TYPE (MXFDMS1Award, mxf_dms1_award, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_award_finalize (GstMiniObject * object) +mxf_dms1_award_finalize (GObject * object) { MXFDMS1Award *self = MXF_DMS1_AWARD (object); @@ -2213,7 +2209,7 @@ mxf_dms1_award_finalize (GstMiniObject * object) g_free (self->participant_sets); self->participant_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_award_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_award_parent_class)->finalize (object); } static gboolean @@ -2339,11 +2335,11 @@ mxf_dms1_award_init (MXFDMS1Award * self) static void mxf_dms1_award_class_init (MXFDMS1AwardClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_award_finalize; + object_class->finalize = mxf_dms1_award_finalize; metadatabase_class->handle_tag = mxf_dms1_award_handle_tag; metadatabase_class->resolve = mxf_dms1_award_resolve; dm_class->type = 0x150100; @@ -2353,14 +2349,14 @@ G_DEFINE_TYPE (MXFDMS1CaptionsDescription, mxf_dms1_captions_description, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_captions_description_finalize (GstMiniObject * object) +mxf_dms1_captions_description_finalize (GObject * object) { MXFDMS1CaptionsDescription *self = MXF_DMS1_CAPTIONS_DESCRIPTION (object); g_free (self->caption_kind); self->caption_kind = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_captions_description_parent_class)->finalize + G_OBJECT_CLASS (mxf_dms1_captions_description_parent_class)->finalize (object); } @@ -2422,11 +2418,11 @@ static void mxf_dms1_captions_description_class_init (MXFDMS1CaptionsDescriptionClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_captions_description_finalize; + object_class->finalize = mxf_dms1_captions_description_finalize; metadatabase_class->handle_tag = mxf_dms1_captions_description_handle_tag; dm_class->type = 0x160100; } @@ -2434,7 +2430,7 @@ mxf_dms1_captions_description_class_init (MXFDMS1CaptionsDescriptionClass * G_DEFINE_TYPE (MXFDMS1Annotation, mxf_dms1_annotation, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_annotation_finalize (GstMiniObject * object) +mxf_dms1_annotation_finalize (GObject * object) { MXFDMS1Annotation *self = MXF_DMS1_ANNOTATION (object); @@ -2465,7 +2461,7 @@ mxf_dms1_annotation_finalize (GstMiniObject * object) g_free (self->participant_sets); self->participant_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_annotation_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_annotation_parent_class)->finalize (object); } static gboolean @@ -2652,11 +2648,11 @@ mxf_dms1_annotation_init (MXFDMS1Annotation * self) static void mxf_dms1_annotation_class_init (MXFDMS1AnnotationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_annotation_finalize; + object_class->finalize = mxf_dms1_annotation_finalize; metadatabase_class->handle_tag = mxf_dms1_annotation_handle_tag; metadatabase_class->resolve = mxf_dms1_annotation_resolve; dm_class->type = 0x170100; @@ -2666,7 +2662,7 @@ G_DEFINE_TYPE (MXFDMS1SettingPeriod, mxf_dms1_setting_period, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_setting_period_finalize (GstMiniObject * object) +mxf_dms1_setting_period_finalize (GObject * object) { MXFDMS1SettingPeriod *self = MXF_DMS1_SETTING_PERIOD (object); @@ -2676,8 +2672,7 @@ mxf_dms1_setting_period_finalize (GstMiniObject * object) g_free (self->setting_period_description); self->setting_period_description = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_setting_period_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_setting_period_parent_class)->finalize (object); } static gboolean @@ -2748,11 +2743,11 @@ mxf_dms1_setting_period_init (MXFDMS1SettingPeriod * self) static void mxf_dms1_setting_period_class_init (MXFDMS1SettingPeriodClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_setting_period_finalize; + object_class->finalize = mxf_dms1_setting_period_finalize; metadatabase_class->handle_tag = mxf_dms1_setting_period_handle_tag; dm_class->type = 0x170200; } @@ -2760,7 +2755,7 @@ mxf_dms1_setting_period_class_init (MXFDMS1SettingPeriodClass * klass) G_DEFINE_TYPE (MXFDMS1Scripting, mxf_dms1_scripting, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_scripting_finalize (GstMiniObject * object) +mxf_dms1_scripting_finalize (GObject * object) { MXFDMS1Scripting *self = MXF_DMS1_SCRIPTING (object); @@ -2773,7 +2768,7 @@ mxf_dms1_scripting_finalize (GstMiniObject * object) g_free (self->scripting_locators); self->scripting_locators = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_scripting_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_scripting_parent_class)->finalize (object); } static gboolean @@ -2851,11 +2846,11 @@ mxf_dms1_scripting_init (MXFDMS1Scripting * self) static void mxf_dms1_scripting_class_init (MXFDMS1ScriptingClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_scripting_finalize; + object_class->finalize = mxf_dms1_scripting_finalize; metadatabase_class->handle_tag = mxf_dms1_scripting_handle_tag; dm_class->type = 0x170300; } @@ -2864,7 +2859,7 @@ G_DEFINE_TYPE (MXFDMS1Classification, mxf_dms1_classification, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_classification_finalize (GstMiniObject * object) +mxf_dms1_classification_finalize (GObject * object) { MXFDMS1Classification *self = MXF_DMS1_CLASSIFICATION (object); @@ -2874,8 +2869,7 @@ mxf_dms1_classification_finalize (GstMiniObject * object) g_free (self->name_value_sets); self->name_value_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_classification_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_classification_parent_class)->finalize (object); } static gboolean @@ -2974,11 +2968,11 @@ mxf_dms1_classification_init (MXFDMS1Classification * self) static void mxf_dms1_classification_class_init (MXFDMS1ClassificationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_classification_finalize; + object_class->finalize = mxf_dms1_classification_finalize; metadatabase_class->handle_tag = mxf_dms1_classification_handle_tag; metadatabase_class->resolve = mxf_dms1_classification_resolve; dm_class->type = 0x170400; @@ -2987,7 +2981,7 @@ mxf_dms1_classification_class_init (MXFDMS1ClassificationClass * klass) G_DEFINE_TYPE (MXFDMS1Shot, mxf_dms1_shot, MXF_TYPE_DMS1_TEXT_LANGUAGE); static void -mxf_dms1_shot_finalize (GstMiniObject * object) +mxf_dms1_shot_finalize (GObject * object) { MXFDMS1Shot *self = MXF_DMS1_SHOT (object); @@ -3009,7 +3003,7 @@ mxf_dms1_shot_finalize (GstMiniObject * object) g_free (self->key_point_sets); self->key_point_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_shot_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_shot_parent_class)->finalize (object); } static gboolean @@ -3182,11 +3176,11 @@ mxf_dms1_shot_init (MXFDMS1Shot * self) static void mxf_dms1_shot_class_init (MXFDMS1ShotClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_shot_finalize; + object_class->finalize = mxf_dms1_shot_finalize; metadatabase_class->handle_tag = mxf_dms1_shot_handle_tag; metadatabase_class->resolve = mxf_dms1_shot_resolve; dm_class->type = 0x170500; @@ -3195,7 +3189,7 @@ mxf_dms1_shot_class_init (MXFDMS1ShotClass * klass) G_DEFINE_TYPE (MXFDMS1KeyPoint, mxf_dms1_key_point, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_key_point_finalize (GstMiniObject * object) +mxf_dms1_key_point_finalize (GObject * object) { MXFDMS1KeyPoint *self = MXF_DMS1_KEY_POINT (object); @@ -3205,7 +3199,7 @@ mxf_dms1_key_point_finalize (GstMiniObject * object) g_free (self->keypoint_value); self->keypoint_value = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_key_point_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_key_point_parent_class)->finalize (object); } static gboolean @@ -3271,11 +3265,11 @@ mxf_dms1_key_point_init (MXFDMS1KeyPoint * self) static void mxf_dms1_key_point_class_init (MXFDMS1KeyPointClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_key_point_finalize; + object_class->finalize = mxf_dms1_key_point_finalize; metadatabase_class->handle_tag = mxf_dms1_key_point_handle_tag; dm_class->type = 0x170600; } @@ -3284,7 +3278,7 @@ G_DEFINE_TYPE (MXFDMS1Participant, mxf_dms1_participant, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_participant_finalize (GstMiniObject * object) +mxf_dms1_participant_finalize (GObject * object) { MXFDMS1Participant *self = MXF_DMS1_PARTICIPANT (object); @@ -3309,7 +3303,7 @@ mxf_dms1_participant_finalize (GstMiniObject * object) g_free (self->organisation_sets); self->organisation_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_participant_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_participant_parent_class)->finalize (object); } static gboolean @@ -3471,11 +3465,11 @@ mxf_dms1_participant_init (MXFDMS1Participant * self) static void mxf_dms1_participant_class_init (MXFDMS1ParticipantClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_participant_finalize; + object_class->finalize = mxf_dms1_participant_finalize; metadatabase_class->handle_tag = mxf_dms1_participant_handle_tag; metadatabase_class->resolve = mxf_dms1_participant_resolve; dm_class->type = 0x180100; @@ -3485,7 +3479,7 @@ G_DEFINE_ABSTRACT_TYPE (MXFDMS1Contact, mxf_dms1_contact, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_contact_finalize (GstMiniObject * object) +mxf_dms1_contact_finalize (GObject * object) { MXFDMS1Contact *self = MXF_DMS1_CONTACT (object); @@ -3501,7 +3495,7 @@ mxf_dms1_contact_finalize (GstMiniObject * object) g_free (self->address_sets); self->address_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_contact_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_contact_parent_class)->finalize (object); } static gboolean @@ -3627,10 +3621,10 @@ mxf_dms1_contact_init (MXFDMS1Contact * self) static void mxf_dms1_contact_class_init (MXFDMS1ContactClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; - miniobject_class->finalize = mxf_dms1_contact_finalize; + object_class->finalize = mxf_dms1_contact_finalize; metadatabase_class->handle_tag = mxf_dms1_contact_handle_tag; metadatabase_class->resolve = mxf_dms1_contact_resolve; } @@ -3638,7 +3632,7 @@ mxf_dms1_contact_class_init (MXFDMS1ContactClass * klass) G_DEFINE_TYPE (MXFDMS1Person, mxf_dms1_person, MXF_TYPE_DMS1_CONTACT); static void -mxf_dms1_person_finalize (GstMiniObject * object) +mxf_dms1_person_finalize (GObject * object) { MXFDMS1Person *self = MXF_DMS1_PERSON (object); @@ -3684,7 +3678,7 @@ mxf_dms1_person_finalize (GstMiniObject * object) g_free (self->organisation_sets); self->organisation_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_person_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_person_parent_class)->finalize (object); } static gboolean @@ -3858,11 +3852,11 @@ mxf_dms1_person_init (MXFDMS1Person * self) static void mxf_dms1_person_class_init (MXFDMS1PersonClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_person_finalize; + object_class->finalize = mxf_dms1_person_finalize; metadatabase_class->handle_tag = mxf_dms1_person_handle_tag; metadatabase_class->resolve = mxf_dms1_person_resolve; dm_class->type = 0x1a0200; @@ -3872,7 +3866,7 @@ G_DEFINE_TYPE (MXFDMS1Organisation, mxf_dms1_organisation, MXF_TYPE_DMS1_CONTACT); static void -mxf_dms1_organisation_finalize (GstMiniObject * object) +mxf_dms1_organisation_finalize (GObject * object) { MXFDMS1Organisation *self = MXF_DMS1_ORGANISATION (object); @@ -3888,7 +3882,7 @@ mxf_dms1_organisation_finalize (GstMiniObject * object) g_free (self->contact_department); self->contact_department = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_organisation_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_organisation_parent_class)->finalize (object); } static gboolean @@ -3954,11 +3948,11 @@ mxf_dms1_organisation_init (MXFDMS1Organisation * self) static void mxf_dms1_organisation_class_init (MXFDMS1OrganisationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_organisation_finalize; + object_class->finalize = mxf_dms1_organisation_finalize; metadatabase_class->handle_tag = mxf_dms1_organisation_handle_tag; dm_class->type = 0x1a0300; } @@ -3966,7 +3960,7 @@ mxf_dms1_organisation_class_init (MXFDMS1OrganisationClass * klass) G_DEFINE_TYPE (MXFDMS1Location, mxf_dms1_location, MXF_TYPE_DMS1_CONTACT); static void -mxf_dms1_location_finalize (GstMiniObject * object) +mxf_dms1_location_finalize (GObject * object) { MXFDMS1Location *self = MXF_DMS1_LOCATION (object); @@ -3976,7 +3970,7 @@ mxf_dms1_location_finalize (GstMiniObject * object) g_free (self->location_description); self->location_description = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_location_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_location_parent_class)->finalize (object); } static gboolean @@ -4025,11 +4019,11 @@ mxf_dms1_location_init (MXFDMS1Location * self) static void mxf_dms1_location_class_init (MXFDMS1LocationClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_location_finalize; + object_class->finalize = mxf_dms1_location_finalize; metadatabase_class->handle_tag = mxf_dms1_location_handle_tag; dm_class->type = 0x1a0400; } @@ -4037,7 +4031,7 @@ mxf_dms1_location_class_init (MXFDMS1LocationClass * klass) G_DEFINE_TYPE (MXFDMS1Address, mxf_dms1_address, MXF_TYPE_DMS1); static void -mxf_dms1_address_finalize (GstMiniObject * object) +mxf_dms1_address_finalize (GObject * object) { MXFDMS1Address *self = MXF_DMS1_ADDRESS (object); @@ -4086,7 +4080,7 @@ mxf_dms1_address_finalize (GstMiniObject * object) g_free (self->name_value_sets); self->name_value_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_address_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_address_parent_class)->finalize (object); } static gboolean @@ -4303,11 +4297,11 @@ mxf_dms1_address_init (MXFDMS1Address * self) static void mxf_dms1_address_class_init (MXFDMS1AddressClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_address_finalize; + object_class->finalize = mxf_dms1_address_finalize; metadatabase_class->handle_tag = mxf_dms1_address_handle_tag; metadatabase_class->resolve = mxf_dms1_address_resolve; dm_class->type = 0x1b0100; @@ -4316,7 +4310,7 @@ mxf_dms1_address_class_init (MXFDMS1AddressClass * klass) G_DEFINE_TYPE (MXFDMS1Communications, mxf_dms1_communications, MXF_TYPE_DMS1); static void -mxf_dms1_communications_finalize (GstMiniObject * object) +mxf_dms1_communications_finalize (GObject * object) { MXFDMS1Communications *self = MXF_DMS1_COMMUNICATIONS (object); @@ -4326,8 +4320,7 @@ mxf_dms1_communications_finalize (GstMiniObject * object) g_free (self->web_page); self->web_page = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_communications_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_communications_parent_class)->finalize (object); } static gboolean @@ -4424,11 +4417,11 @@ mxf_dms1_communications_init (MXFDMS1Communications * self) static void mxf_dms1_communications_class_init (MXFDMS1CommunicationsClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_communications_finalize; + object_class->finalize = mxf_dms1_communications_finalize; metadatabase_class->handle_tag = mxf_dms1_communications_handle_tag; dm_class->type = 0x1b0200; } @@ -4436,7 +4429,7 @@ mxf_dms1_communications_class_init (MXFDMS1CommunicationsClass * klass) G_DEFINE_TYPE (MXFDMS1Contract, mxf_dms1_contract, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_contract_finalize (GstMiniObject * object) +mxf_dms1_contract_finalize (GObject * object) { MXFDMS1Contract *self = MXF_DMS1_CONTRACT (object); @@ -4452,7 +4445,7 @@ mxf_dms1_contract_finalize (GstMiniObject * object) g_free (self->participant_sets); self->participant_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_contract_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_contract_parent_class)->finalize (object); } static gboolean @@ -4579,11 +4572,11 @@ mxf_dms1_contract_init (MXFDMS1Contract * self) static void mxf_dms1_contract_class_init (MXFDMS1ContractClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_contract_finalize; + object_class->finalize = mxf_dms1_contract_finalize; metadatabase_class->handle_tag = mxf_dms1_contract_handle_tag; metadatabase_class->resolve = mxf_dms1_contract_resolve; dm_class->type = 0x1c0100; @@ -4592,7 +4585,7 @@ mxf_dms1_contract_class_init (MXFDMS1ContractClass * klass) G_DEFINE_TYPE (MXFDMS1Rights, mxf_dms1_rights, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_rights_finalize (GstMiniObject * object) +mxf_dms1_rights_finalize (GObject * object) { MXFDMS1Rights *self = MXF_DMS1_RIGHTS (object); @@ -4620,7 +4613,7 @@ mxf_dms1_rights_finalize (GstMiniObject * object) g_free (self->intellectual_property_right); self->intellectual_property_right = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_rights_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_rights_parent_class)->finalize (object); } static gboolean @@ -4755,11 +4748,11 @@ mxf_dms1_rights_init (MXFDMS1Rights * self) static void mxf_dms1_rights_class_init (MXFDMS1RightsClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_rights_finalize; + object_class->finalize = mxf_dms1_rights_finalize; metadatabase_class->handle_tag = mxf_dms1_rights_handle_tag; dm_class->type = 0x1c0200; } @@ -4767,15 +4760,14 @@ mxf_dms1_rights_class_init (MXFDMS1RightsClass * klass) G_DEFINE_TYPE (MXFDMS1PictureFormat, mxf_dms1_picture_format, MXF_TYPE_DMS1); static void -mxf_dms1_picture_format_finalize (GstMiniObject * object) +mxf_dms1_picture_format_finalize (GObject * object) { MXFDMS1PictureFormat *self = MXF_DMS1_PICTURE_FORMAT (object); g_free (self->colour_descriptor); self->colour_descriptor = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_picture_format_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_picture_format_parent_class)->finalize (object); } static gboolean @@ -4846,11 +4838,11 @@ mxf_dms1_picture_format_init (MXFDMS1PictureFormat * self) static void mxf_dms1_picture_format_class_init (MXFDMS1PictureFormatClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_picture_format_finalize; + object_class->finalize = mxf_dms1_picture_format_finalize; metadatabase_class->handle_tag = mxf_dms1_picture_format_handle_tag; dm_class->type = 0x1d0100; } @@ -4859,7 +4851,7 @@ G_DEFINE_TYPE (MXFDMS1DeviceParameters, mxf_dms1_device_parameters, MXF_TYPE_DMS1_THESAURUS); static void -mxf_dms1_device_parameters_finalize (GstMiniObject * object) +mxf_dms1_device_parameters_finalize (GObject * object) { MXFDMS1DeviceParameters *self = MXF_DMS1_DEVICE_PARAMETERS (object); @@ -4884,8 +4876,7 @@ mxf_dms1_device_parameters_finalize (GstMiniObject * object) g_free (self->name_value_sets); self->name_value_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_device_parameters_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_device_parameters_parent_class)->finalize (object); } static gboolean @@ -5050,11 +5041,11 @@ mxf_dms1_device_parameters_init (MXFDMS1DeviceParameters * self) static void mxf_dms1_device_parameters_class_init (MXFDMS1DeviceParametersClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_device_parameters_finalize; + object_class->finalize = mxf_dms1_device_parameters_finalize; metadatabase_class->handle_tag = mxf_dms1_device_parameters_handle_tag; metadatabase_class->resolve = mxf_dms1_device_parameters_resolve; dm_class->type = 0x1e0100; @@ -5063,7 +5054,7 @@ mxf_dms1_device_parameters_class_init (MXFDMS1DeviceParametersClass * klass) G_DEFINE_TYPE (MXFDMS1NameValue, mxf_dms1_name_value, MXF_TYPE_DMS1); static void -mxf_dms1_name_value_finalize (GstMiniObject * object) +mxf_dms1_name_value_finalize (GObject * object) { MXFDMS1NameValue *self = MXF_DMS1_NAME_VALUE (object); @@ -5073,7 +5064,7 @@ mxf_dms1_name_value_finalize (GstMiniObject * object) g_free (self->item_value); self->item_value = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_name_value_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_name_value_parent_class)->finalize (object); } static gboolean @@ -5142,11 +5133,11 @@ mxf_dms1_name_value_init (MXFDMS1NameValue * self) static void mxf_dms1_name_value_class_init (MXFDMS1NameValueClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_name_value_finalize; + object_class->finalize = mxf_dms1_name_value_finalize; metadatabase_class->handle_tag = mxf_dms1_name_value_handle_tag; dm_class->type = 0x1f0100; } @@ -5154,7 +5145,7 @@ mxf_dms1_name_value_class_init (MXFDMS1NameValueClass * klass) G_DEFINE_TYPE (MXFDMS1Processing, mxf_dms1_processing, MXF_TYPE_DMS1); static void -mxf_dms1_processing_finalize (GstMiniObject * object) +mxf_dms1_processing_finalize (GObject * object) { MXFDMS1Processing *self = MXF_DMS1_PROCESSING (object); @@ -5164,7 +5155,7 @@ mxf_dms1_processing_finalize (GstMiniObject * object) g_free (self->graphic_usage_type); self->graphic_usage_type = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_processing_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_processing_parent_class)->finalize (object); } static gboolean @@ -5271,11 +5262,11 @@ mxf_dms1_processing_init (MXFDMS1Processing * self) static void mxf_dms1_processing_class_init (MXFDMS1ProcessingClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_processing_finalize; + object_class->finalize = mxf_dms1_processing_finalize; metadatabase_class->handle_tag = mxf_dms1_processing_handle_tag; dm_class->type = 0x200100; } @@ -5283,14 +5274,14 @@ mxf_dms1_processing_class_init (MXFDMS1ProcessingClass * klass) G_DEFINE_TYPE (MXFDMS1Project, mxf_dms1_project, MXF_TYPE_DMS1); static void -mxf_dms1_project_finalize (GstMiniObject * object) +mxf_dms1_project_finalize (GObject * object) { MXFDMS1Project *self = MXF_DMS1_PROJECT (object); g_free (self->project_name_or_title); self->project_name_or_title = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_project_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_project_parent_class)->finalize (object); } static gboolean @@ -5348,11 +5339,11 @@ mxf_dms1_project_init (MXFDMS1Project * self) static void mxf_dms1_project_class_init (MXFDMS1ProjectClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_project_finalize; + object_class->finalize = mxf_dms1_project_finalize; metadatabase_class->handle_tag = mxf_dms1_project_handle_tag; dm_class->type = 0x200200; } @@ -5360,7 +5351,7 @@ mxf_dms1_project_class_init (MXFDMS1ProjectClass * klass) G_DEFINE_TYPE (MXFDMS1ContactsList, mxf_dms1_contacts_list, MXF_TYPE_DMS1); static void -mxf_dms1_contacts_list_finalize (GstMiniObject * object) +mxf_dms1_contacts_list_finalize (GObject * object) { MXFDMS1ContactsList *self = MXF_DMS1_CONTACTS_LIST (object); @@ -5382,8 +5373,7 @@ mxf_dms1_contacts_list_finalize (GstMiniObject * object) g_free (self->location_sets); self->location_sets = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_contacts_list_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_dms1_contacts_list_parent_class)->finalize (object); } static gboolean @@ -5532,11 +5522,11 @@ mxf_dms1_contacts_list_init (MXFDMS1ContactsList * self) static void mxf_dms1_contacts_list_class_init (MXFDMS1ContactsListClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_contacts_list_finalize; + object_class->finalize = mxf_dms1_contacts_list_finalize; metadatabase_class->handle_tag = mxf_dms1_contacts_list_handle_tag; metadatabase_class->resolve = mxf_dms1_contacts_list_resolve; dm_class->type = 0x190100; @@ -5546,7 +5536,7 @@ G_DEFINE_TYPE (MXFDMS1CueWords, mxf_dms1_cue_words, MXF_TYPE_DMS1_TEXT_LANGUAGE); static void -mxf_dms1_cue_words_finalize (GstMiniObject * object) +mxf_dms1_cue_words_finalize (GObject * object) { MXFDMS1CueWords *self = MXF_DMS1_CUE_WORDS (object); @@ -5556,7 +5546,7 @@ mxf_dms1_cue_words_finalize (GstMiniObject * object) g_free (self->out_cue_words); self->out_cue_words = NULL; - GST_MINI_OBJECT_CLASS (mxf_dms1_cue_words_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_dms1_cue_words_parent_class)->finalize (object); } static gboolean @@ -5604,11 +5594,11 @@ mxf_dms1_cue_words_init (MXFDMS1CueWords * self) static void mxf_dms1_cue_words_class_init (MXFDMS1CueWordsClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass; MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass; - miniobject_class->finalize = mxf_dms1_cue_words_finalize; + object_class->finalize = mxf_dms1_cue_words_finalize; metadatabase_class->handle_tag = mxf_dms1_cue_words_handle_tag; dm_class->type = 0x170800; } diff --git a/gst/mxf/mxfdv-dif.c b/gst/mxf/mxfdv-dif.c index a239958d5..cf56c7fcc 100644 --- a/gst/mxf/mxfdv-dif.c +++ b/gst/mxf/mxfdv-dif.c @@ -175,14 +175,14 @@ mxf_dv_dif_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, MXFMetadataCDCIPictureEssenceDescriptor *ret; ret = (MXFMetadataCDCIPictureEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR, NULL); memcpy (&ret->parent.parent.essence_container, &dv_dif_essence_container_ul, 16); if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } *handler = mxf_dv_dif_write_func; diff --git a/gst/mxf/mxfjpeg2000.c b/gst/mxf/mxfjpeg2000.c index e9e947b3e..5ef7b843d 100644 --- a/gst/mxf/mxfjpeg2000.c +++ b/gst/mxf/mxfjpeg2000.c @@ -239,7 +239,7 @@ mxf_jpeg2000_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, } ret = (MXFMetadataRGBAPictureEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR, NULL); memcpy (&ret->parent.parent.essence_container, &jpeg2000_essence_container_ul, 16); @@ -270,7 +270,7 @@ mxf_jpeg2000_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c index ca05ad7ba..cf3ccb655 100644 --- a/gst/mxf/mxfmetadata.c +++ b/gst/mxf/mxfmetadata.c @@ -31,11 +31,10 @@ GST_DEBUG_CATEGORY_EXTERN (mxf_debug); #define GST_CAT_DEFAULT mxf_debug -G_DEFINE_ABSTRACT_TYPE (MXFMetadataBase, mxf_metadata_base, - GST_TYPE_MINI_OBJECT); +G_DEFINE_ABSTRACT_TYPE (MXFMetadataBase, mxf_metadata_base, G_TYPE_OBJECT); static void -mxf_metadata_base_finalize (GstMiniObject * object) +mxf_metadata_base_finalize (GObject * object) { MXFMetadataBase *self = MXF_METADATA_BASE (object); @@ -44,7 +43,7 @@ mxf_metadata_base_finalize (GstMiniObject * object) self->other_tags = NULL; } - GST_MINI_OBJECT_CLASS (mxf_metadata_base_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_metadata_base_parent_class)->finalize (object); } static gboolean @@ -131,9 +130,9 @@ mxf_metadata_base_init (MXFMetadataBase * self) static void mxf_metadata_base_class_init (MXFMetadataBaseClass * klass) { - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; - miniobject_class->finalize = mxf_metadata_base_finalize; + object_class->finalize = mxf_metadata_base_finalize; klass->handle_tag = mxf_metadata_base_handle_tag; klass->resolve = mxf_metadata_base_resolve_default; klass->to_structure = mxf_metadata_base_to_structure_default; @@ -490,7 +489,7 @@ mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset, ret = (MXFMetadata *) g_type_create_instance (t); if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) { GST_ERROR ("Parsing metadata failed"); - gst_mini_object_unref ((GstMiniObject *) ret); + g_object_unref (ret); return NULL; } @@ -501,7 +500,7 @@ mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset, G_DEFINE_TYPE (MXFMetadataPreface, mxf_metadata_preface, MXF_TYPE_METADATA); static void -mxf_metadata_preface_finalize (GstMiniObject * object) +mxf_metadata_preface_finalize (GObject * object) { MXFMetadataPreface *self = MXF_METADATA_PREFACE (object); @@ -517,7 +516,7 @@ mxf_metadata_preface_finalize (GstMiniObject * object) g_free (self->dm_schemes); self->dm_schemes = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_preface_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_metadata_preface_parent_class)->finalize (object); } static gboolean @@ -947,10 +946,10 @@ static void mxf_metadata_preface_class_init (MXFMetadataPrefaceClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_preface_finalize; + object_class->finalize = mxf_metadata_preface_finalize; metadata_base_class->handle_tag = mxf_metadata_preface_handle_tag; metadata_base_class->resolve = mxf_metadata_preface_resolve; metadata_base_class->to_structure = mxf_metadata_preface_to_structure; @@ -963,7 +962,7 @@ G_DEFINE_TYPE (MXFMetadataIdentification, mxf_metadata_identification, MXF_TYPE_METADATA); static void -mxf_metadata_identification_finalize (GstMiniObject * object) +mxf_metadata_identification_finalize (GObject * object) { MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (object); @@ -979,8 +978,7 @@ mxf_metadata_identification_finalize (GstMiniObject * object) g_free (self->platform); self->platform = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_identification_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_identification_parent_class)->finalize (object); } static gboolean @@ -1237,10 +1235,10 @@ static void mxf_metadata_identification_class_init (MXFMetadataIdentificationClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_identification_finalize; + object_class->finalize = mxf_metadata_identification_finalize; metadata_base_class->handle_tag = mxf_metadata_identification_handle_tag; metadata_base_class->name_quark = MXF_QUARK (IDENTIFICATION); metadata_base_class->to_structure = mxf_metadata_identification_to_structure; @@ -1252,7 +1250,7 @@ G_DEFINE_TYPE (MXFMetadataContentStorage, mxf_metadata_content_storage, MXF_TYPE_METADATA); static void -mxf_metadata_content_storage_finalize (GstMiniObject * object) +mxf_metadata_content_storage_finalize (GObject * object) { MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (object); @@ -1265,8 +1263,7 @@ mxf_metadata_content_storage_finalize (GstMiniObject * object) g_free (self->essence_container_data_uids); self->essence_container_data_uids = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_content_storage_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_content_storage_parent_class)->finalize (object); } static gboolean @@ -1532,10 +1529,10 @@ static void mxf_metadata_content_storage_class_init (MXFMetadataContentStorageClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_content_storage_finalize; + object_class->finalize = mxf_metadata_content_storage_finalize; metadata_base_class->handle_tag = mxf_metadata_content_storage_handle_tag; metadata_base_class->resolve = mxf_metadata_content_storage_resolve; metadata_base_class->name_quark = MXF_QUARK (CONTENT_STORAGE); @@ -1729,7 +1726,7 @@ G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericPackage, mxf_metadata_generic_package, MXF_TYPE_METADATA); static void -mxf_metadata_generic_package_finalize (GstMiniObject * object) +mxf_metadata_generic_package_finalize (GObject * object) { MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (object); @@ -1741,8 +1738,7 @@ mxf_metadata_generic_package_finalize (GstMiniObject * object) g_free (self->tracks); self->tracks = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_generic_package_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_generic_package_parent_class)->finalize (object); } static gboolean @@ -2001,9 +1997,9 @@ static void mxf_metadata_generic_package_class_init (MXFMetadataGenericPackageClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; - miniobject_class->finalize = mxf_metadata_generic_package_finalize; + object_class->finalize = mxf_metadata_generic_package_finalize; metadata_base_class->handle_tag = mxf_metadata_generic_package_handle_tag; metadata_base_class->resolve = mxf_metadata_generic_package_resolve; metadata_base_class->to_structure = mxf_metadata_generic_package_to_structure; @@ -2070,8 +2066,8 @@ mxf_metadata_material_package_resolve (MXFMetadataBase * m, MXFMetadataTimelineTrack *tmp; if (!sc->source_package->parent.tracks[k] || - !MXF_IS_METADATA_TIMELINE_TRACK (sc->source_package->parent. - tracks[k])) + !MXF_IS_METADATA_TIMELINE_TRACK (sc->source_package-> + parent.tracks[k])) continue; tmp = @@ -2324,7 +2320,7 @@ G_DEFINE_ABSTRACT_TYPE (MXFMetadataTrack, mxf_metadata_track, MXF_TYPE_METADATA); static void -mxf_metadata_track_finalize (GstMiniObject * object) +mxf_metadata_track_finalize (GObject * object) { MXFMetadataTrack *self = MXF_METADATA_TRACK (object); @@ -2333,7 +2329,7 @@ mxf_metadata_track_finalize (GstMiniObject * object) g_free (self->descriptor); self->descriptor = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_track_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_metadata_track_parent_class)->finalize (object); } static gboolean @@ -2515,9 +2511,9 @@ static void mxf_metadata_track_class_init (MXFMetadataTrackClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; - miniobject_class->finalize = mxf_metadata_track_finalize; + object_class->finalize = mxf_metadata_track_finalize; metadata_base_class->handle_tag = mxf_metadata_track_handle_tag; metadata_base_class->resolve = mxf_metadata_track_resolve; metadata_base_class->to_structure = mxf_metadata_track_to_structure; @@ -2805,7 +2801,7 @@ mxf_metadata_static_track_class_init (MXFMetadataStaticTrackClass * klass) G_DEFINE_TYPE (MXFMetadataSequence, mxf_metadata_sequence, MXF_TYPE_METADATA); static void -mxf_metadata_sequence_finalize (GstMiniObject * object) +mxf_metadata_sequence_finalize (GObject * object) { MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (object); @@ -2814,7 +2810,7 @@ mxf_metadata_sequence_finalize (GstMiniObject * object) g_free (self->structural_components); self->structural_components = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_sequence_parent_class)->finalize (object); + G_OBJECT_CLASS (mxf_metadata_sequence_parent_class)->finalize (object); } static gboolean @@ -3022,10 +3018,10 @@ static void mxf_metadata_sequence_class_init (MXFMetadataSequenceClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_sequence_finalize; + object_class->finalize = mxf_metadata_sequence_finalize; metadata_base_class->handle_tag = mxf_metadata_sequence_handle_tag; metadata_base_class->resolve = mxf_metadata_sequence_resolve; metadata_base_class->name_quark = MXF_QUARK (SEQUENCE); @@ -3434,15 +3430,14 @@ G_DEFINE_TYPE (MXFMetadataDMSourceClip, mxf_metadata_dm_source_clip, MXF_TYPE_METADATA_SOURCE_CLIP); static void -mxf_metadata_dm_source_clip_finalize (GstMiniObject * object) +mxf_metadata_dm_source_clip_finalize (GObject * object) { MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (object); g_free (self->track_ids); self->track_ids = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_dm_source_clip_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_dm_source_clip_parent_class)->finalize (object); } static gboolean @@ -3577,10 +3572,10 @@ static void mxf_metadata_dm_source_clip_class_init (MXFMetadataDMSourceClipClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_dm_source_clip_finalize; + object_class->finalize = mxf_metadata_dm_source_clip_finalize; metadata_base_class->handle_tag = mxf_metadata_dm_source_clip_handle_tag; metadata_base_class->name_quark = MXF_QUARK (DM_SOURCE_CLIP); metadata_base_class->to_structure = mxf_metadata_dm_source_clip_to_structure; @@ -3592,7 +3587,7 @@ G_DEFINE_TYPE (MXFMetadataDMSegment, mxf_metadata_dm_segment, MXF_TYPE_METADATA_STRUCTURAL_COMPONENT); static void -mxf_metadata_dm_segment_finalize (GstMiniObject * object) +mxf_metadata_dm_segment_finalize (GObject * object) { MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (object); @@ -3602,8 +3597,7 @@ mxf_metadata_dm_segment_finalize (GstMiniObject * object) g_free (self->event_comment); self->event_comment = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_dm_segment_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_dm_segment_parent_class)->finalize (object); } static gboolean @@ -3830,10 +3824,10 @@ static void mxf_metadata_dm_segment_class_init (MXFMetadataDMSegmentClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_dm_segment_finalize; + object_class->finalize = mxf_metadata_dm_segment_finalize; metadata_base_class->handle_tag = mxf_metadata_dm_segment_handle_tag; metadata_base_class->resolve = mxf_metadata_dm_segment_resolve; metadata_base_class->name_quark = MXF_QUARK (DM_SEGMENT); @@ -3846,7 +3840,7 @@ G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericDescriptor, mxf_metadata_generic_descriptor, MXF_TYPE_METADATA); static void -mxf_metadata_generic_descriptor_finalize (GstMiniObject * object) +mxf_metadata_generic_descriptor_finalize (GObject * object) { MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (object); @@ -3856,7 +3850,7 @@ mxf_metadata_generic_descriptor_finalize (GstMiniObject * object) g_free (self->locators); self->locators = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_generic_descriptor_parent_class)->finalize + G_OBJECT_CLASS (mxf_metadata_generic_descriptor_parent_class)->finalize (object); } @@ -4029,9 +4023,9 @@ mxf_metadata_generic_descriptor_class_init (MXFMetadataGenericDescriptorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; - miniobject_class->finalize = mxf_metadata_generic_descriptor_finalize; + object_class->finalize = mxf_metadata_generic_descriptor_finalize; metadata_base_class->handle_tag = mxf_metadata_generic_descriptor_handle_tag; metadata_base_class->resolve = mxf_metadata_generic_descriptor_resolve; metadata_base_class->to_structure = @@ -4401,8 +4395,8 @@ mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataBase * default: ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_generic_picture_essence_descriptor_parent_class)->handle_tag - (metadata, primer, tag, tag_data, tag_size); + (mxf_metadata_generic_picture_essence_descriptor_parent_class)-> + handle_tag (metadata, primer, tag, tag_data, tag_size); break; } @@ -4423,8 +4417,8 @@ mxf_metadata_generic_picture_essence_descriptor_to_structure (MXFMetadataBase * { GstStructure *ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_generic_picture_essence_descriptor_parent_class)->to_structure - (m); + (mxf_metadata_generic_picture_essence_descriptor_parent_class)-> + to_structure (m); MXFMetadataGenericPictureEssenceDescriptor *self = MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (m); gchar str[48]; @@ -5018,8 +5012,8 @@ mxf_metadata_generic_sound_essence_descriptor_handle_tag (MXFMetadataBase * default: ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_generic_sound_essence_descriptor_parent_class)->handle_tag - (metadata, primer, tag, tag_data, tag_size); + (mxf_metadata_generic_sound_essence_descriptor_parent_class)-> + handle_tag (metadata, primer, tag, tag_data, tag_size); break; } @@ -5339,8 +5333,8 @@ mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataBase * default: ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->handle_tag - (metadata, primer, tag, tag_data, tag_size); + (mxf_metadata_cdci_picture_essence_descriptor_parent_class)-> + handle_tag (metadata, primer, tag, tag_data, tag_size); break; } @@ -5561,7 +5555,7 @@ G_DEFINE_TYPE (MXFMetadataRGBAPictureEssenceDescriptor, MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR); static void -mxf_metadata_rgba_picture_essence_descriptor_finalize (GstMiniObject * object) +mxf_metadata_rgba_picture_essence_descriptor_finalize (GObject * object) { MXFMetadataRGBAPictureEssenceDescriptor *self = MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (object); @@ -5569,7 +5563,7 @@ mxf_metadata_rgba_picture_essence_descriptor_finalize (GstMiniObject * object) g_free (self->pixel_layout); self->pixel_layout = NULL; - GST_MINI_OBJECT_CLASS + G_OBJECT_CLASS (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->finalize (object); } @@ -5649,8 +5643,8 @@ mxf_metadata_rgba_picture_essence_descriptor_handle_tag (MXFMetadataBase * default: ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->handle_tag - (metadata, primer, tag, tag_data, tag_size); + (mxf_metadata_rgba_picture_essence_descriptor_parent_class)-> + handle_tag (metadata, primer, tag, tag_data, tag_size); break; } @@ -5804,10 +5798,10 @@ static void (MXFMetadataRGBAPictureEssenceDescriptorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = + object_class->finalize = mxf_metadata_rgba_picture_essence_descriptor_finalize; metadata_base_class->handle_tag = mxf_metadata_rgba_picture_essence_descriptor_handle_tag; @@ -5846,8 +5840,8 @@ mxf_metadata_generic_data_essence_descriptor_handle_tag (MXFMetadataBase * default: ret = MXF_METADATA_BASE_CLASS - (mxf_metadata_generic_data_essence_descriptor_parent_class)->handle_tag - (metadata, primer, tag, tag_data, tag_size); + (mxf_metadata_generic_data_essence_descriptor_parent_class)-> + handle_tag (metadata, primer, tag, tag_data, tag_size); break; } @@ -5936,7 +5930,7 @@ G_DEFINE_TYPE (MXFMetadataMultipleDescriptor, mxf_metadata_multiple_descriptor, MXF_TYPE_METADATA_FILE_DESCRIPTOR); static void -mxf_metadata_multiple_descriptor_finalize (GstMiniObject * object) +mxf_metadata_multiple_descriptor_finalize (GObject * object) { MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (object); @@ -5946,7 +5940,7 @@ mxf_metadata_multiple_descriptor_finalize (GstMiniObject * object) g_free (self->sub_descriptors); self->sub_descriptors = NULL; - GST_MINI_OBJECT_CLASS + G_OBJECT_CLASS (mxf_metadata_multiple_descriptor_parent_class)->finalize (object); } @@ -6119,10 +6113,10 @@ mxf_metadata_multiple_descriptor_class_init (MXFMetadataMultipleDescriptorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_multiple_descriptor_finalize; + object_class->finalize = mxf_metadata_multiple_descriptor_finalize; metadata_base_class->handle_tag = mxf_metadata_multiple_descriptor_handle_tag; metadata_base_class->resolve = mxf_metadata_multiple_descriptor_resolve; metadata_base_class->name_quark = MXF_QUARK (MULTIPLE_DESCRIPTOR); @@ -6149,15 +6143,14 @@ G_DEFINE_TYPE (MXFMetadataTextLocator, mxf_metadata_text_locator, MXF_TYPE_METADATA_LOCATOR); static void -mxf_metadata_text_locator_finalize (GstMiniObject * object) +mxf_metadata_text_locator_finalize (GObject * object) { MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (object); g_free (self->locator_name); self->locator_name = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_text_locator_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_text_locator_parent_class)->finalize (object); } static gboolean @@ -6229,10 +6222,10 @@ static void mxf_metadata_text_locator_class_init (MXFMetadataTextLocatorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_text_locator_finalize; + object_class->finalize = mxf_metadata_text_locator_finalize; metadata_base_class->handle_tag = mxf_metadata_text_locator_handle_tag; metadata_base_class->name_quark = MXF_QUARK (TEXT_LOCATOR); metadata_base_class->to_structure = mxf_metadata_text_locator_to_structure; @@ -6244,15 +6237,14 @@ G_DEFINE_TYPE (MXFMetadataNetworkLocator, mxf_metadata_network_locator, MXF_TYPE_METADATA_LOCATOR); static void -mxf_metadata_network_locator_finalize (GstMiniObject * object) +mxf_metadata_network_locator_finalize (GObject * object) { MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (object); g_free (self->url_string); self->url_string = NULL; - GST_MINI_OBJECT_CLASS (mxf_metadata_network_locator_parent_class)->finalize - (object); + G_OBJECT_CLASS (mxf_metadata_network_locator_parent_class)->finalize (object); } static gboolean @@ -6323,10 +6315,10 @@ static void mxf_metadata_network_locator_class_init (MXFMetadataNetworkLocatorClass * klass) { MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass; - GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass; + GObjectClass *object_class = (GObjectClass *) klass; MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass; - miniobject_class->finalize = mxf_metadata_network_locator_finalize; + object_class->finalize = mxf_metadata_network_locator_finalize; metadata_base_class->handle_tag = mxf_metadata_network_locator_handle_tag; metadata_base_class->name_quark = MXF_QUARK (NETWORK_LOCATOR); metadata_base_class->to_structure = mxf_metadata_network_locator_to_structure; @@ -6429,7 +6421,7 @@ mxf_descriptive_metadata_new (guint8 scheme, guint32 type, ret = (MXFDescriptiveMetadata *) g_type_create_instance (t); if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) { GST_ERROR ("Parsing metadata failed"); - gst_mini_object_unref ((GstMiniObject *) ret); + g_object_unref (ret); return NULL; } @@ -6471,5 +6463,5 @@ mxf_metadata_hash_table_new (void) { return g_hash_table_new_full ((GHashFunc) mxf_uuid_hash, (GEqualFunc) mxf_uuid_is_equal, (GDestroyNotify) NULL, - (GDestroyNotify) gst_mini_object_unref); + (GDestroyNotify) g_object_unref); } diff --git a/gst/mxf/mxfmetadata.h b/gst/mxf/mxfmetadata.h index b5e45b12b..2f32d98e0 100644 --- a/gst/mxf/mxfmetadata.h +++ b/gst/mxf/mxfmetadata.h @@ -368,7 +368,7 @@ typedef enum { } MXFMetadataBaseResolveState; struct _MXFMetadataBase { - GstMiniObject parent; + GObject parent; MXFUUID instance_uid; MXFUUID generation_uid; @@ -381,7 +381,7 @@ struct _MXFMetadataBase { }; struct _MXFMetadataBaseClass { - GstMiniObjectClass parent; + GObjectClass parent; gboolean (*handle_tag) (MXFMetadataBase *self, MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint tag_size); gboolean (*resolve) (MXFMetadataBase *self, GHashTable *metadata); @@ -739,7 +739,7 @@ struct _MXFDescriptiveMetadata { }; struct _MXFDescriptiveMetadataClass { - MXFMetadataBase parent; + MXFMetadataBaseClass parent; guint8 scheme; guint32 type; diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c index 08b1a27b8..f1b74f964 100644 --- a/gst/mxf/mxfmpeg.c +++ b/gst/mxf/mxfmpeg.c @@ -894,7 +894,7 @@ mxf_mpeg_audio_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, *mapping_data = md; ret = (MXFMetadataGenericSoundEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR, NULL); s = gst_caps_get_structure (caps, 0); if (strcmp (gst_structure_get_name (s), "audio/mpeg") == 0) { @@ -902,7 +902,7 @@ mxf_mpeg_audio_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!gst_structure_get_int (s, "mpegversion", &mpegversion)) { GST_ERROR ("Invalid caps %" GST_PTR_FORMAT, caps); - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -946,7 +946,7 @@ mxf_mpeg_audio_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!gst_structure_get_int (s, "rate", &rate)) { GST_ERROR ("Invalid rate"); - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } md->rate = rate; @@ -954,7 +954,7 @@ mxf_mpeg_audio_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, memcpy (&ret->parent.essence_container, &mpeg_essence_container_ul, 16); if (!mxf_metadata_generic_sound_essence_descriptor_from_caps (ret, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -1154,7 +1154,7 @@ mxf_mpeg_video_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, GstStructure *s; ret = (MXFMetadataMPEGVideoDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR, NULL); s = gst_caps_get_structure (caps, 0); @@ -1167,7 +1167,7 @@ mxf_mpeg_video_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!gst_structure_get_int (s, "mpegversion", &mpegversion)) { GST_ERROR ("Invalid caps %" GST_PTR_FORMAT, caps); - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -1214,7 +1214,7 @@ mxf_mpeg_video_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret-> parent.parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/mxf/mxfmux.c b/gst/mxf/mxfmux.c index a74387974..87f5dd569 100644 --- a/gst/mxf/mxfmux.c +++ b/gst/mxf/mxfmux.c @@ -65,7 +65,7 @@ static void gst_mxf_mux_set_property (GObject * object, static void gst_mxf_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstFlowReturn gst_mxf_mux_collected (GstCollectPads2 * pads, +static GstFlowReturn gst_mxf_mux_collected (GstCollectPads * pads, gpointer user_data); static gboolean gst_mxf_mux_handle_src_event (GstPad * pad, GstEvent * event); @@ -97,12 +97,13 @@ gst_mxf_mux_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); const GstPadTemplate **p; - gst_element_class_add_static_pad_template (element_class, &src_templ); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); p = mxf_essence_element_writer_get_pad_templates (); while (p && *p) { gst_element_class_add_pad_template (element_class, - (GstPadTemplate *) (GST_OBJECT (*p))); + (GstPadTemplate *) gst_object_ref (GST_OBJECT (*p))); p++; } @@ -476,7 +477,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) /* Preface */ mux->preface = - (MXFMetadataPreface *) gst_mini_object_new (MXF_TYPE_METADATA_PREFACE); + (MXFMetadataPreface *) g_object_new (MXF_TYPE_METADATA_PREFACE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (mux->preface)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -532,7 +533,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) mux->preface->identifications = g_new0 (MXFMetadataIdentification *, 1); identification = mux->preface->identifications[0] = (MXFMetadataIdentification *) - gst_mini_object_new (MXF_TYPE_METADATA_IDENTIFICATION); + g_object_new (MXF_TYPE_METADATA_IDENTIFICATION, NULL); mxf_uuid_init (&MXF_METADATA_BASE (identification)->instance_uid, mux->metadata); @@ -591,7 +592,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) guint i; cstorage = mux->preface->content_storage = (MXFMetadataContentStorage *) - gst_mini_object_new (MXF_TYPE_METADATA_CONTENT_STORAGE); + g_object_new (MXF_TYPE_METADATA_CONTENT_STORAGE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (cstorage)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, &MXF_METADATA_BASE (cstorage)->instance_uid, cstorage); @@ -605,7 +606,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) MXFMetadataSourcePackage *p; cstorage->packages[1] = (MXFMetadataGenericPackage *) - gst_mini_object_new (MXF_TYPE_METADATA_SOURCE_PACKAGE); + g_object_new (MXF_TYPE_METADATA_SOURCE_PACKAGE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (cstorage->packages[1])->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -629,7 +630,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) MXFMetadataMultipleDescriptor *d; p->descriptor = (MXFMetadataGenericDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR, NULL); d = (MXFMetadataMultipleDescriptor *) p->descriptor; d->n_sub_descriptors = p->parent.n_tracks; d->sub_descriptors = @@ -653,7 +654,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) MXFMetadataSourceClip *clip; p->parent.tracks[n] = (MXFMetadataTrack *) - gst_mini_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK); + g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL); track = (MXFMetadataTimelineTrack *) p->parent.tracks[n]; mxf_uuid_init (&MXF_METADATA_BASE (track)->instance_uid, mux->metadata); @@ -671,7 +672,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) cpad->collect.buffer, p, track, &track->edit_rate); sequence = track->parent.sequence = (MXFMetadataSequence *) - gst_mini_object_new (MXF_TYPE_METADATA_SEQUENCE); + g_object_new (MXF_TYPE_METADATA_SEQUENCE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (sequence)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -686,7 +687,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) g_new0 (MXFMetadataStructuralComponent *, 1); clip = (MXFMetadataSourceClip *) - gst_mini_object_new (MXF_TYPE_METADATA_SOURCE_CLIP); + g_object_new (MXF_TYPE_METADATA_SOURCE_CLIP, NULL); sequence->structural_components[0] = (MXFMetadataStructuralComponent *) clip; mxf_uuid_init (&MXF_METADATA_BASE (clip)->instance_uid, @@ -722,7 +723,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) gdouble min_edit_rate_d = G_MAXDOUBLE; cstorage->packages[0] = (MXFMetadataGenericPackage *) - gst_mini_object_new (MXF_TYPE_METADATA_MATERIAL_PACKAGE); + g_object_new (MXF_TYPE_METADATA_MATERIAL_PACKAGE, NULL); memcpy (&MXF_METADATA_BASE (cstorage->packages[0])->instance_uid, &mux->preface->primary_package_uid, 16); g_hash_table_insert (mux->metadata, @@ -761,7 +762,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) 1]); p->tracks[n] = (MXFMetadataTrack *) - gst_mini_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK); + g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL); track = (MXFMetadataTimelineTrack *) p->tracks[n]; mxf_uuid_init (&MXF_METADATA_BASE (track)->instance_uid, mux->metadata); @@ -796,7 +797,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) } sequence = track->parent.sequence = (MXFMetadataSequence *) - gst_mini_object_new (MXF_TYPE_METADATA_SEQUENCE); + g_object_new (MXF_TYPE_METADATA_SEQUENCE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (sequence)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -810,7 +811,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) g_new0 (MXFMetadataStructuralComponent *, 1); clip = (MXFMetadataSourceClip *) - gst_mini_object_new (MXF_TYPE_METADATA_SOURCE_CLIP); + g_object_new (MXF_TYPE_METADATA_SOURCE_CLIP, NULL); sequence->structural_components[0] = (MXFMetadataStructuralComponent *) clip; mxf_uuid_init (&MXF_METADATA_BASE (clip)->instance_uid, @@ -838,7 +839,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) MXFMetadataTimecodeComponent *component; p->tracks[n] = (MXFMetadataTrack *) - gst_mini_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK); + g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL); track = (MXFMetadataTimelineTrack *) p->tracks[n]; mxf_uuid_init (&MXF_METADATA_BASE (track)->instance_uid, mux->metadata); @@ -853,7 +854,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) memcpy (&track->edit_rate, &min_edit_rate, sizeof (MXFFraction)); sequence = track->parent.sequence = (MXFMetadataSequence *) - gst_mini_object_new (MXF_TYPE_METADATA_SEQUENCE); + g_object_new (MXF_TYPE_METADATA_SEQUENCE, NULL); mxf_uuid_init (&MXF_METADATA_BASE (sequence)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -869,7 +870,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) g_new0 (MXFMetadataStructuralComponent *, 1); component = (MXFMetadataTimecodeComponent *) - gst_mini_object_new (MXF_TYPE_METADATA_TIMECODE_COMPONENT); + g_object_new (MXF_TYPE_METADATA_TIMECODE_COMPONENT, NULL); sequence->structural_components[0] = (MXFMetadataStructuralComponent *) component; mxf_uuid_init (&MXF_METADATA_BASE (component)->instance_uid, @@ -927,9 +928,9 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) cstorage->essence_container_data = g_new0 (MXFMetadataEssenceContainerData *, 1); cstorage->essence_container_data[0] = (MXFMetadataEssenceContainerData *) - gst_mini_object_new (MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA); - mxf_uuid_init (&MXF_METADATA_BASE (cstorage-> - essence_container_data[0])->instance_uid, mux->metadata); + g_object_new (MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA, NULL); + mxf_uuid_init (&MXF_METADATA_BASE (cstorage->essence_container_data[0])-> + instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, &MXF_METADATA_BASE (cstorage->essence_container_data[0])->instance_uid, cstorage->essence_container_data[0]); diff --git a/gst/mxf/mxfup.c b/gst/mxf/mxfup.c index 7d0172584..cbe7af9c1 100644 --- a/gst/mxf/mxfup.c +++ b/gst/mxf/mxfup.c @@ -404,7 +404,7 @@ mxf_up_get_rgba_descriptor (GstPadTemplate * tmpl, GstCaps * caps, *mapping_data = md; ret = (MXFMetadataRGBAPictureEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR, NULL); for (i = 0; i < G_N_ELEMENTS (_rgba_mapping_table); i++) { tmp = gst_caps_from_string (_rgba_mapping_table[i].caps); @@ -426,7 +426,7 @@ mxf_up_get_rgba_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (md->fourcc == 0) { GST_ERROR ("Invalid caps %" GST_PTR_FORMAT, caps); - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -435,7 +435,7 @@ mxf_up_get_rgba_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -459,7 +459,7 @@ mxf_up_get_cdci_descriptor (GstPadTemplate * tmpl, GstCaps * caps, *mapping_data = md; ret = (MXFMetadataCDCIPictureEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR, NULL); for (i = 0; i < G_N_ELEMENTS (_cdci_mapping_table); i++) { tmp = gst_caps_from_string (_cdci_mapping_table[i].caps); @@ -481,7 +481,7 @@ mxf_up_get_cdci_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (md->fourcc == 0) { GST_ERROR ("Invalid caps %" GST_PTR_FORMAT, caps); - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } @@ -489,7 +489,7 @@ mxf_up_get_cdci_descriptor (GstPadTemplate * tmpl, GstCaps * caps, if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/mxf/mxfvc3.c b/gst/mxf/mxfvc3.c index e4136d17c..b8cb6ecde 100644 --- a/gst/mxf/mxfvc3.c +++ b/gst/mxf/mxfvc3.c @@ -185,13 +185,13 @@ mxf_vc3_get_descriptor (GstPadTemplate * tmpl, GstCaps * caps, } ret = (MXFMetadataCDCIPictureEssenceDescriptor *) - gst_mini_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR); + g_object_new (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR, NULL); memcpy (&ret->parent.parent.essence_container, &vc3_essence_container_ul, 16); if (!mxf_metadata_generic_picture_essence_descriptor_from_caps (&ret->parent, caps)) { - gst_mini_object_unref (GST_MINI_OBJECT_CAST (ret)); + g_object_unref (ret); return NULL; } diff --git a/gst/nsf/gstnsf.c b/gst/nsf/gstnsf.c index d92897167..63ab00141 100644 --- a/gst/nsf/gstnsf.c +++ b/gst/nsf/gstnsf.c @@ -141,8 +141,10 @@ gst_nsfdec_base_init (gpointer g_class) "Using nosefart to decode NSF audio tunes", "Johan Dahlin <johan@gnome.org>"); - gst_element_class_add_static_pad_template (element_class, &src_templ); - gst_element_class_add_static_pad_template (element_class, &sink_templ); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_templ)); } static void diff --git a/gst/nuvdemux/gstnuvdemux.c b/gst/nuvdemux/gstnuvdemux.c index 86418f069..3401c8157 100644 --- a/gst/nuvdemux/gstnuvdemux.c +++ b/gst/nuvdemux/gstnuvdemux.c @@ -124,14 +124,14 @@ gst_nuv_demux_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &audio_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&audio_src_template)); - gst_element_class_add_static_pad_template (element_class, - &video_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&video_src_template)); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "Nuv demuxer", "Codec/Demuxer", "Demultiplex a MythTV NuppleVideo .nuv file into audio and video", diff --git a/gst/overlay/gstoverlay.c b/gst/overlay/gstoverlay.c index d802491c9..c900a6bd9 100644 --- a/gst/overlay/gstoverlay.c +++ b/gst/overlay/gstoverlay.c @@ -110,14 +110,14 @@ gst_overlay_base_init (GstOverlayClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &overlay_sink1_factory); - gst_element_class_add_static_pad_template (element_class, - &overlay_sink2_factory); - gst_element_class_add_static_pad_template (element_class, - &overlay_sink3_factory); - gst_element_class_add_static_pad_template (element_class, - &overlay_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&overlay_sink1_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&overlay_sink2_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&overlay_sink3_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&overlay_src_factory)); gst_element_class_set_details_simple (element_class, "Video overlay", "Filter/Editor/Video", "Overlay multiple video streams", "David Schleef <ds@schleef.org>"); diff --git a/gst/patchdetect/gstpatchdetect.c b/gst/patchdetect/gstpatchdetect.c index 8926a5987..af4d88319 100644 --- a/gst/patchdetect/gstpatchdetect.c +++ b/gst/patchdetect/gstpatchdetect.c @@ -109,10 +109,10 @@ gst_patchdetect_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_patchdetect_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_patchdetect_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_patchdetect_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_patchdetect_src_template)); gst_element_class_set_details_simple (element_class, "Color Patch Detector", "Video/Analysis", "Detects color patches from a color calibration chart", diff --git a/gst/pcapparse/gstirtspparse.c b/gst/pcapparse/gstirtspparse.c index 0beed3603..26317e622 100644 --- a/gst/pcapparse/gstirtspparse.c +++ b/gst/pcapparse/gstirtspparse.c @@ -88,9 +88,10 @@ gst_irtsp_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "IRTSPParse", "Raw/Parser", diff --git a/gst/pcapparse/gstpcapparse.c b/gst/pcapparse/gstpcapparse.c index ae7fd5f24..16eb58c5a 100644 --- a/gst/pcapparse/gstpcapparse.c +++ b/gst/pcapparse/gstpcapparse.c @@ -99,9 +99,10 @@ gst_pcap_parse_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - 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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "PCapParse", "Raw/Parser", diff --git a/gst/pnm/gstpnmdec.c b/gst/pnm/gstpnmdec.c index aef4526ac..394e86d12 100644 --- a/gst/pnm/gstpnmdec.c +++ b/gst/pnm/gstpnmdec.c @@ -308,10 +308,10 @@ gst_pnmdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_pnmdec_sink_pad_template); - gst_element_class_add_static_pad_template (element_class, - &gst_pnmdec_src_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_pnmdec_sink_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_pnmdec_src_pad_template)); gst_element_class_set_details_simple (element_class, "PNM image decoder", "Codec/Decoder/Image", "Decodes images in portable pixmap/graymap/bitmap/anymamp (PNM) format", diff --git a/gst/pnm/gstpnmenc.c b/gst/pnm/gstpnmenc.c index 7036cbdbf..53bd4a3ff 100644 --- a/gst/pnm/gstpnmenc.c +++ b/gst/pnm/gstpnmenc.c @@ -231,10 +231,10 @@ gst_pnmenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &sink_pad_template); - gst_element_class_add_static_pad_template (element_class, - &src_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_pad_template)); gst_element_class_set_details_simple (element_class, "PNM image encoder", "Codec/Encoder/Image", "Encodes images into portable pixmap or graymap (PNM) format", diff --git a/gst/rawparse/gstrawparse.c b/gst/rawparse/gstrawparse.c index cf0f5d009..59a3093f8 100644 --- a/gst/rawparse/gstrawparse.c +++ b/gst/rawparse/gstrawparse.c @@ -75,8 +75,8 @@ gst_raw_parse_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (gst_raw_parse_debug, "rawparse", 0, "rawparse element"); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_raw_parse_sink_pad_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_raw_parse_sink_pad_template)); } static void @@ -154,17 +154,14 @@ gst_raw_parse_class_set_src_pad_template (GstRawParseClass * klass, const GstCaps * allowed_caps) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstPadTemplate *pad_template; g_return_if_fail (GST_IS_RAW_PARSE_CLASS (klass)); g_return_if_fail (allowed_caps != NULL); g_return_if_fail (GST_IS_CAPS (allowed_caps)); - pad_template = + gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_caps_copy (allowed_caps)); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); + gst_caps_copy (allowed_caps))); } void @@ -439,10 +436,10 @@ static gboolean gst_raw_parse_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) { - GST_RAW_PARSE (GST_PAD_PARENT (sinkpad))->mode = GST_ACTIVATE_PULL; + GST_RAW_PARSE (GST_PAD_PARENT (sinkpad))->mode = GST_PAD_ACTIVATE_PULL; return gst_pad_activate_pull (sinkpad, TRUE); } else { - GST_RAW_PARSE (GST_PAD_PARENT (sinkpad))->mode = GST_ACTIVATE_PUSH; + GST_RAW_PARSE (GST_PAD_PARENT (sinkpad))->mode = GST_PAD_ACTIVATE_PUSH; return gst_pad_activate_push (sinkpad, TRUE); } } @@ -890,7 +887,7 @@ gst_raw_parse_src_event (GstPad * pad, GstEvent * event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: - if (rp->mode == GST_ACTIVATE_PUSH) + if (rp->mode == GST_PAD_ACTIVATE_PUSH) ret = gst_raw_parse_handle_seek_push (rp, event); else ret = gst_raw_parse_handle_seek_pull (rp, event); @@ -999,7 +996,7 @@ gst_raw_parse_src_query (GstPad * pad, GstQuery * query) if (fmt != GST_FORMAT_TIME && fmt != GST_FORMAT_DEFAULT && fmt != GST_FORMAT_BYTES) { gst_query_set_seeking (query, fmt, FALSE, -1, -1); - } else if (rp->mode == GST_ACTIVATE_PUSH) { + } else if (rp->mode == GST_PAD_ACTIVATE_PUSH) { GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES); gboolean seekable; diff --git a/gst/rawparse/gstrawparse.h b/gst/rawparse/gstrawparse.h index 0a2c01b33..53862b02b 100644 --- a/gst/rawparse/gstrawparse.h +++ b/gst/rawparse/gstrawparse.h @@ -52,7 +52,7 @@ struct _GstRawParse GstPad *sinkpad; GstPad *srcpad; - GstActivateMode mode; + GstPadActivateMode mode; GstAdapter *adapter; gint framesize; diff --git a/gst/real/gstrealaudiodec.c b/gst/real/gstrealaudiodec.c index b6f620133..f5aa972a0 100644 --- a/gst/real/gstrealaudiodec.c +++ b/gst/real/gstrealaudiodec.c @@ -560,8 +560,8 @@ gst_real_audio_dec_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (ec, &snk_t); - gst_element_class_add_static_pad_template (ec, &src_t); + gst_element_class_add_pad_template (ec, gst_static_pad_template_get (&snk_t)); + gst_element_class_add_pad_template (ec, gst_static_pad_template_get (&src_t)); gst_element_class_set_details_simple (ec, "RealAudio decoder", "Codec/Decoder/Audio", "Decoder for RealAudio streams", "Lutz Mueller <lutz@topfrose.de>"); diff --git a/gst/real/gstrealvideodec.c b/gst/real/gstrealvideodec.c index 142b1ce6d..23bef182c 100644 --- a/gst/real/gstrealvideodec.c +++ b/gst/real/gstrealvideodec.c @@ -627,8 +627,8 @@ gst_real_video_dec_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (ec, &snk_t); - gst_element_class_add_static_pad_template (ec, &src_t); + gst_element_class_add_pad_template (ec, gst_static_pad_template_get (&snk_t)); + gst_element_class_add_pad_template (ec, gst_static_pad_template_get (&src_t)); gst_element_class_set_details_simple (ec, "RealVideo decoder", "Codec/Decoder/Video", "Decoder for RealVideo streams", "Lutz Mueller <lutz@topfrose.de>"); diff --git a/gst/removesilence/gstremovesilence.c b/gst/removesilence/gstremovesilence.c index 9f5f69902..edb9af3ab 100644 --- a/gst/removesilence/gstremovesilence.c +++ b/gst/removesilence/gstremovesilence.c @@ -109,9 +109,10 @@ gst_remove_silence_base_init (gpointer gclass) "Tiago Katcipis <tiagokatcipis@gmail.com>\n \ Paulo Pizarro <paulo.pizarro@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } /* initialize the removesilence's class */ diff --git a/gst/rtpmux/gstrtpdtmfmux.c b/gst/rtpmux/gstrtpdtmfmux.c index 23de0a229..5e6d04145 100644 --- a/gst/rtpmux/gstrtpdtmfmux.c +++ b/gst/rtpmux/gstrtpdtmfmux.c @@ -31,8 +31,8 @@ * * The RTP "DTMF" Muxer muxes multiple RTP streams into a valid RTP * stream. It does exactly what it's parent (#rtpmux) does, except - * that it prevent buffers coming over a regular sink_%%d pad from going through - * for the duration of buffers that came in a priority_sink_%%d pad. + * that it prevent buffers coming over a regular sink_%%u pad from going through + * for the duration of buffers that came in a priority_sink_%%u pad. * * This is especially useful if a discontinuous source like dtmfsrc or * rtpdtmfsrc are connected to the priority sink pads. This way, the generated @@ -52,7 +52,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_rtp_dtmf_mux_debug); #define GST_CAT_DEFAULT gst_rtp_dtmf_mux_debug static GstStaticPadTemplate priority_sink_factory = -GST_STATIC_PAD_TEMPLATE ("priority_sink_%d", +GST_STATIC_PAD_TEMPLATE ("priority_sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp")); @@ -79,8 +79,8 @@ gst_rtp_dtmf_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &priority_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&priority_sink_factory)); gst_element_class_set_details_simple (element_class, "RTP muxer", "Codec/Muxer", @@ -168,7 +168,7 @@ gst_rtp_dtmf_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, padpriv = gst_pad_get_element_private (pad); if (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (element), - "priority_sink_%d") == gst_pad_get_pad_template (pad)) + "priority_sink_%u") == gst_pad_get_pad_template (pad)) padpriv->priority = TRUE; GST_OBJECT_UNLOCK (element); } diff --git a/gst/rtpmux/gstrtpmux.c b/gst/rtpmux/gstrtpmux.c index 97cb3f878..6bc9a4dc7 100644 --- a/gst/rtpmux/gstrtpmux.c +++ b/gst/rtpmux/gstrtpmux.c @@ -82,7 +82,7 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("application/x-rtp") ); -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") @@ -107,7 +107,7 @@ static void gst_rtp_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_mux_dispose (GObject * object); -static gboolean gst_rtp_mux_src_event_real (GstRTPMux *rtp_mux, +static gboolean gst_rtp_mux_src_event_real (GstRTPMux * rtp_mux, GstEvent * event); GST_BOILERPLATE (GstRTPMux, gst_rtp_mux, GstElement, GST_TYPE_ELEMENT); @@ -117,8 +117,10 @@ gst_rtp_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "RTP muxer", "Codec/Muxer", @@ -202,7 +204,7 @@ gst_rtp_mux_src_event (GstPad * pad, GstEvent * event) } static gboolean -gst_rtp_mux_src_event_real (GstRTPMux *rtp_mux, GstEvent * event) +gst_rtp_mux_src_event_real (GstRTPMux * rtp_mux, GstEvent * event) { GstIterator *iter; GstPad *sinkpad; diff --git a/gst/rtpvp8/gstrtpvp8.c b/gst/rtpvp8/gstrtpvp8.c index baafd1fd3..e27db1879 100644 --- a/gst/rtpvp8/gstrtpvp8.c +++ b/gst/rtpvp8/gstrtpvp8.c @@ -6,7 +6,7 @@ #include "gstrtpvp8depay.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { gst_rtp_vp8_depay_plugin_init (plugin); gst_rtp_vp8_pay_plugin_init (plugin); diff --git a/gst/rtpvp8/gstrtpvp8depay.c b/gst/rtpvp8/gstrtpvp8depay.c index 74d13b5ae..81fa5cc94 100644 --- a/gst/rtpvp8/gstrtpvp8depay.c +++ b/gst/rtpvp8/gstrtpvp8depay.c @@ -66,10 +66,10 @@ gst_rtp_vp8_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_vp8_depay_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_vp8_depay_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_vp8_depay_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_vp8_depay_src_template)); gst_element_class_set_details_simple (element_class, "RTP VP8 depayloader", "Codec/Depayloader/Network/RTP", diff --git a/gst/rtpvp8/gstrtpvp8pay.c b/gst/rtpvp8/gstrtpvp8pay.c index 82dceeb12..fc4844b22 100644 --- a/gst/rtpvp8/gstrtpvp8pay.c +++ b/gst/rtpvp8/gstrtpvp8pay.c @@ -74,10 +74,10 @@ gst_rtp_vp8_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_vp8_pay_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_rtp_vp8_pay_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_vp8_pay_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_rtp_vp8_pay_src_template)); gst_element_class_set_details_simple (element_class, "RTP VP8 payloader", "Codec/Payloader/Network/RTP", diff --git a/gst/scaletempo/gstscaletempo.c b/gst/scaletempo/gstscaletempo.c index 9edc03edb..a057321f4 100644 --- a/gst/scaletempo/gstscaletempo.c +++ b/gst/scaletempo/gstscaletempo.c @@ -682,9 +682,10 @@ gst_scaletempo_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "Scaletempo", "Filter/Effect/Rate", "Sync audio tempo with playback rate", diff --git a/gst/sdi/gstsdidemux.c b/gst/sdi/gstsdidemux.c index 968525aec..36b54f0ea 100644 --- a/gst/sdi/gstsdidemux.c +++ b/gst/sdi/gstsdidemux.c @@ -105,10 +105,10 @@ gst_sdi_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_sdi_demux_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_sdi_demux_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_sdi_demux_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_sdi_demux_sink_template)); gst_element_class_set_details_simple (element_class, "SDI Demuxer", diff --git a/gst/sdi/gstsdimux.c b/gst/sdi/gstsdimux.c index 02532273a..d7d490bd3 100644 --- a/gst/sdi/gstsdimux.c +++ b/gst/sdi/gstsdimux.c @@ -108,10 +108,10 @@ gst_sdi_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_sdi_mux_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_sdi_mux_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_sdi_mux_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_sdi_mux_sink_template)); gst_element_class_set_details_simple (element_class, "SDI Muxer", "Muxer", diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c index 9254dbcf1..f757241dd 100644 --- a/gst/sdp/gstsdpdemux.c +++ b/gst/sdp/gstsdpdemux.c @@ -20,7 +20,7 @@ * SECTION:element-sdpdemux * * sdpdemux currently understands SDP as the input format of the session description. - * For each stream listed in the SDP a new rtp_stream%d pad will be created + * For each stream listed in the SDP a new stream_%u pad will be created * with caps derived from the SDP media description. This is a caps of mime type * "application/x-rtp" that can be connected to any available RTP depayloader * element. @@ -89,7 +89,7 @@ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/sdp")); -static GstStaticPadTemplate rtptemplate = GST_STATIC_PAD_TEMPLATE ("stream%d", +static GstStaticPadTemplate rtptemplate = GST_STATIC_PAD_TEMPLATE ("stream_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp")); @@ -132,34 +132,15 @@ static void gst_sdp_demux_handle_message (GstBin * bin, GstMessage * message); static void gst_sdp_demux_stream_push_event (GstSDPDemux * demux, GstSDPStream * stream, GstEvent * event); -static gboolean gst_sdp_demux_sink_event (GstPad * pad, GstEvent * event); -static GstFlowReturn gst_sdp_demux_sink_chain (GstPad * pad, +static gboolean gst_sdp_demux_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static GstFlowReturn gst_sdp_demux_sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer); /*static guint gst_sdp_demux_signals[LAST_SIGNAL] = { 0 }; */ -static void -_do_init (GType sdp_demux_type) -{ - GST_DEBUG_CATEGORY_INIT (sdpdemux_debug, "sdpdemux", 0, "SDP demux"); -} - -GST_BOILERPLATE_FULL (GstSDPDemux, gst_sdp_demux, GstBin, GST_TYPE_BIN, - _do_init); - -static void -gst_sdp_demux_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, &sinktemplate); - gst_element_class_add_static_pad_template (element_class, &rtptemplate); - - gst_element_class_set_details_simple (element_class, "SDP session setup", - "Codec/Demuxer/Network/RTP", - "Receive data over the network via SDP", - "Wim Taymans <wim.taymans@gmail.com>"); -} +#define gst_sdp_demux_parent_class parent_class +G_DEFINE_TYPE (GstSDPDemux, gst_sdp_demux, GST_TYPE_BIN); static void gst_sdp_demux_class_init (GstSDPDemuxClass * klass) @@ -200,13 +181,25 @@ gst_sdp_demux_class_init (GstSDPDemuxClass * klass) DEFAULT_REDIRECT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtptemplate)); + + gst_element_class_set_details_simple (gstelement_class, "SDP session setup", + "Codec/Demuxer/Network/RTP", + "Receive data over the network via SDP", + "Wim Taymans <wim.taymans@gmail.com>"); + gstelement_class->change_state = gst_sdp_demux_change_state; gstbin_class->handle_message = gst_sdp_demux_handle_message; + + GST_DEBUG_CATEGORY_INIT (sdpdemux_debug, "sdpdemux", 0, "SDP demux"); } static void -gst_sdp_demux_init (GstSDPDemux * demux, GstSDPDemuxClass * g_class) +gst_sdp_demux_init (GstSDPDemux * demux) { demux->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); gst_pad_set_event_function (demux->sinkpad, @@ -395,12 +388,12 @@ is_multicast_address (const gchar * host_name) for (ai = res; !ret && ai; ai = ai->ai_next) { if (ai->ai_family == AF_INET) ret = - IN_MULTICAST (ntohl (((struct sockaddr_in *) ai->ai_addr)-> - sin_addr.s_addr)); + IN_MULTICAST (ntohl (((struct sockaddr_in *) ai->ai_addr)->sin_addr. + s_addr)); else ret = - IN6_IS_ADDR_MULTICAST (&((struct sockaddr_in6 *) ai-> - ai_addr)->sin6_addr); + IN6_IS_ADDR_MULTICAST (&((struct sockaddr_in6 *) ai->ai_addr)-> + sin6_addr); } freeaddrinfo (res); @@ -763,7 +756,7 @@ new_session_pad (GstElement * session, GstPad * pad, GstSDPDemux * demux) GST_SDP_STREAM_LOCK (demux); /* find stream */ name = gst_object_get_name (GST_OBJECT_CAST (pad)); - if (sscanf (name, "recv_rtp_src_%d_%d_%d", &id, &ssrc, &pt) != 3) + if (sscanf (name, "recv_rtp_src_%u_%u_%u", &id, &ssrc, &pt) != 3) goto unknown_stream; GST_DEBUG_OBJECT (demux, "stream: %u, SSRC %d, PT %d", id, ssrc, pt); @@ -944,7 +937,7 @@ gst_sdp_demux_configure_manager (GstSDPDemux * demux, char *rtsp_sdp) g_signal_connect (demux->session, "no-more-pads", (GCallback) rtsp_session_no_more_pads, demux); } else { - if (!(demux->session = gst_element_factory_make ("gstrtpbin", NULL))) + if (!(demux->session = gst_element_factory_make ("rtpbin", NULL))) goto manager_failed; /* connect to signals if we did not already do so */ @@ -1025,7 +1018,7 @@ gst_sdp_demux_stream_configure_udp (GstSDPDemux * demux, GstSDPStream * stream) /* get output pad of the UDP source. */ pad = gst_element_get_static_pad (stream->udpsrc[0], "src"); - name = g_strdup_printf ("recv_rtp_sink_%d", stream->id); + name = g_strdup_printf ("recv_rtp_sink_%u", stream->id); stream->channelpad[0] = gst_element_get_request_pad (demux->session, name); g_free (name); @@ -1054,7 +1047,7 @@ gst_sdp_demux_stream_configure_udp (GstSDPDemux * demux, GstSDPStream * stream) GST_DEBUG_OBJECT (demux, "connecting RTCP source to manager"); - name = g_strdup_printf ("recv_rtcp_sink_%d", stream->id); + name = g_strdup_printf ("recv_rtcp_sink_%u", stream->id); stream->channelpad[1] = gst_element_get_request_pad (demux->session, name); g_free (name); @@ -1128,7 +1121,7 @@ gst_sdp_demux_stream_configure_udp_sink (GstSDPDemux * demux, gst_bin_add (GST_BIN_CAST (demux), stream->udpsink); /* get session RTCP pad */ - name = g_strdup_printf ("send_rtcp_src_%d", stream->id); + name = g_strdup_printf ("send_rtcp_src_%u", stream->id); pad = gst_element_get_request_pad (demux->session, name); g_free (name); @@ -1479,12 +1472,12 @@ start_session_failure: } static gboolean -gst_sdp_demux_sink_event (GstPad * pad, GstEvent * event) +gst_sdp_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstSDPDemux *demux; gboolean res = TRUE; - demux = GST_SDP_DEMUX (gst_pad_get_parent (pad)); + demux = GST_SDP_DEMUX (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: @@ -1496,24 +1489,21 @@ gst_sdp_demux_sink_event (GstPad * pad, GstEvent * event) gst_event_unref (event); break; } - gst_object_unref (demux); return res; } static GstFlowReturn -gst_sdp_demux_sink_chain (GstPad * pad, GstBuffer * buffer) +gst_sdp_demux_sink_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstSDPDemux *demux; - demux = GST_SDP_DEMUX (gst_pad_get_parent (pad)); + demux = GST_SDP_DEMUX (parent); /* push the SDP message in an adapter, we start doing something with it when * we receive EOS */ gst_adapter_push (demux->adapter, buffer); - gst_object_unref (demux); - return GST_FLOW_OK; } diff --git a/gst/segmentclip/gstaudiosegmentclip.c b/gst/segmentclip/gstaudiosegmentclip.c index a3fc81107..93602c5d2 100644 --- a/gst/segmentclip/gstaudiosegmentclip.c +++ b/gst/segmentclip/gstaudiosegmentclip.c @@ -59,10 +59,10 @@ gst_audio_segment_clip_base_init (gpointer g_class) "Clips audio buffers to the configured segment", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - gst_element_class_add_static_pad_template (element_class, - &sink_pad_template); - gst_element_class_add_static_pad_template (element_class, - &src_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_pad_template)); } static void diff --git a/gst/segmentclip/gstvideosegmentclip.c b/gst/segmentclip/gstvideosegmentclip.c index f160e728a..16a948e7f 100644 --- a/gst/segmentclip/gstvideosegmentclip.c +++ b/gst/segmentclip/gstvideosegmentclip.c @@ -64,10 +64,10 @@ gst_video_segment_clip_base_init (gpointer g_class) "Clips video buffers to the configured segment", "Sebastian Dröge <sebastian.droege@collabora.co.uk>"); - gst_element_class_add_static_pad_template (element_class, - &sink_pad_template); - gst_element_class_add_static_pad_template (element_class, - &src_pad_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_pad_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_pad_template)); } static void diff --git a/gst/siren/gstsirendec.c b/gst/siren/gstsirendec.c index 6325c9670..2e517199f 100644 --- a/gst/siren/gstsirendec.c +++ b/gst/siren/gstsirendec.c @@ -92,8 +92,10 @@ gst_siren_dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &srctemplate); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Siren Decoder element", "Codec/Decoder/Audio ", diff --git a/gst/siren/gstsirenenc.c b/gst/siren/gstsirenenc.c index b201e18b2..561d2689d 100644 --- a/gst/siren/gstsirenenc.c +++ b/gst/siren/gstsirenenc.c @@ -95,8 +95,10 @@ gst_siren_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &srctemplate); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Siren Encoder element", "Codec/Encoder/Audio ", diff --git a/gst/smooth/gstsmooth.c b/gst/smooth/gstsmooth.c index 5a254adc2..2ac87d6fc 100644 --- a/gst/smooth/gstsmooth.c +++ b/gst/smooth/gstsmooth.c @@ -74,10 +74,10 @@ gst_smooth_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_smooth_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_smooth_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smooth_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smooth_src_template)); gst_element_class_set_details_simple (element_class, "Smooth effect", "Filter/Effect/Video", "Apply a smooth filter to an image", diff --git a/gst/speed/gstspeed.c b/gst/speed/gstspeed.c index 5a029fb76..82c816a63 100644 --- a/gst/speed/gstspeed.c +++ b/gst/speed/gstspeed.c @@ -461,10 +461,10 @@ speed_base_init (gpointer g_class) "Andy Wingo <apwingo@eos.ncsu.edu>, " "Tim-Philipp Müller <tim@centricular.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_speed_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_speed_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_speed_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_speed_sink_template)); } static void diff --git a/gst/stereo/Makefile.am b/gst/stereo/Makefile.am index ee5b5dca4..2efe4a6a4 100644 --- a/gst/stereo/Makefile.am +++ b/gst/stereo/Makefile.am @@ -2,8 +2,8 @@ plugin_LTLIBRARIES = libgststereo.la libgststereo_la_SOURCES = gststereo.c -libgststereo_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) -libgststereo_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) +libgststereo_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +libgststereo_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) libgststereo_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgststereo_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/stereo/gststereo.c b/gst/stereo/gststereo.c index db054c4f3..8b45e583c 100644 --- a/gst/stereo/gststereo.c +++ b/gst/stereo/gststereo.c @@ -145,7 +145,7 @@ gst_stereo_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) return GST_FLOW_OK; if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf))) - gst_object_sync_values (G_OBJECT (stereo), GST_BUFFER_TIMESTAMP (outbuf)); + gst_object_sync_values (GST_OBJECT (stereo), GST_BUFFER_TIMESTAMP (outbuf)); if (stereo->active) { for (i = 0; i < samples / 2; i += 2) { diff --git a/gst/subenc/Makefile.am b/gst/subenc/Makefile.am index f5095c238..b9e20dfe8 100644 --- a/gst/subenc/Makefile.am +++ b/gst/subenc/Makefile.am @@ -4,8 +4,8 @@ libgstsubenc_la_SOURCES = \ gstsrtenc.c \ gstsubenc.c \ gstwebvttenc.c -libgstsubenc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) -libgstsubenc_la_LIBADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) +libgstsubenc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstsubenc_la_LIBADD = $(GST_BASE_LIBS) libgstsubenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsubenc_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/subenc/gstsrtenc.c b/gst/subenc/gstsrtenc.c index a06bce1c5..a7c6ded65 100644 --- a/gst/subenc/gstsrtenc.c +++ b/gst/subenc/gstsrtenc.c @@ -100,7 +100,7 @@ gst_srt_enc_chain (GstPad * pad, GstBuffer * buf) gchar *string; srtenc = GST_SRT_ENC (gst_pad_get_parent_element (pad)); - gst_object_sync_values (G_OBJECT (srtenc), GST_BUFFER_TIMESTAMP (buf)); + gst_object_sync_values (GST_OBJECT (srtenc), GST_BUFFER_TIMESTAMP (buf)); timing = gst_srt_enc_timeconvertion (srtenc, buf); string = g_strdup_printf ("%d\n%s", srtenc->counter++, timing); g_free (timing); @@ -123,9 +123,10 @@ gst_srt_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Srt encoder", "Codec/Encoder/Subtitle", diff --git a/gst/subenc/gstwebvttenc.c b/gst/subenc/gstwebvttenc.c index 9da281dc4..a38aebd12 100644 --- a/gst/subenc/gstwebvttenc.c +++ b/gst/subenc/gstwebvttenc.c @@ -127,7 +127,7 @@ gst_webvtt_enc_chain (GstPad * pad, GstBuffer * buf) webvttenc->pushed_header = TRUE; } - gst_object_sync_values (G_OBJECT (webvttenc), GST_BUFFER_TIMESTAMP (buf)); + gst_object_sync_values (GST_OBJECT (webvttenc), GST_BUFFER_TIMESTAMP (buf)); timing = gst_webvtt_enc_timeconvertion (webvttenc, buf); new_buffer = @@ -157,9 +157,10 @@ gst_webvtt_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_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_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "WebVTT encoder", "Codec/Encoder/Subtitle", diff --git a/gst/tta/gstttadec.c b/gst/tta/gstttadec.c index 7eabe7a15..da7693f04 100644 --- a/gst/tta/gstttadec.c +++ b/gst/tta/gstttadec.c @@ -171,8 +171,10 @@ gst_tta_dec_base_init (GstTtaDecClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "TTA audio decoder", "Codec/Decoder/Audio", "Decode TTA audio data", "Arwed v. Merkatz <v.merkatz@gmx.net>"); diff --git a/gst/tta/gstttaparse.c b/gst/tta/gstttaparse.c index 52cd8e474..069408ab6 100644 --- a/gst/tta/gstttaparse.c +++ b/gst/tta/gstttaparse.c @@ -88,8 +88,10 @@ gst_tta_parse_base_init (GstTtaParseClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details_simple (element_class, "TTA file parser", "Codec/Demuxer/Audio", "Parses TTA files", "Arwed v. Merkatz <v.merkatz@gmx.net>"); diff --git a/gst/vbidec/gstvbidec.c b/gst/vbidec/gstvbidec.c index 30991fe75..0122934a9 100644 --- a/gst/vbidec/gstvbidec.c +++ b/gst/vbidec/gstvbidec.c @@ -166,10 +166,10 @@ gst_vbidec_base_init (gpointer g_class) "Decodes closed captions and XDS data from VBI data", "David I. Lehn <dlehn@users.sourceforge.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_vbidec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_vbidec_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vbidec_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vbidec_sink_template)); } static void diff --git a/gst/videodrop/gstvideodrop.c b/gst/videodrop/gstvideodrop.c index 75a3145bd..2ee693af4 100644 --- a/gst/videodrop/gstvideodrop.c +++ b/gst/videodrop/gstvideodrop.c @@ -106,10 +106,10 @@ gst_videodrop_base_init (gpointer g_class) "Re-FPS'es video by dropping frames", "Ronald Bultje <rbultje@ronald.bitfreak.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_videodrop_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_videodrop_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_videodrop_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_videodrop_src_template)); } static void diff --git a/gst/videofilters/gstvideofilter2.c b/gst/videofilters/gstvideofilter2.c index 4ea308aa4..adcdbd23a 100644 --- a/gst/videofilters/gstvideofilter2.c +++ b/gst/videofilters/gstvideofilter2.c @@ -79,22 +79,17 @@ gst_video_filter2_base_init (gpointer g_class) GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); int i; GstCaps *caps = NULL; - GstPadTemplate *pad_template; caps = gst_caps_new_empty (); for (i = GST_VIDEO_FORMAT_I420; i <= GST_VIDEO_FORMAT_I420; i++) { gst_caps_append (caps, gst_video_format_new_template_caps (i)); } - pad_template = + gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_caps_ref (caps)); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); - pad_template = - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); + gst_caps_ref (caps))); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); } static void diff --git a/gst/videomaxrate/videomaxrate.c b/gst/videomaxrate/videomaxrate.c index 396a200ed..0d7bb4f07 100644 --- a/gst/videomaxrate/videomaxrate.c +++ b/gst/videomaxrate/videomaxrate.c @@ -98,10 +98,10 @@ gst_video_max_rate_base_init (gpointer gclass) "Filter/Effect/Video", "Drops extra frames", "Justin Karneges <justin@affinix.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_video_max_rate_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_video_max_rate_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_max_rate_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_max_rate_src_template)); } static void diff --git a/gst/videomeasure/gstvideomeasure_collector.c b/gst/videomeasure/gstvideomeasure_collector.c index 0c1f15ec3..7619967fc 100644 --- a/gst/videomeasure/gstvideomeasure_collector.c +++ b/gst/videomeasure/gstvideomeasure_collector.c @@ -323,10 +323,10 @@ gst_measure_collector_base_init (gpointer g_class) "Collect measurements from a measuring element", "Руслан Ижбулатов <lrn _at_ gmail _dot_ com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_measure_collector_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_measure_collector_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_measure_collector_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_measure_collector_src_template)); } static void diff --git a/gst/videomeasure/gstvideomeasure_ssim.c b/gst/videomeasure/gstvideomeasure_ssim.c index 2a2e493ef..3a354bd67 100644 --- a/gst/videomeasure/gstvideomeasure_ssim.c +++ b/gst/videomeasure/gstvideomeasure_ssim.c @@ -78,7 +78,7 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); "depth = (int) 8 " static GstStaticPadTemplate gst_ssim_src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", +GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS (SRC_CAPS) @@ -92,7 +92,7 @@ GST_STATIC_PAD_TEMPLATE ("original", ); static GstStaticPadTemplate gst_ssim_sink_modified_template = -GST_STATIC_PAD_TEMPLATE ("modified%d", +GST_STATIC_PAD_TEMPLATE ("modified_%u", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS (SINK_CAPS) @@ -1095,12 +1095,12 @@ gst_ssim_class_init (GstSSimClass * klass) "(only when using Gaussian window).", G_MINFLOAT, 10, 1.5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_ssim_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_ssim_sink_original_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_ssim_sink_modified_template); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_ssim_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_ssim_sink_original_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_ssim_sink_modified_template)); gst_element_class_set_details_simple (gstelement_class, "SSim", "Filter/Analyzer/Video", "Calculate Y-SSIM for n+2 YUV video streams", @@ -1125,7 +1125,7 @@ gst_ssim_request_new_pad (GstElement * element, GstPadTemplate * templ, GstPad *newsrc; gint padcount; GstPadTemplate *template; - gint num = -1; + guint num = -1; if (templ->direction != GST_PAD_SINK) goto not_sink; @@ -1145,9 +1145,9 @@ gst_ssim_request_new_pad (GstElement * element, GstPadTemplate * templ, newpad = gst_pad_new_from_template (templ, "original"); GST_DEBUG_OBJECT (ssim, "request new sink pad original"); ssim->orig = newpad; - } else if (strncmp (padname, "modified", 8) == 0) { - const gchar *numstr = &padname[8]; - num = strtol (numstr, NULL, 10); + } else if (strncmp (padname, "modified_", 9) == 0) { + const gchar *numstr = &padname[9]; + num = strtoul (numstr, NULL, 10); if (errno == EINVAL || errno == ERANGE) goto bad_name; newpad = gst_pad_new_from_template (templ, padname); @@ -1181,11 +1181,11 @@ gst_ssim_request_new_pad (GstElement * element, GstPadTemplate * templ, padcount = g_atomic_int_exchange_and_add (&ssim->padcount, 1); #endif - if (num >= 0) { + if (num != -1) { GstSSimOutputContext *c; template = gst_static_pad_template_get (&gst_ssim_src_template); - name = g_strdup_printf ("src%d", num); + name = g_strdup_printf ("src_%u", num); newsrc = gst_pad_new_from_template (template, name); GST_DEBUG_OBJECT (ssim, "creating src pad %s", name); g_free (name); diff --git a/gst/videoparsers/gstdiracparse.c b/gst/videoparsers/gstdiracparse.c index aee281ffe..c6fa69204 100644 --- a/gst/videoparsers/gstdiracparse.c +++ b/gst/videoparsers/gstdiracparse.c @@ -54,7 +54,8 @@ static gboolean gst_dirac_parse_start (GstBaseParse * parse); static gboolean gst_dirac_parse_stop (GstBaseParse * parse); static gboolean gst_dirac_parse_set_sink_caps (GstBaseParse * parse, GstCaps * caps); -static GstCaps *gst_dirac_parse_get_sink_caps (GstBaseParse * parse); +static GstCaps *gst_dirac_parse_get_sink_caps (GstBaseParse * parse, + GstCaps * filter); static gboolean gst_dirac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize); static GstFlowReturn gst_dirac_parse_parse_frame (GstBaseParse * parse, @@ -96,34 +97,30 @@ GST_STATIC_PAD_TEMPLATE ("src", /* class initialization */ -GST_BOILERPLATE (GstDiracParse, gst_dirac_parse, GstBaseParse, - GST_TYPE_BASE_PARSE); - -static void -gst_dirac_parse_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_dirac_parse_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_dirac_parse_sink_template); - - gst_element_class_set_details_simple (element_class, "Dirac parser", - "Codec/Parser/Video", "Parses Dirac streams", - "David Schleef <ds@schleef.org>"); -} +#define parent_class gst_dirac_parse_parent_class +G_DEFINE_TYPE (GstDiracParse, gst_dirac_parse, GST_TYPE_BASE_PARSE); static void gst_dirac_parse_class_init (GstDiracParseClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseParseClass *base_parse_class = GST_BASE_PARSE_CLASS (klass); gobject_class->set_property = gst_dirac_parse_set_property; gobject_class->get_property = gst_dirac_parse_get_property; gobject_class->dispose = gst_dirac_parse_dispose; gobject_class->finalize = gst_dirac_parse_finalize; + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dirac_parse_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_dirac_parse_sink_template)); + + gst_element_class_set_details_simple (element_class, "Dirac parser", + "Codec/Parser/Video", "Parses Dirac streams", + "David Schleef <ds@schleef.org>"); + base_parse_class->start = GST_DEBUG_FUNCPTR (gst_dirac_parse_start); base_parse_class->stop = GST_DEBUG_FUNCPTR (gst_dirac_parse_stop); base_parse_class->set_sink_caps = @@ -143,11 +140,9 @@ gst_dirac_parse_class_init (GstDiracParseClass * klass) } static void -gst_dirac_parse_init (GstDiracParse * diracparse, - GstDiracParseClass * diracparse_class) +gst_dirac_parse_init (GstDiracParse * diracparse) { gst_base_parse_set_min_frame_size (GST_BASE_PARSE (diracparse), 13); - } void @@ -222,37 +217,38 @@ static gboolean gst_dirac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { - GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (frame->buffer); int off; guint32 next_header; guint8 *data; - int size; + gsize size; gboolean have_picture = FALSE; int offset; - data = GST_BUFFER_DATA (frame->buffer); - size = GST_BUFFER_SIZE (frame->buffer); + data = gst_buffer_map (frame->buffer, &size, NULL, GST_MAP_READ); if (G_UNLIKELY (size < 13)) - return FALSE; + goto out; - GST_DEBUG ("%d: %02x %02x %02x %02x", size, data[0], data[1], data[2], - data[3]); + GST_DEBUG ("%" G_GSIZE_FORMAT ": %02x %02x %02x %02x", size, data[0], data[1], + data[2], data[3]); if (GST_READ_UINT32_BE (data) != 0x42424344) { + GstByteReader reader; + + gst_byte_reader_init (&reader, data, size); off = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, - 0x42424344, 0, GST_BUFFER_SIZE (frame->buffer)); + 0x42424344, 0, size); if (off < 0) { - *skipsize = GST_BUFFER_SIZE (frame->buffer) - 3; - return FALSE; + *skipsize = size - 3; + goto out; } GST_LOG_OBJECT (parse, "possible sync at buffer offset %d", off); GST_DEBUG ("skipping %d", off); *skipsize = off; - return FALSE; + goto out; } /* have sync, parse chunks */ @@ -263,7 +259,7 @@ gst_dirac_parse_check_valid_frame (GstBaseParse * parse, if (offset + 13 >= size) { *framesize = offset + 13; - return FALSE; + goto out; } GST_DEBUG ("chunk type %02x", data[offset + 4]); @@ -271,7 +267,7 @@ gst_dirac_parse_check_valid_frame (GstBaseParse * parse, if (GST_READ_UINT32_BE (data + offset) != 0x42424344) { GST_DEBUG ("bad header"); *skipsize = 3; - return FALSE; + goto out; } next_header = GST_READ_UINT32_BE (data + offset + 5); @@ -286,14 +282,20 @@ gst_dirac_parse_check_valid_frame (GstBaseParse * parse, offset += next_header; if (offset >= size) { *framesize = offset; - return FALSE; + goto out; } } + gst_buffer_unmap (frame->buffer, data, size); + *framesize = offset; GST_DEBUG ("framesize %d", *framesize); return TRUE; + +out: + gst_buffer_unmap (frame->buffer, data, size); + return FALSE; } static GstFlowReturn @@ -301,14 +303,13 @@ gst_dirac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstDiracParse *diracparse = GST_DIRAC_PARSE (parse); guint8 *data; - int size; + gsize size; /* Called when processing incoming buffers. Function should parse a checked frame. */ /* MUST implement */ - data = GST_BUFFER_DATA (frame->buffer); - size = GST_BUFFER_SIZE (frame->buffer); + data = gst_buffer_map (frame->buffer, &size, NULL, GST_MAP_READ); //GST_ERROR("got here %d", size); @@ -342,8 +343,7 @@ gst_dirac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) } } - gst_buffer_set_caps (frame->buffer, - GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (parse))); + gst_buffer_unmap (frame->buffer, data, size); gst_base_parse_set_min_frame_size (parse, 13); @@ -383,7 +383,7 @@ gst_dirac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) } static GstCaps * -gst_dirac_parse_get_sink_caps (GstBaseParse * parse) +gst_dirac_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps; GstCaps *res; diff --git a/gst/videoparsers/gsth263parse.c b/gst/videoparsers/gsth263parse.c index 85028c28d..dba1f89f5 100644 --- a/gst/videoparsers/gsth263parse.c +++ b/gst/videoparsers/gsth263parse.c @@ -48,7 +48,7 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("video/x-h263, variant = (string) itu") ); -GST_BOILERPLATE (GstH263Parse, gst_h263_parse, GstElement, GST_TYPE_BASE_PARSE); +G_DEFINE_TYPE (GstH263Parse, gst_h263_parse, GST_TYPE_BASE_PARSE); static gboolean gst_h263_parse_start (GstBaseParse * parse); static gboolean gst_h263_parse_stop (GstBaseParse * parse); @@ -58,31 +58,27 @@ static gboolean gst_h263_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize); static GstFlowReturn gst_h263_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); -static GstCaps *gst_h263_parse_get_sink_caps (GstBaseParse * parse); +static GstCaps *gst_h263_parse_get_sink_caps (GstBaseParse * parse, + GstCaps * filter); static void -gst_h263_parse_base_init (gpointer g_class) +gst_h263_parse_class_init (GstH263ParseClass * klass) { - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (h263_parse_debug, "h263parse", 0, "h263 parser"); - gst_element_class_add_static_pad_template (gstelement_class, - &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, - &sinktemplate); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (gstelement_class, "H.263 parser", "Codec/Parser/Video", "Parses H.263 streams", "Arun Raghavan <arun.raghavan@collabora.co.uk>," "Edward Hervey <edward.hervey@collabora.co.uk>"); - GST_DEBUG_CATEGORY_INIT (h263_parse_debug, "h263parse", 0, "h263 parser"); -} - -static void -gst_h263_parse_class_init (GstH263ParseClass * klass) -{ - GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); - /* Override BaseParse vfuncs */ parse_class->start = GST_DEBUG_FUNCPTR (gst_h263_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_h263_parse_stop); @@ -94,7 +90,7 @@ gst_h263_parse_class_init (GstH263ParseClass * klass) } static void -gst_h263_parse_init (GstH263Parse * h263parse, GstH263ParseClass * g_class) +gst_h263_parse_init (GstH263Parse * h263parse) { } @@ -155,10 +151,13 @@ gst_h263_parse_sink_event (GstBaseParse * parse, GstEvent * event) static guint find_psc (GstBuffer * buffer, guint skip) { + guint8 *buf_data; + gsize buf_size; GstByteReader br; guint psc_pos = -1, psc; - gst_byte_reader_init_from_buffer (&br, buffer); + buf_data = gst_buffer_map (buffer, &buf_size, NULL, GST_MAP_READ); + gst_byte_reader_init (&br, buf_data, buf_size); if (!gst_byte_reader_set_pos (&br, skip)) goto out; @@ -176,6 +175,7 @@ find_psc (GstBuffer * buffer, guint skip) } out: + gst_buffer_unmap (buffer, buf_data, buf_size); return psc_pos; } @@ -189,16 +189,16 @@ gst_h263_parse_set_src_caps (GstH263Parse * h263parse, g_assert (h263parse->state == PASSTHROUGH || h263parse->state == GOT_HEADER); - caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (h263parse)); + caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (h263parse)); if (caps) { - caps = gst_caps_copy (caps); + caps = gst_caps_make_writable (caps); } else { caps = gst_caps_new_simple ("video/x-h263", "variant", G_TYPE_STRING, "itu", NULL); } gst_caps_set_simple (caps, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); - sink_caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (h263parse)); + sink_caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (h263parse)); if (sink_caps && (st = gst_caps_get_structure (sink_caps, 0)) && gst_structure_get_fraction (st, "framerate", &fr_num, &fr_denom)) { /* Got it in caps - nothing more to do */ @@ -255,19 +255,21 @@ gst_h263_parse_check_valid_frame (GstBaseParse * parse, GstH263Parse *h263parse; GstBuffer *buffer; guint psc_pos, next_psc_pos; + gsize size; h263parse = GST_H263_PARSE (parse); buffer = frame->buffer; + size = gst_buffer_get_size (buffer); - if (GST_BUFFER_SIZE (buffer) < 3) + if (size < 3) return FALSE; psc_pos = find_psc (buffer, 0); if (psc_pos == -1) { /* PSC not found, need more data */ - if (GST_BUFFER_SIZE (buffer) > 3) - psc_pos = GST_BUFFER_SIZE (buffer) - 3; + if (size > 3) + psc_pos = size - 3; else psc_pos = 0; goto more; @@ -280,7 +282,7 @@ gst_h263_parse_check_valid_frame (GstBaseParse * parse, if (next_psc_pos == -1) { if (GST_BASE_PARSE_DRAINING (parse)) /* FLUSH/EOS, it's okay if we can't find the next frame */ - next_psc_pos = GST_BUFFER_SIZE (buffer); + next_psc_pos = size; else goto more; } @@ -349,9 +351,6 @@ gst_h263_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) /* h263parse->state is now GOT_HEADER */ - gst_buffer_set_caps (buffer, - GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (h263parse)))); - if (gst_h263_parse_is_delta_unit (¶ms)) GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); else @@ -363,7 +362,7 @@ out: } static GstCaps * -gst_h263_parse_get_sink_caps (GstBaseParse * parse) +gst_h263_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps; GstCaps *res; diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index 840cfb2d0..90916a21e 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -72,8 +72,8 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", "stream-format=(string) { avc, byte-stream }, " "alignment=(string) { au, nal }")); -GST_BOILERPLATE (GstH264Parse, gst_h264_parse, GstBaseParse, - GST_TYPE_BASE_PARSE); +#define parent_class gst_h264_parse_parent_class +G_DEFINE_TYPE (GstH264Parse, gst_h264_parse, GST_TYPE_BASE_PARSE); static void gst_h264_parse_finalize (GObject * object); @@ -92,33 +92,22 @@ static void gst_h264_parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps); -static GstCaps *gst_h264_parse_get_caps (GstBaseParse * parse); -static GstFlowReturn gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer); +static GstCaps *gst_h264_parse_get_caps (GstBaseParse * parse, + GstCaps * filter); +static GstFlowReturn gst_h264_parse_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); static gboolean gst_h264_parse_event (GstBaseParse * parse, GstEvent * event); static gboolean gst_h264_parse_src_event (GstBaseParse * parse, GstEvent * event); static void -gst_h264_parse_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (gstelement_class, &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); - - gst_element_class_set_details_simple (gstelement_class, "H.264 parser", - "Codec/Parser/Converter/Video", - "Parses H.264 streams", - "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>"); - - GST_DEBUG_CATEGORY_INIT (h264_parse_debug, "h264parse", 0, "h264 parser"); -} - -static void gst_h264_parse_class_init (GstH264ParseClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + GST_DEBUG_CATEGORY_INIT (h264_parse_debug, "h264parse", 0, "h264 parser"); gobject_class->finalize = gst_h264_parse_finalize; gobject_class->set_property = gst_h264_parse_set_property; @@ -144,10 +133,20 @@ gst_h264_parse_class_init (GstH264ParseClass * klass) parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_h264_parse_get_caps); parse_class->event = GST_DEBUG_FUNCPTR (gst_h264_parse_event); parse_class->src_event = GST_DEBUG_FUNCPTR (gst_h264_parse_src_event); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); + + gst_element_class_set_details_simple (gstelement_class, "H.264 parser", + "Codec/Parser/Converter/Video", + "Parses H.264 streams", + "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>"); } static void -gst_h264_parse_init (GstH264Parse * h264parse, GstH264ParseClass * g_class) +gst_h264_parse_init (GstH264Parse * h264parse) { h264parse->frame_out = gst_adapter_new (); @@ -354,22 +353,23 @@ gst_h264_parse_wrap_nal (GstH264Parse * h264parse, guint format, guint8 * data, { GstBuffer *buf; guint nl = h264parse->nal_length_size; + guint32 tmp; GST_DEBUG_OBJECT (h264parse, "nal length %d", size); - buf = gst_buffer_new_and_alloc (size + nl + 4); + buf = gst_buffer_new_allocate (NULL, nl + size, 0); if (format == GST_H264_PARSE_FORMAT_AVC) { - GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), size << (32 - 8 * nl)); + tmp = GUINT32_TO_BE (size << (32 - 8 * nl)); } else { /* HACK: nl should always be 4 here, otherwise this won't work. * There are legit cases where nl in avc stream is 2, but byte-stream * SC is still always 4 bytes. */ nl = 4; - GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), 1); + tmp = GUINT32_TO_BE (1); } - GST_BUFFER_SIZE (buf) = size + nl; - memcpy (GST_BUFFER_DATA (buf) + nl, data, size); + gst_buffer_fill (buf, 0, &tmp, sizeof (guint32)); + gst_buffer_fill (buf, nl, data, size); return buf; } @@ -397,8 +397,8 @@ gst_h264_parser_store_nal (GstH264Parse * h264parse, guint id, return; } - buf = gst_buffer_new_and_alloc (size); - memcpy (GST_BUFFER_DATA (buf), nalu->data + nalu->offset, size); + buf = gst_buffer_new_allocate (NULL, size, 0); + gst_buffer_fill (buf, 0, nalu->data + nalu->offset, size); if (store[id]) gst_buffer_unref (store[id]); @@ -614,14 +614,19 @@ gst_h264_parse_check_valid_frame (GstBaseParse * parse, GstH264Parse *h264parse = GST_H264_PARSE (parse); GstBuffer *buffer = frame->buffer; guint8 *data; - guint size, current_off = 0; + gsize size; + guint current_off = 0; gboolean drain; GstH264NalParser *nalparser = h264parse->nalparser; GstH264NalUnit nalu = h264parse->nalu; + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + /* expect at least 3 bytes startcode == sc, and 2 bytes NALU payload */ - if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < 5)) + if (G_UNLIKELY (size < 5)) { + gst_buffer_unmap (buffer, data, size); return FALSE; + } /* need to configure aggregation */ if (G_UNLIKELY (h264parse->format == GST_H264_PARSE_FORMAT_NONE)) @@ -636,9 +641,6 @@ gst_h264_parse_check_valid_frame (GstBaseParse * parse, GST_LOG_OBJECT (h264parse, "resuming frame parsing"); } - data = GST_BUFFER_DATA (buffer); - size = GST_BUFFER_SIZE (buffer); - drain = FALSE; current_off = h264parse->current_off; @@ -679,7 +681,7 @@ gst_h264_parse_check_valid_frame (GstBaseParse * parse, } break; case GST_H264_PARSER_BROKEN_LINK: - return FALSE; + goto out; case GST_H264_PARSER_ERROR: current_off = size - 3; goto parsing_error; @@ -714,8 +716,8 @@ gst_h264_parse_check_valid_frame (GstBaseParse * parse, if (GST_BASE_PARSE_DRAINING (parse)) { drain = TRUE; - GST_DEBUG_OBJECT (h264parse, "draining NAL %u %u %u", size, - h264parse->nalu.offset, h264parse->nalu.size); + GST_DEBUG_OBJECT (h264parse, "draining NAL %" G_GSIZE_FORMAT " %u %u", + size, h264parse->nalu.offset, h264parse->nalu.size); /* Can't parse the nalu */ if (size - h264parse->nalu.offset < 2) { *skipsize = nalu.offset; @@ -751,6 +753,7 @@ end: *framesize = nalu.offset + nalu.size - h264parse->nalu.sc_offset; h264parse->current_off = current_off; + gst_buffer_unmap (buffer, data, size); return TRUE; parsing_error: @@ -773,11 +776,14 @@ more: /* Restart parsing from here next time */ h264parse->current_off = current_off; + /* Fall-through. */ +out: + gst_buffer_unmap (buffer, data, size); return FALSE; invalid: gst_h264_parse_reset_frame (h264parse); - return FALSE; + goto out; } /* byte together avc codec data based on collected pps and sps so far */ @@ -788,20 +794,23 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) gint i, sps_size = 0, pps_size = 0, num_sps = 0, num_pps = 0; guint8 profile_idc = 0, profile_comp = 0, level_idc = 0; gboolean found = FALSE; - guint8 *data; + guint8 *buf_data, *data; /* only nal payload in stored nals */ for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) { if ((nal = h264parse->sps_nals[i])) { + gsize size = gst_buffer_get_size (nal); num_sps++; /* size bytes also count */ - sps_size += GST_BUFFER_SIZE (nal) + 2; - if (GST_BUFFER_SIZE (nal) >= 4) { + sps_size += size + 2; + if (size >= 4) { + guint8 tmp[3]; found = TRUE; - profile_idc = (GST_BUFFER_DATA (nal))[1]; - profile_comp = (GST_BUFFER_DATA (nal))[2]; - level_idc = (GST_BUFFER_DATA (nal))[3]; + gst_buffer_extract (nal, 1, tmp, 3); + profile_idc = tmp[0]; + profile_comp = tmp[1]; + level_idc = tmp[2]; } } } @@ -809,7 +818,7 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) if ((nal = h264parse->pps_nals[i])) { num_pps++; /* size bytes also count */ - pps_size += GST_BUFFER_SIZE (nal) + 2; + pps_size += gst_buffer_get_size (nal) + 2; } } @@ -819,8 +828,9 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) if (!found || !num_pps) return NULL; - buf = gst_buffer_new_and_alloc (5 + 1 + sps_size + 1 + pps_size); - data = GST_BUFFER_DATA (buf); + buf = gst_buffer_new_allocate (NULL, 5 + 1 + sps_size + 1 + pps_size, 0); + buf_data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE); + data = buf_data; data[0] = 1; /* AVC Decoder Configuration Record ver. 1 */ data[1] = profile_idc; /* profile_idc */ @@ -832,9 +842,10 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) data += 6; for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) { if ((nal = h264parse->sps_nals[i])) { - GST_WRITE_UINT16_BE (data, GST_BUFFER_SIZE (nal)); - memcpy (data + 2, GST_BUFFER_DATA (nal), GST_BUFFER_SIZE (nal)); - data += 2 + GST_BUFFER_SIZE (nal); + gsize nal_size = gst_buffer_get_size (nal); + GST_WRITE_UINT16_BE (data, nal_size); + gst_buffer_extract (nal, 0, data + 2, nal_size); + data += 2 + nal_size; } } @@ -842,12 +853,15 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) data++; for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) { if ((nal = h264parse->pps_nals[i])) { - GST_WRITE_UINT16_BE (data, GST_BUFFER_SIZE (nal)); - memcpy (data + 2, GST_BUFFER_DATA (nal), GST_BUFFER_SIZE (nal)); - data += 2 + GST_BUFFER_SIZE (nal); + gsize nal_size = gst_buffer_get_size (nal); + GST_WRITE_UINT16_BE (data, nal_size); + gst_buffer_extract (nal, 0, data + 2, nal_size); + data += 2 + nal_size; } } + gst_buffer_unmap (buf, buf_data, -1); + return buf; } @@ -951,7 +965,8 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) gboolean modified = FALSE; GstBuffer *buf = NULL; - if (G_UNLIKELY (!GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (h264parse)))) + if (G_UNLIKELY (!gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD + (h264parse)))) modified = TRUE; else if (G_UNLIKELY (!h264parse->update_caps)) return; @@ -961,13 +976,11 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) if (caps) sink_caps = caps; else - sink_caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (h264parse)); + sink_caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (h264parse)); /* carry over input caps as much as possible; override with our own stuff */ - if (sink_caps) - gst_caps_ref (sink_caps); - else - sink_caps = gst_caps_new_simple ("video/x-h264", NULL); + if (!sink_caps) + sink_caps = gst_caps_new_empty_simple ("video/x-h264"); sps = h264parse->nalparser->last_sps; GST_DEBUG_OBJECT (h264parse, "sps: %p", sps); @@ -977,10 +990,15 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) h264parse->align == GST_H264_PARSE_ALIGN_AU) { buf = gst_h264_parse_make_codec_data (h264parse); if (buf && h264parse->codec_data) { - if (GST_BUFFER_SIZE (buf) != GST_BUFFER_SIZE (h264parse->codec_data) || - memcmp (GST_BUFFER_DATA (buf), - GST_BUFFER_DATA (h264parse->codec_data), GST_BUFFER_SIZE (buf))) + gsize size; + gpointer data; + + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + if (size != gst_buffer_get_size (h264parse->codec_data) || + gst_buffer_memcmp (h264parse->codec_data, 0, data, size)) modified = TRUE; + + gst_buffer_unmap (buf, data, size); } else { if (h264parse->codec_data) buf = gst_buffer_ref (h264parse->codec_data); @@ -1240,7 +1258,7 @@ gst_h264_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) GstBuffer *buf; buf = gst_adapter_take_buffer (h264parse->frame_out, av); - gst_buffer_copy_metadata (buf, buffer, GST_BUFFER_COPY_ALL); + gst_buffer_copy_into (buf, buffer, GST_BUFFER_COPY_METADATA, 0, -1); gst_buffer_replace (&frame->buffer, buf); gst_buffer_unref (buf); } @@ -1254,14 +1272,16 @@ static GstFlowReturn gst_h264_parse_push_codec_buffer (GstH264Parse * h264parse, GstBuffer * nal, GstClockTime ts) { - nal = gst_h264_parse_wrap_nal (h264parse, h264parse->format, - GST_BUFFER_DATA (nal), GST_BUFFER_SIZE (nal)); + gpointer data; + gsize size; + + data = gst_buffer_map (nal, &size, NULL, GST_MAP_READ); + nal = gst_h264_parse_wrap_nal (h264parse, h264parse->format, data, size); + gst_buffer_unmap (nal, data, size); GST_BUFFER_TIMESTAMP (nal) = ts; GST_BUFFER_DURATION (nal) = 0; - gst_buffer_set_caps (nal, GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (h264parse))); - return gst_pad_push (GST_BASE_PARSE_SRC_PAD (h264parse), nal); } @@ -1429,36 +1449,33 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) GstBuffer *new_buf; const gboolean bs = h264parse->format == GST_H264_PARSE_FORMAT_BYTE; - gst_byte_writer_init_with_size (&bw, GST_BUFFER_SIZE (buffer), FALSE); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (buffer), - h264parse->idr_pos); + gst_byte_writer_init_with_size (&bw, gst_buffer_get_size (buffer), + FALSE); + gst_byte_writer_put_buffer (&bw, buffer, 0, h264parse->idr_pos); GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS"); for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) { if ((codec_nal = h264parse->sps_nals[i])) { + gsize nal_size = gst_buffer_get_size (codec_nal); GST_DEBUG_OBJECT (h264parse, "inserting SPS nal"); - gst_byte_writer_put_uint32_be (&bw, - bs ? 1 : GST_BUFFER_SIZE (codec_nal)); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_uint32_be (&bw, bs ? 1 : nal_size); + gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size); h264parse->last_report = new_ts; } } for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) { if ((codec_nal = h264parse->pps_nals[i])) { + gsize nal_size = gst_buffer_get_size (codec_nal); GST_DEBUG_OBJECT (h264parse, "inserting PPS nal"); - gst_byte_writer_put_uint32_be (&bw, - bs ? 1 : GST_BUFFER_SIZE (codec_nal)); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_uint32_be (&bw, bs ? 1 : nal_size); + gst_byte_writer_put_buffer (&bw, codec_nal, 0, nal_size); h264parse->last_report = new_ts; } } - gst_byte_writer_put_data (&bw, - GST_BUFFER_DATA (buffer) + h264parse->idr_pos, - GST_BUFFER_SIZE (buffer) - h264parse->idr_pos); + gst_byte_writer_put_buffer (&bw, buffer, h264parse->idr_pos, -1); /* collect result and push */ new_buf = gst_byte_writer_reset_and_get_buffer (&bw); - gst_buffer_copy_metadata (new_buf, buffer, GST_BUFFER_COPY_ALL); + gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_METADATA, 0, + -1); gst_buffer_replace (&frame->buffer, new_buf); gst_buffer_unref (new_buf); } @@ -1482,7 +1499,8 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) GstStructure *str; const GValue *value; GstBuffer *codec_data = NULL; - guint size, format, align, off; + gsize size; + guint format, align, off; GstH264NalUnit nalu; GstH264ParserResult parseres; @@ -1518,15 +1536,18 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) codec_data = gst_value_get_buffer (value); if (!codec_data) goto wrong_type; - data = GST_BUFFER_DATA (codec_data); - size = GST_BUFFER_SIZE (codec_data); + data = gst_buffer_map (codec_data, &size, NULL, GST_MAP_READ); /* parse the avcC data */ - if (size < 8) + if (size < 8) { + gst_buffer_unmap (codec_data, data, size); goto avcc_too_small; + } /* parse the version, this must be 1 */ - if (data[0] != 1) + if (data[0] != 1) { + gst_buffer_unmap (codec_data, data, size); goto wrong_version; + } /* AVCProfileIndication */ /* profile_compat */ @@ -1546,8 +1567,10 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) 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) + if (parseres != GST_H264_PARSER_OK) { + gst_buffer_unmap (codec_data, data, size); goto avcc_too_small; + } gst_h264_parse_process_nal (h264parse, &nalu); off = nalu.offset + nalu.size; @@ -1560,6 +1583,7 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) 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, data, size); goto avcc_too_small; } @@ -1567,6 +1591,8 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) off = nalu.offset + nalu.size; } + gst_buffer_unmap (codec_data, data, size); + h264parse->codec_data = gst_buffer_ref (codec_data); /* if upstream sets codec_data without setting stream-format and alignment, we @@ -1612,7 +1638,7 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) /* ERRORS */ avcc_too_small: { - GST_DEBUG_OBJECT (h264parse, "avcC size %u < 8", size); + GST_DEBUG_OBJECT (h264parse, "avcC size %" G_GSIZE_FORMAT " < 8", size); goto refuse_caps; } wrong_version: @@ -1633,11 +1659,13 @@ refuse_caps: } static GstCaps * -gst_h264_parse_get_caps (GstBaseParse * parse) +gst_h264_parse_get_caps (GstBaseParse * parse, GstCaps * filter) { - GstCaps *peercaps; + GstCaps *peercaps, *template_caps; GstCaps *res; + template_caps = + gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)); peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; @@ -1651,15 +1679,19 @@ gst_h264_parse_get_caps (GstBaseParse * parse) gst_structure_remove_field (s, "parsed"); } - res = - gst_caps_intersect_full (peercaps, - gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)), + res = gst_caps_intersect_full (peercaps, template_caps, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); + gst_caps_unref (template_caps); } else { - res = - gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD - (parse))); + res = template_caps; + } + + if (filter) { + GstCaps *tmp = gst_caps_intersect_full (res, filter, + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (res); + res = tmp; } return res; @@ -1747,9 +1779,9 @@ gst_h264_parse_src_event (GstBaseParse * parse, GstEvent * event) } static GstFlowReturn -gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) +gst_h264_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) { - GstH264Parse *h264parse = GST_H264_PARSE (GST_PAD_PARENT (pad)); + GstH264Parse *h264parse = GST_H264_PARSE (parent); if (h264parse->packetized && buffer) { GstBuffer *sub; @@ -1757,6 +1789,8 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) GstH264ParserResult parse_res; GstH264NalUnit nalu; const guint nl = h264parse->nal_length_size; + gpointer data; + gsize size; if (nl < 1 || nl > 4) { GST_DEBUG_OBJECT (h264parse, "insufficient data to split input"); @@ -1765,11 +1799,13 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) return GST_FLOW_NOT_NEGOTIATED; } - GST_LOG_OBJECT (h264parse, "processing packet buffer of size %d", - GST_BUFFER_SIZE (buffer)); + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + + GST_LOG_OBJECT (h264parse, + "processing packet buffer of size %" G_GSIZE_FORMAT, size); parse_res = gst_h264_parser_identify_nalu_avc (h264parse->nalparser, - GST_BUFFER_DATA (buffer), 0, GST_BUFFER_SIZE (buffer), nl, &nalu); + data, 0, size, nl, &nalu); while (parse_res == GST_H264_PARSER_OK) { GST_DEBUG_OBJECT (h264parse, "AVC nal offset %d", @@ -1782,7 +1818,7 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) /* at least this should make sense */ GST_BUFFER_TIMESTAMP (sub) = GST_BUFFER_TIMESTAMP (buffer); GST_LOG_OBJECT (h264parse, "pushing NAL of size %d", nalu.size); - ret = h264parse->parse_chain (pad, sub); + ret = h264parse->parse_chain (pad, parent, sub); } else { /* pass-through: no looking for frames (and nal processing), * so need to parse to collect data here */ @@ -1794,10 +1830,11 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) } parse_res = gst_h264_parser_identify_nalu_avc (h264parse->nalparser, - GST_BUFFER_DATA (buffer), nalu.offset + nalu.size, - GST_BUFFER_SIZE (buffer), nl, &nalu); + data, nalu.offset + nalu.size, size, nl, &nalu); } + gst_buffer_unmap (buffer, data, size); + if (h264parse->split_packetized) { gst_buffer_unref (buffer); return ret; @@ -1823,7 +1860,7 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer) } } - return h264parse->parse_chain (pad, buffer); + return h264parse->parse_chain (pad, parent, buffer); } static void diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c index 49a55d3fc..53f97debe 100644 --- a/gst/videoparsers/gstmpeg4videoparse.c +++ b/gst/videoparsers/gstmpeg4videoparse.c @@ -65,8 +65,8 @@ enum PROP_LAST }; -GST_BOILERPLATE (GstMpeg4VParse, gst_mpeg4vparse, GstBaseParse, - GST_TYPE_BASE_PARSE); +#define gst_mpeg4vparse_parent_class parent_class +G_DEFINE_TYPE (GstMpeg4VParse, gst_mpeg4vparse, GST_TYPE_BASE_PARSE); static gboolean gst_mpeg4vparse_start (GstBaseParse * parse); static gboolean gst_mpeg4vparse_stop (GstBaseParse * parse); @@ -77,7 +77,8 @@ static GstFlowReturn gst_mpeg4vparse_parse_frame (GstBaseParse * parse, static GstFlowReturn gst_mpeg4vparse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static gboolean gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps); -static GstCaps *gst_mpeg4vparse_get_caps (GstBaseParse * parse); +static GstCaps *gst_mpeg4vparse_get_caps (GstBaseParse * parse, + GstCaps * filter); static void gst_mpeg4vparse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -88,23 +89,6 @@ static gboolean gst_mpeg4vparse_src_event (GstBaseParse * parse, GstEvent * event); static void -gst_mpeg4vparse_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, &sink_template); - - gst_element_class_set_details_simple (element_class, - "MPEG 4 video elementary stream parser", "Codec/Parser/Video", - "Parses MPEG-4 Part 2 elementary video streams", - "Julien Moutte <julien@fluendo.com>"); - - GST_DEBUG_CATEGORY_INIT (mpeg4v_parse_debug, "mpeg4videoparse", 0, - "MPEG-4 video parser"); -} - -static void gst_mpeg4vparse_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { @@ -145,6 +129,7 @@ gst_mpeg4vparse_class_init (GstMpeg4VParseClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); @@ -165,6 +150,19 @@ gst_mpeg4vparse_class_init (GstMpeg4VParseClass * klass) 0, 3600, DEFAULT_CONFIG_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_details_simple (element_class, + "MPEG 4 video elementary stream parser", "Codec/Parser/Video", + "Parses MPEG-4 Part 2 elementary video streams", + "Julien Moutte <julien@fluendo.com>"); + + GST_DEBUG_CATEGORY_INIT (mpeg4v_parse_debug, "mpeg4videoparse", 0, + "MPEG-4 video parser"); + /* Override BaseParse vfuncs */ parse_class->start = GST_DEBUG_FUNCPTR (gst_mpeg4vparse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_mpeg4vparse_stop); @@ -180,7 +178,7 @@ gst_mpeg4vparse_class_init (GstMpeg4VParseClass * klass) } static void -gst_mpeg4vparse_init (GstMpeg4VParse * parse, GstMpeg4VParseClass * g_class) +gst_mpeg4vparse_init (GstMpeg4VParse * parse) { parse->interval = DEFAULT_CONFIG_INTERVAL; parse->last_report = GST_CLOCK_TIME_NONE; @@ -241,8 +239,7 @@ gst_mpeg4vparse_process_config (GstMpeg4VParse * mp4vparse, const guint8 * data, guint offset, gsize size) { /* only do stuff if something new */ - if (mp4vparse->config && size == GST_BUFFER_SIZE (mp4vparse->config) && - memcmp (GST_BUFFER_DATA (mp4vparse->config), data, size) == 0) + if (!gst_buffer_memcmp (mp4vparse->config, offset, data, size)) return TRUE; if (mp4vparse->vol_offset < 0) { @@ -272,10 +269,7 @@ gst_mpeg4vparse_process_config (GstMpeg4VParse * mp4vparse, if (mp4vparse->config != NULL) gst_buffer_unref (mp4vparse->config); - mp4vparse->config = gst_buffer_new_and_alloc (size); - - memcpy (GST_BUFFER_DATA (mp4vparse->config), data, size); - + mp4vparse->config = gst_buffer_new_wrapped (g_memdup (data, size), size); /* trigger src caps update */ mp4vparse->update_caps = TRUE; @@ -374,15 +368,17 @@ gst_mpeg4vparse_check_valid_frame (GstBaseParse * parse, { GstMpeg4VParse *mp4vparse = GST_MPEG4VIDEO_PARSE (parse); GstMpeg4Packet packet; - guint8 *data = GST_BUFFER_DATA (frame->buffer); - guint size = GST_BUFFER_SIZE (frame->buffer); + guint8 *data = NULL; + gsize size; gint off = 0; - gboolean ret; + gboolean ret = FALSE; + + data = gst_buffer_map (frame->buffer, &size, NULL, GST_MAP_READ); retry: /* at least start code and subsequent byte */ if (G_UNLIKELY (size - off < 5)) - return FALSE; + goto out; /* avoid stale cached parsing state */ if (!(frame->flags & GST_BASE_PARSE_FRAME_FLAG_PARSING)) { @@ -404,7 +400,7 @@ retry: case (GST_MPEG4_PARSER_NO_PACKET): case (GST_MPEG4_PARSER_ERROR): *skipsize = size - 3; - return FALSE; + goto out; default: break; } @@ -413,7 +409,7 @@ retry: /* possible frame header, but not at offset 0? skip bytes before sync */ if (G_UNLIKELY (off > 3)) { *skipsize = off - 3; - return FALSE; + goto out; } switch (packet.type) { @@ -454,14 +450,15 @@ next: /* if draining, take all */ if (GST_BASE_PARSE_DRAINING (parse)) { *framesize = size; - return TRUE; + ret = TRUE; } else { /* resume scan where we left it */ mp4vparse->last_sc = size - 3; /* request best next available */ *framesize = G_MAXUINT; - return FALSE; } + goto out; + break; default: /* decide whether this startcode ends a frame */ ret = gst_mpeg4vparse_process_sc (mp4vparse, &packet, size); @@ -476,6 +473,8 @@ next: goto next; } +out: + gst_buffer_unmap (frame->buffer, data, size); return ret; } @@ -487,14 +486,16 @@ gst_mpeg4vparse_update_src_caps (GstMpeg4VParse * mp4vparse) GST_LOG_OBJECT (mp4vparse, "Updating caps"); /* only update if no src caps yet or explicitly triggered */ - if (G_LIKELY (GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (mp4vparse)) && + if (G_LIKELY (gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (mp4vparse)) && !mp4vparse->update_caps)) return; /* carry over input caps as much as possible; override with our own stuff */ - caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (mp4vparse)); + caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (mp4vparse)); if (caps) { - caps = gst_caps_copy (caps); + GstCaps *tmp = gst_caps_copy (caps); + gst_caps_unref (caps); + caps = tmp; } else { caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, NULL); @@ -667,19 +668,25 @@ gst_mpeg4vparse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) "interval since last config %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); if (GST_TIME_AS_SECONDS (diff) >= mp4vparse->interval || push_codec) { + guint8 *cdata; + gsize csize; + gboolean diffconf; + /* we need to send config now first */ GST_INFO_OBJECT (parse, "inserting config in stream"); + cdata = gst_buffer_map (mp4vparse->config, &csize, NULL, GST_MAP_READ); + diffconf = (gst_buffer_get_size (buffer) < csize) + || gst_buffer_memcmp (buffer, 0, cdata, csize); + gst_buffer_unmap (mp4vparse->config, cdata, csize); /* avoid inserting duplicate config */ - if ((GST_BUFFER_SIZE (buffer) < GST_BUFFER_SIZE (mp4vparse->config)) || - memcmp (GST_BUFFER_DATA (buffer), - GST_BUFFER_DATA (mp4vparse->config), - GST_BUFFER_SIZE (mp4vparse->config))) { + if (diffconf) { GstBuffer *superbuf; /* insert header */ superbuf = gst_buffer_merge (mp4vparse->config, buffer); - gst_buffer_copy_metadata (superbuf, buffer, GST_BUFFER_COPY_ALL); + gst_buffer_copy_into (superbuf, buffer, GST_BUFFER_COPY_METADATA, 0, + csize); gst_buffer_replace (&frame->buffer, superbuf); gst_buffer_unref (superbuf); } else { @@ -718,8 +725,7 @@ gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps) /* best possible parse attempt, * src caps are based on sink caps so it will end up in there * whether sucessful or not */ - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); res = gst_mpeg4_parse (&packet, TRUE, NULL, data, 0, size); while (res == GST_MPEG4_PARSER_OK || res == GST_MPEG4_PARSER_NO_PACKET_END) { @@ -732,8 +738,8 @@ gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps) } /* And take it as config */ - gst_mpeg4vparse_process_config (mp4vparse, GST_BUFFER_DATA (buf), - 3, GST_BUFFER_SIZE (buf)); + gst_mpeg4vparse_process_config (mp4vparse, data, 3, size); + gst_buffer_unmap (buf, data, size); } /* let's not interfere and accept regardless of config parsing success */ @@ -742,7 +748,7 @@ gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps) static GstCaps * -gst_mpeg4vparse_get_caps (GstBaseParse * parse) +gst_mpeg4vparse_get_caps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps; GstCaps *res; @@ -771,6 +777,14 @@ gst_mpeg4vparse_get_caps (GstBaseParse * parse) (parse))); } + if (filter) { + GstCaps *tmp = gst_caps_intersect_full (res, filter, + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (res); + res = tmp; + } + + return res; } diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c index 4f8eb3a37..21595407c 100644 --- a/gst/videoparsers/gstmpegvideoparse.c +++ b/gst/videoparsers/gstmpegvideoparse.c @@ -61,8 +61,8 @@ enum PROP_LAST }; -GST_BOILERPLATE (GstMpegvParse, gst_mpegv_parse, GstBaseParse, - GST_TYPE_BASE_PARSE); +#define parent_class gst_mpegv_parse_parent_class +G_DEFINE_TYPE (GstMpegvParse, gst_mpegv_parse, GST_TYPE_BASE_PARSE); static gboolean gst_mpegv_parse_start (GstBaseParse * parse); static gboolean gst_mpegv_parse_stop (GstBaseParse * parse); @@ -71,7 +71,8 @@ static gboolean gst_mpegv_parse_check_valid_frame (GstBaseParse * parse, static GstFlowReturn gst_mpegv_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static gboolean gst_mpegv_parse_set_caps (GstBaseParse * parse, GstCaps * caps); -static GstCaps *gst_mpegv_parse_get_caps (GstBaseParse * parse); +static GstCaps *gst_mpegv_parse_get_caps (GstBaseParse * parse, + GstCaps * filter); static GstFlowReturn gst_mpegv_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame); @@ -81,27 +82,6 @@ static void gst_mpegv_parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void -gst_mpegv_parse_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &sink_template); - - gst_element_class_set_details_simple (element_class, - "MPEG video elementary stream parser", - "Codec/Parser/Video", - "Parses and frames MPEG-1 and MPEG-2 elementary video streams", - "Wim Taymans <wim.taymans@ccollabora.co.uk>, " - "Jan Schmidt <thaytan@mad.scientist.com>, " - "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>"); - - GST_DEBUG_CATEGORY_INIT (mpegv_parse_debug, "mpegvideoparse", 0, - "MPEG-1/2 video parser"); -} - -static void gst_mpegv_parse_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { @@ -141,8 +121,12 @@ static void gst_mpegv_parse_class_init (GstMpegvParseClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); + GST_DEBUG_CATEGORY_INIT (mpegv_parse_debug, "mpegvideoparse", 0, + "MPEG-1/2 video parser"); + parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_mpegv_parse_set_property; @@ -159,6 +143,19 @@ gst_mpegv_parse_class_init (GstMpegvParseClass * klass) "Split frame when encountering GOP", DEFAULT_PROP_GOP_SPLIT, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_details_simple (element_class, + "MPEG video elementary stream parser", + "Codec/Parser/Video", + "Parses and frames MPEG-1 and MPEG-2 elementary video streams", + "Wim Taymans <wim.taymans@ccollabora.co.uk>, " + "Jan Schmidt <thaytan@mad.scientist.com>, " + "Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>"); + /* Override BaseParse vfuncs */ parse_class->start = GST_DEBUG_FUNCPTR (gst_mpegv_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_mpegv_parse_stop); @@ -172,7 +169,7 @@ gst_mpegv_parse_class_init (GstMpegvParseClass * klass) } static void -gst_mpegv_parse_init (GstMpegvParse * parse, GstMpegvParseClass * g_class) +gst_mpegv_parse_init (GstMpegvParse * parse) { parse->mpeg_version = 0; } @@ -232,16 +229,21 @@ gst_mpegv_parse_process_config (GstMpegvParse * mpvparse, GstBuffer * buf, guint size) { GList *tmp; - guint8 *data = GST_BUFFER_DATA (buf); - data = data + mpvparse->seq_offset; + guint8 *buf_data, *data; + gsize buf_size; + + buf_data = gst_buffer_map (buf, &buf_size, NULL, GST_MAP_READ); + data = buf_data + mpvparse->seq_offset; /* only do stuff if something new */ - if (mpvparse->config && size == GST_BUFFER_SIZE (mpvparse->config) && - memcmp (GST_BUFFER_DATA (mpvparse->config), data, size) == 0) + if (mpvparse->config && size == gst_buffer_get_size (mpvparse->config) && + gst_buffer_memcmp (mpvparse->config, 0, data, size) == 0) { + gst_buffer_unmap (buf, buf_data, buf_size); return TRUE; + } if (gst_mpeg_video_parse_sequence_header (&mpvparse->sequencehdr, data, - GST_BUFFER_SIZE (buf) - mpvparse->seq_offset, 0)) { + buf_size - mpvparse->seq_offset, 0)) { if (mpvparse->fps_num == 0 || mpvparse->fps_den == 0) { mpvparse->fps_num = mpvparse->sequencehdr.fps_n; mpvparse->fps_den = mpvparse->sequencehdr.fps_d; @@ -250,6 +252,7 @@ gst_mpegv_parse_process_config (GstMpegvParse * mpvparse, GstBuffer * buf, GST_DEBUG_OBJECT (mpvparse, "failed to parse config data (size %d) at offset %d", size, mpvparse->seq_offset); + gst_buffer_unmap (buf, buf_data, buf_size); return FALSE; } @@ -267,8 +270,7 @@ gst_mpegv_parse_process_config (GstMpegvParse * mpvparse, GstBuffer * buf, mpvparse->mpeg_version = 2; if (gst_mpeg_video_parse_sequence_extension (&mpvparse->sequenceext, - GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), - tpoffsz->offset)) { + buf_data, buf_size, tpoffsz->offset)) { mpvparse->fps_num = mpvparse->sequencehdr.fps_n * (mpvparse->sequenceext.fps_n_ext + 1) * 2; @@ -285,11 +287,13 @@ gst_mpegv_parse_process_config (GstMpegvParse * mpvparse, GstBuffer * buf, gst_buffer_unref (mpvparse->config); mpvparse->config = gst_buffer_new_and_alloc (size); - memcpy (GST_BUFFER_DATA (mpvparse->config), data, size); + gst_buffer_fill (mpvparse->config, 0, data, size); /* trigger src caps update */ mpvparse->update_caps = TRUE; + gst_buffer_unmap (buf, buf_data, buf_size); + return TRUE; } @@ -355,8 +359,12 @@ static void parse_picture_extension (GstMpegvParse * mpvparse, GstBuffer * buf, guint off) { GstMpegVideoPictureExt ext; - if (gst_mpeg_video_parse_picture_extension (&ext, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf), off)) { + gpointer data; + gsize size; + + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + + if (gst_mpeg_video_parse_picture_extension (&ext, data, size, off)) { mpvparse->frame_repeat_count = 1; if (ext.repeat_first_field) { @@ -370,6 +378,8 @@ parse_picture_extension (GstMpegvParse * mpvparse, GstBuffer * buf, guint off) } } } + + gst_buffer_unmap (buf, data, size); } /* caller guarantees at least start code in @buf at @off */ @@ -381,7 +391,7 @@ gst_mpegv_parse_process_sc (GstMpegvParse * mpvparse, { gboolean ret = FALSE, packet = TRUE; - g_return_val_if_fail (buf && GST_BUFFER_SIZE (buf) >= 4, FALSE); + g_return_val_if_fail (buf && gst_buffer_get_size (buf) >= 4, FALSE); GST_LOG_OBJECT (mpvparse, "process startcode %x (%s)", code, picture_start_code_name (code)); @@ -428,14 +438,19 @@ gst_mpegv_parse_process_sc (GstMpegvParse * mpvparse, /* extract some picture info if there is any in the frame being terminated */ if (ret && mpvparse->pic_offset >= 0 && mpvparse->pic_offset < off) { + gsize size; + gpointer data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + if (gst_mpeg_video_parse_picture_header (&mpvparse->pichdr, - GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), mpvparse->pic_offset)) + data, size, mpvparse->pic_offset)) GST_LOG_OBJECT (mpvparse, "picture_coding_type %d (%s), ending" "frame of size %d", mpvparse->pichdr.pic_type, picture_type_name (mpvparse->pichdr.pic_type), off - 4); else GST_LOG_OBJECT (mpvparse, "Couldn't parse picture at offset %d", mpvparse->pic_offset); + + gst_buffer_unmap (buf, data, size); } return ret; @@ -488,14 +503,17 @@ gst_mpegv_parse_check_valid_frame (GstBaseParse * parse, gboolean ret = FALSE; GList *tmp; gint off = 0, fsize = -1; + gpointer buf_data; + gsize buf_size; update_frame_parsing_status (mpvparse, frame); if (mpvparse->last_sc >= 0) off = mpvparse->last_sc; - mpvparse->typeoffsize = - gst_mpeg_video_parse (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), off); + buf_data = gst_buffer_map (buf, &buf_size, NULL, GST_MAP_READ); + mpvparse->typeoffsize = gst_mpeg_video_parse (buf_data, buf_size, off); + gst_buffer_unmap (buf, buf_data, buf_size); /* No sc found */ if (mpvparse->typeoffsize == NULL) @@ -532,15 +550,15 @@ end: *framesize = fsize; ret = TRUE; } else if (GST_BASE_PARSE_DRAINING (parse)) { - *framesize = GST_BUFFER_SIZE (buf); + *framesize = buf_size; ret = TRUE; } else { /* resume scan where we left it */ if (!mpvparse->last_sc) - *skipsize = mpvparse->last_sc = GST_BUFFER_SIZE (buf) - 3; + *skipsize = mpvparse->last_sc = buf_size - 3; else if (mpvparse->typeoffsize) - mpvparse->last_sc = GST_BUFFER_SIZE (buf) - 3; + mpvparse->last_sc = buf_size - 3; else *skipsize = 0; @@ -562,16 +580,16 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse) GstCaps *caps = NULL; /* only update if no src caps yet or explicitly triggered */ - if (G_LIKELY (GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (mpvparse)) && + if (G_LIKELY (gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (mpvparse)) && !mpvparse->update_caps)) return; /* carry over input caps as much as possible; override with our own stuff */ - caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (mpvparse)); + caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (mpvparse)); if (caps) { - caps = gst_caps_copy (caps); + caps = gst_caps_make_writable (caps); } else { - caps = gst_caps_new_simple ("video/mpeg", NULL); + caps = gst_caps_new_empty_simple ("video/mpeg"); } /* typically we don't output buffers until we have properly parsed some @@ -723,13 +741,11 @@ gst_mpegv_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) /* codec tag */ codec = g_strdup_printf ("MPEG %d Video", mpvparse->mpeg_version); - taglist = gst_tag_list_new (); - gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, - GST_TAG_VIDEO_CODEC, codec, NULL); + taglist = gst_tag_list_new (GST_TAG_VIDEO_CODEC, codec, NULL); g_free (codec); - gst_element_found_tags_for_pad (GST_ELEMENT (mpvparse), - GST_BASE_PARSE_SRC_PAD (mpvparse), taglist); + gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (mpvparse), + gst_event_new_tag (taglist)); mpvparse->send_codec_tag = FALSE; } @@ -757,7 +773,7 @@ gst_mpegv_parse_set_caps (GstBaseParse * parse, GstCaps * caps) /* best possible parse attempt, * src caps are based on sink caps so it will end up in there * whether sucessful or not */ - gst_mpegv_parse_process_config (mpvparse, buf, GST_BUFFER_SIZE (buf)); + gst_mpegv_parse_process_config (mpvparse, buf, gst_buffer_get_size (buf)); } /* let's not interfere and accept regardless of config parsing success */ @@ -765,7 +781,7 @@ gst_mpegv_parse_set_caps (GstBaseParse * parse, GstCaps * caps) } static GstCaps * -gst_mpegv_parse_get_caps (GstBaseParse * parse) +gst_mpegv_parse_get_caps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps; GstCaps *res; diff --git a/gst/videoparsers/h263parse.c b/gst/videoparsers/h263parse.c index 14911e79f..71f3661c9 100644 --- a/gst/videoparsers/h263parse.c +++ b/gst/videoparsers/h263parse.c @@ -73,14 +73,18 @@ gst_h263_parse_get_params (H263Params * params, GstBuffer * buffer, }; GstBitReader br; + guint8 *buf_data; + gsize buf_size; guint8 tr; guint32 psc = 0, temp32; guint8 temp8, pquant; gboolean hasplusptype; + buf_data = gst_buffer_map (buffer, &buf_size, NULL, GST_MAP_READ); + /* FIXME: we can optimise a little by checking the value of available * instead of calling using the bit reader's get_bits_* functions. */ - gst_bit_reader_init_from_buffer (&br, buffer); + gst_bit_reader_init (&br, buf_data, buf_size); /* Default PCF is CIF PCF = 30000/1001 */ params->pcfnum = 30000; @@ -445,10 +449,12 @@ gst_h263_parse_get_params (H263Params * params, GstBuffer * buffer, done: *state = GOT_HEADER; more: + gst_buffer_unmap (buffer, buf_data, buf_size); return GST_FLOW_OK; beach: *state = PASSTHROUGH; + gst_buffer_unmap (buffer, buf_data, buf_size); return GST_FLOW_OK; } diff --git a/gst/videosignal/gstvideoanalyse.c b/gst/videosignal/gstvideoanalyse.c index ab2d67483..7ca6626c2 100644 --- a/gst/videosignal/gstvideoanalyse.c +++ b/gst/videosignal/gstvideoanalyse.c @@ -279,10 +279,10 @@ gst_video_analyse_base_init (gpointer g_class) "Filter/Analyzer/Video", "Analyse video signal", "Wim Taymans <wim@fluendo.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_video_analyse_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_video_analyse_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_analyse_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_analyse_src_template)); } static void diff --git a/gst/videosignal/gstvideodetect.c b/gst/videosignal/gstvideodetect.c index 1e795d378..09de8b676 100644 --- a/gst/videosignal/gstvideodetect.c +++ b/gst/videosignal/gstvideodetect.c @@ -438,10 +438,10 @@ gst_video_detect_base_init (gpointer g_class) "Filter/Effect/Video", "Detect patterns in a video signal", "Wim Taymans <wim@fluendo.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_video_detect_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_video_detect_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_detect_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_detect_src_template)); } static void diff --git a/gst/videosignal/gstvideomark.c b/gst/videosignal/gstvideomark.c index 89fbf7092..c45820a31 100644 --- a/gst/videosignal/gstvideomark.c +++ b/gst/videosignal/gstvideomark.c @@ -325,10 +325,10 @@ gst_video_mark_base_init (gpointer g_class) "Filter/Effect/Video", "Marks a video signal with a pattern", "Wim Taymans <wim@fluendo.com>"); - gst_element_class_add_static_pad_template (element_class, - &gst_video_mark_sink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_video_mark_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_mark_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_video_mark_src_template)); } static void diff --git a/gst/vmnc/vmncdec.c b/gst/vmnc/vmncdec.c index 08085b54e..3db3511ee 100644 --- a/gst/vmnc/vmncdec.c +++ b/gst/vmnc/vmncdec.c @@ -168,10 +168,10 @@ gst_vmnc_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &vmnc_dec_src_factory); - gst_element_class_add_static_pad_template (element_class, - &vmnc_dec_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vmnc_dec_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vmnc_dec_sink_factory)); gst_element_class_set_details_simple (element_class, "VMnc video decoder", "Codec/Decoder/Video", "Decode VmWare video to raw (RGB) video", diff --git a/gst/y4m/gsty4mdec.c b/gst/y4m/gsty4mdec.c index b2ebfb786..277bb1ffe 100644 --- a/gst/y4m/gsty4mdec.c +++ b/gst/y4m/gsty4mdec.c @@ -55,11 +55,15 @@ static void gst_y4m_dec_get_property (GObject * object, static void gst_y4m_dec_dispose (GObject * object); static void gst_y4m_dec_finalize (GObject * object); -static GstFlowReturn gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer); -static gboolean gst_y4m_dec_sink_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_y4m_dec_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer); +static gboolean gst_y4m_dec_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event); -static gboolean gst_y4m_dec_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_y4m_dec_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_y4m_dec_src_event (GstPad * pad, GstObject * parent, + GstEvent * event); +static gboolean gst_y4m_dec_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstStateChangeReturn gst_y4m_dec_change_state (GstElement * element, GstStateChange transition); @@ -82,27 +86,12 @@ static GstStaticPadTemplate gst_y4m_dec_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{I420,Y42B,Y444}")) + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{I420,Y42B,Y444}")) ); /* class initialization */ - -GST_BOILERPLATE (GstY4mDec, gst_y4m_dec, GstElement, GST_TYPE_ELEMENT); - -static void -gst_y4m_dec_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_static_pad_template (element_class, - &gst_y4m_dec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_y4m_dec_sink_template); - - gst_element_class_set_details_simple (element_class, - "YUV4MPEG demuxer/decoder", "Codec/Demuxer", - "Demuxes/decodes YUV4MPEG streams", "David Schleef <ds@schleef.org>"); -} +#define gst_y4m_dec_parent_class parent_class +G_DEFINE_TYPE (GstY4mDec, gst_y4m_dec, GST_TYPE_ELEMENT); static void gst_y4m_dec_class_init (GstY4mDecClass * klass) @@ -114,12 +103,21 @@ gst_y4m_dec_class_init (GstY4mDecClass * klass) gobject_class->get_property = gst_y4m_dec_get_property; gobject_class->dispose = gst_y4m_dec_dispose; gobject_class->finalize = gst_y4m_dec_finalize; + element_class->change_state = GST_DEBUG_FUNCPTR (gst_y4m_dec_change_state); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_y4m_dec_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_y4m_dec_sink_template)); + + gst_element_class_set_details_simple (element_class, + "YUV4MPEG demuxer/decoder", "Codec/Demuxer", + "Demuxes/decodes YUV4MPEG streams", "David Schleef <ds@schleef.org>"); } static void -gst_y4m_dec_init (GstY4mDec * y4mdec, GstY4mDecClass * y4mdec_class) +gst_y4m_dec_init (GstY4mDec * y4mdec) { y4mdec->adapter = gst_adapter_new (); @@ -232,15 +230,15 @@ gst_y4m_dec_change_state (GstElement * element, GstStateChange transition) static GstClockTime gst_y4m_dec_frames_to_timestamp (GstY4mDec * y4mdec, int frame_index) { - return gst_util_uint64_scale (frame_index, GST_SECOND * y4mdec->fps_d, - y4mdec->fps_n); + return gst_util_uint64_scale (frame_index, GST_SECOND * y4mdec->info.fps_d, + y4mdec->info.fps_n); } static int gst_y4m_dec_timestamp_to_frames (GstY4mDec * y4mdec, GstClockTime timestamp) { - return gst_util_uint64_scale (timestamp, y4mdec->fps_n, - GST_SECOND * y4mdec->fps_d); + return gst_util_uint64_scale (timestamp, y4mdec->info.fps_n, + GST_SECOND * y4mdec->info.fps_d); } static int @@ -248,13 +246,13 @@ gst_y4m_dec_bytes_to_frames (GstY4mDec * y4mdec, gint64 bytes) { if (bytes < y4mdec->header_size) return 0; - return (bytes - y4mdec->header_size) / (y4mdec->frame_size + 6); + return (bytes - y4mdec->header_size) / (y4mdec->info.size + 6); } static gint64 gst_y4m_dec_frames_to_bytes (GstY4mDec * y4mdec, int frame_index) { - return y4mdec->header_size + (y4mdec->frame_size + 6) * frame_index; + return y4mdec->header_size + (y4mdec->info.size + 6) * frame_index; } static GstClockTime @@ -269,8 +267,12 @@ static gboolean gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) { char *end; - int format = 420; + int iformat = 420; int interlaced_char = 0; + gint fps_n = 0, fps_d = 0; + gint par_n = 0, par_d = 0; + gint width = 0, height = 0; + GstVideoFormat format; if (memcmp (header, "YUV4MPEG2 ", 10) != 0) { return FALSE; @@ -285,21 +287,21 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) break; case 'C': header++; - format = strtoul (header, &end, 10); + iformat = strtoul (header, &end, 10); if (end == header) goto error; header = end; break; case 'W': header++; - y4mdec->width = strtoul (header, &end, 10); + width = strtoul (header, &end, 10); if (end == header) goto error; header = end; break; case 'H': header++; - y4mdec->height = strtoul (header, &end, 10); + height = strtoul (header, &end, 10); if (end == header) goto error; header = end; @@ -315,7 +317,7 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) break; case 'F': header++; - y4mdec->fps_n = strtoul (header, &end, 10); + fps_n = strtoul (header, &end, 10); if (end == header) goto error; header = end; @@ -324,14 +326,14 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) return FALSE; } header++; - y4mdec->fps_d = strtoul (header, &end, 10); + fps_d = strtoul (header, &end, 10); if (end == header) goto error; header = end; break; case 'A': header++; - y4mdec->par_n = strtoul (header, &end, 10); + par_n = strtoul (header, &end, 10); if (end == header) goto error; header = end; @@ -340,7 +342,7 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) return FALSE; } header++; - y4mdec->par_d = strtoul (header, &end, 10); + par_d = strtoul (header, &end, 10); if (end == header) goto error; header = end; @@ -354,41 +356,41 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) } } - switch (format) { + switch (iformat) { case 420: - y4mdec->format = GST_VIDEO_FORMAT_I420; + format = GST_VIDEO_FORMAT_I420; break; case 422: - y4mdec->format = GST_VIDEO_FORMAT_Y42B; + format = GST_VIDEO_FORMAT_Y42B; break; case 444: - y4mdec->format = GST_VIDEO_FORMAT_Y444; + format = GST_VIDEO_FORMAT_Y444; break; default: - GST_WARNING_OBJECT (y4mdec, "unknown y4m format %d", format); + GST_WARNING_OBJECT (y4mdec, "unknown y4m format %d", iformat); return FALSE; } - if (y4mdec->width <= 0 || y4mdec->width > MAX_SIZE || - y4mdec->height <= 0 || y4mdec->height > MAX_SIZE) { - GST_WARNING_OBJECT (y4mdec, "Dimensions %dx%d out of range", - y4mdec->width, y4mdec->height); + if (width <= 0 || width > MAX_SIZE || height <= 0 || height > MAX_SIZE) { + GST_WARNING_OBJECT (y4mdec, "Dimensions %dx%d out of range", width, height); return FALSE; } - y4mdec->frame_size = gst_video_format_get_size (y4mdec->format, - y4mdec->width, y4mdec->height); + gst_video_info_set_format (&y4mdec->info, format, width, height); switch (interlaced_char) { case 0: case '?': case 'p': - y4mdec->interlaced = FALSE; + y4mdec->info.interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; + y4mdec->info.flags &= ~GST_VIDEO_FLAG_INTERLACED; break; case 't': case 'b': - y4mdec->interlaced = TRUE; - y4mdec->tff = (interlaced_char == 't'); + y4mdec->info.interlace_mode = GST_VIDEO_INTERLACE_MODE_INTERLEAVED; + y4mdec->info.flags |= GST_VIDEO_FLAG_INTERLACED; + if (interlaced_char == 't') + y4mdec->info.flags |= GST_VIDEO_FLAG_TFF; break; default: GST_WARNING_OBJECT (y4mdec, "Unknown interlaced char '%c'", @@ -397,14 +399,19 @@ gst_y4m_dec_parse_header (GstY4mDec * y4mdec, char *header) break; } - if (y4mdec->fps_n == 0) - y4mdec->fps_n = 1; - if (y4mdec->fps_d == 0) - y4mdec->fps_d = 1; - if (y4mdec->par_n == 0) - y4mdec->par_n = 1; - if (y4mdec->par_d == 0) - y4mdec->par_d = 1; + if (fps_n == 0) + fps_n = 1; + if (fps_d == 0) + fps_d = 1; + if (par_n == 0) + par_n = 1; + if (par_d == 0) + par_d = 1; + + y4mdec->info.fps_n = fps_n; + y4mdec->info.fps_d = fps_d; + y4mdec->info.par_n = par_n; + y4mdec->info.par_d = par_d; return TRUE; error: @@ -413,7 +420,7 @@ error: } static GstFlowReturn -gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) +gst_y4m_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstY4mDec *y4mdec; int n_avail; @@ -423,7 +430,7 @@ gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) int i; int len; - y4mdec = GST_Y4M_DEC (gst_pad_get_parent (pad)); + y4mdec = GST_Y4M_DEC (parent); GST_DEBUG_OBJECT (y4mdec, "chain"); @@ -460,10 +467,7 @@ gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) y4mdec->header_size = strlen (header) + 1; gst_adapter_flush (y4mdec->adapter, y4mdec->header_size); - caps = gst_video_format_new_caps_interlaced (y4mdec->format, - y4mdec->width, y4mdec->height, - y4mdec->fps_n, y4mdec->fps_d, - y4mdec->par_n, y4mdec->par_d, y4mdec->interlaced); + caps = gst_video_info_to_caps (&y4mdec->info); ret = gst_pad_set_caps (y4mdec->srcpad, caps); gst_caps_unref (caps); if (!ret) { @@ -477,21 +481,25 @@ gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) if (y4mdec->have_new_segment) { GstEvent *event; GstClockTime start = gst_y4m_dec_bytes_to_timestamp (y4mdec, - y4mdec->segment_start); + y4mdec->segment.start); GstClockTime stop = gst_y4m_dec_bytes_to_timestamp (y4mdec, - y4mdec->segment_stop); - GstClockTime position = gst_y4m_dec_bytes_to_timestamp (y4mdec, - y4mdec->segment_position); + y4mdec->segment.stop); + GstClockTime time = gst_y4m_dec_bytes_to_timestamp (y4mdec, + y4mdec->segment.time); + GstSegment seg; - event = gst_event_new_new_segment (FALSE, 1.0, - GST_FORMAT_TIME, start, stop, position); + gst_segment_init (&seg, GST_FORMAT_TIME); + seg.start = start; + seg.stop = stop; + seg.time = time; + event = gst_event_new_segment (&seg); gst_pad_push_event (y4mdec->srcpad, event); //gst_event_unref (event); y4mdec->have_new_segment = FALSE; y4mdec->frame_index = gst_y4m_dec_bytes_to_frames (y4mdec, - y4mdec->segment_position); + y4mdec->segment.time); GST_DEBUG ("new frame_index %d", y4mdec->frame_index); } @@ -515,25 +523,24 @@ gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) } len = strlen (header); - if (n_avail < y4mdec->frame_size + len + 1) { + if (n_avail < y4mdec->info.size + len + 1) { /* not enough data */ - GST_DEBUG ("not enough data for frame %d < %d", - n_avail, y4mdec->frame_size + len + 1); + GST_DEBUG ("not enough data for frame %d < %" G_GSIZE_FORMAT, + n_avail, y4mdec->info.size + len + 1); break; } gst_adapter_flush (y4mdec->adapter, len + 1); - buffer = gst_adapter_take_buffer (y4mdec->adapter, y4mdec->frame_size); + buffer = gst_adapter_take_buffer (y4mdec->adapter, y4mdec->info.size); - GST_BUFFER_CAPS (buffer) = gst_caps_ref (GST_PAD_CAPS (y4mdec->srcpad)); GST_BUFFER_TIMESTAMP (buffer) = gst_y4m_dec_frames_to_timestamp (y4mdec, y4mdec->frame_index); GST_BUFFER_DURATION (buffer) = gst_y4m_dec_frames_to_timestamp (y4mdec, y4mdec->frame_index + 1) - GST_BUFFER_TIMESTAMP (buffer); - if (y4mdec->interlaced && y4mdec->tff) { - GST_BUFFER_FLAG_SET (buffer, GST_VIDEO_BUFFER_TFF); + if (y4mdec->info.flags & GST_VIDEO_FLAG_TFF) { + GST_BUFFER_FLAG_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF); } y4mdec->frame_index++; @@ -543,18 +550,18 @@ gst_y4m_dec_chain (GstPad * pad, GstBuffer * buffer) break; } - gst_object_unref (y4mdec); GST_DEBUG ("returning %d", flow_ret); + return flow_ret; } static gboolean -gst_y4m_dec_sink_event (GstPad * pad, GstEvent * event) +gst_y4m_dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res; GstY4mDec *y4mdec; - y4mdec = GST_Y4M_DEC (gst_pad_get_parent (pad)); + y4mdec = GST_Y4M_DEC (parent); GST_DEBUG_OBJECT (y4mdec, "event"); @@ -565,28 +572,16 @@ gst_y4m_dec_sink_event (GstPad * pad, GstEvent * event) case GST_EVENT_FLUSH_STOP: res = gst_pad_push_event (y4mdec->srcpad, event); break; - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: { - gboolean update; - gdouble rate; - gdouble applied_rate; - GstFormat format; - gint64 start; - gint64 stop; - gint64 position; - - gst_event_parse_new_segment_full (event, &update, &rate, - &applied_rate, &format, &start, &stop, &position); - - GST_DEBUG ("new_segment: update: %d rate: %g applied_rate: %g " - "format: %d start: %" G_GUINT64_FORMAT " stop: %" G_GUINT64_FORMAT - " position %" G_GUINT64_FORMAT, - update, rate, applied_rate, format, start, stop, position); - - if (format == GST_FORMAT_BYTES) { - y4mdec->segment_start = start; - y4mdec->segment_stop = stop; - y4mdec->segment_position = position; + GstSegment seg; + + gst_event_copy_segment (event, &seg); + + GST_DEBUG ("segment: %" GST_SEGMENT_FORMAT, &seg); + + if (seg.format == GST_FORMAT_BYTES) { + y4mdec->segment = seg; y4mdec->have_new_segment = TRUE; } @@ -602,17 +597,16 @@ gst_y4m_dec_sink_event (GstPad * pad, GstEvent * event) break; } - gst_object_unref (y4mdec); return res; } static gboolean -gst_y4m_dec_src_event (GstPad * pad, GstEvent * event) +gst_y4m_dec_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res; GstY4mDec *y4mdec; - y4mdec = GST_Y4M_DEC (gst_pad_get_parent (pad)); + y4mdec = GST_Y4M_DEC (parent); GST_DEBUG_OBJECT (y4mdec, "event"); @@ -653,21 +647,20 @@ gst_y4m_dec_src_event (GstPad * pad, GstEvent * event) break; } - gst_object_unref (y4mdec); return res; } static gboolean -gst_y4m_dec_src_query (GstPad * pad, GstQuery * query) +gst_y4m_dec_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { - GstY4mDec *y4mdec = GST_Y4M_DEC (gst_pad_get_parent (pad)); + GstY4mDec *y4mdec = GST_Y4M_DEC (parent); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; - GstPad *peer; + GstQuery *peer_query; GST_DEBUG ("duration query"); @@ -680,39 +673,33 @@ gst_y4m_dec_src_query (GstPad * pad, GstQuery * query) break; } - peer = gst_pad_get_peer (y4mdec->sinkpad); - if (peer) { - GstQuery *peer_query = gst_query_new_duration (GST_FORMAT_BYTES); - - res = gst_pad_query (peer, peer_query); - if (res) { - gint64 duration; - int n_frames; + peer_query = gst_query_new_duration (GST_FORMAT_BYTES); - gst_query_parse_duration (peer_query, &format, &duration); + res = gst_pad_peer_query (y4mdec->sinkpad, peer_query); + if (res) { + gint64 duration; + int n_frames; - n_frames = gst_y4m_dec_bytes_to_frames (y4mdec, duration); - GST_DEBUG ("duration in frames %d", n_frames); + gst_query_parse_duration (peer_query, &format, &duration); - duration = gst_y4m_dec_frames_to_timestamp (y4mdec, n_frames); - GST_DEBUG ("duration in time %" GST_TIME_FORMAT, - GST_TIME_ARGS (duration)); + n_frames = gst_y4m_dec_bytes_to_frames (y4mdec, duration); + GST_DEBUG ("duration in frames %d", n_frames); - gst_query_set_duration (query, GST_FORMAT_TIME, duration); - res = TRUE; - } + duration = gst_y4m_dec_frames_to_timestamp (y4mdec, n_frames); + GST_DEBUG ("duration in time %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration)); - gst_query_unref (peer_query); - gst_object_unref (peer); + gst_query_set_duration (query, GST_FORMAT_TIME, duration); + res = TRUE; } + gst_query_unref (peer_query); break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } - gst_object_unref (y4mdec); return res; } diff --git a/gst/y4m/gsty4mdec.h b/gst/y4m/gsty4mdec.h index 6ea6ca118..97a7858bb 100644 --- a/gst/y4m/gsty4mdec.h +++ b/gst/y4m/gsty4mdec.h @@ -48,20 +48,9 @@ struct _GstY4mDec int header_size; gboolean have_new_segment; - gint64 segment_start; - gint64 segment_stop; - gint64 segment_position; + GstSegment segment; - int width; - int height; - GstVideoFormat format; - gboolean interlaced; - gboolean tff; - int fps_n; - int fps_d; - int par_n; - int par_d; - int frame_size; + GstVideoInfo info; }; struct _GstY4mDecClass diff --git a/sys/Makefile.am b/sys/Makefile.am index a48b0d25b..d15f8282c 100644 --- a/sys/Makefile.am +++ b/sys/Makefile.am @@ -95,11 +95,11 @@ else ACM_DIR= endif -if USE_VDPAU -VDPAU_DIR=vdpau -else -VDPAU_DIR= -endif +#if USE_VDPAU +#VDPAU_DIR=vdpau +#else +#VDPAU_DIR= +#endif if USE_SHM diff --git a/sys/acmenc/acmenc.c b/sys/acmenc/acmenc.c index 2b637a54c..b2db28eba 100644 --- a/sys/acmenc/acmenc.c +++ b/sys/acmenc/acmenc.c @@ -470,10 +470,10 @@ acmenc_base_init (ACMEncClass * klass) gchar *shortname, *longname, *detail, *description; MMRESULT res; - gst_element_class_add_static_pad_template (element_class, - &acmenc_sink_template); - gst_element_class_add_static_pad_template (element_class, - &acmenc_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&acmenc_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&acmenc_src_template)); params = (ACMEncParams *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), ACMENC_PARAMS_QDATA); diff --git a/sys/acmmp3dec/acmmp3dec.c b/sys/acmmp3dec/acmmp3dec.c index 870a9bff3..2f2799270 100644 --- a/sys/acmmp3dec/acmmp3dec.c +++ b/sys/acmmp3dec/acmmp3dec.c @@ -405,10 +405,10 @@ acmmp3dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &acmmp3dec_sink_template); - gst_element_class_add_static_pad_template (element_class, - &acmmp3dec_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&acmmp3dec_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&acmmp3dec_src_template)); gst_element_class_set_details_simple (element_class, "ACM MP3 decoder", "Codec/Decoder/Audio", "Decode MP3 using ACM decoder", diff --git a/sys/applemedia/avfvideosrc.m b/sys/applemedia/avfvideosrc.m index d20f94207..37ff576f5 100644 --- a/sys/applemedia/avfvideosrc.m +++ b/sys/applemedia/avfvideosrc.m @@ -567,7 +567,8 @@ gst_avf_video_src_base_init (gpointer gclass) "Reads frames from an iOS AVFoundation device", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); } static void diff --git a/sys/applemedia/celvideosrc.c b/sys/applemedia/celvideosrc.c index 2ef107631..6ea15e88f 100644 --- a/sys/applemedia/celvideosrc.c +++ b/sys/applemedia/celvideosrc.c @@ -833,7 +833,8 @@ gst_cel_video_src_base_init (gpointer gclass) "Reads frames from an iOS Celestial device", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); } static void diff --git a/sys/applemedia/miovideosrc.c b/sys/applemedia/miovideosrc.c index aec4a56a7..7b0e428c4 100644 --- a/sys/applemedia/miovideosrc.c +++ b/sys/applemedia/miovideosrc.c @@ -1129,7 +1129,8 @@ gst_mio_video_src_base_init (gpointer gclass) "Reads frames from a Mac OS X MIO device", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); } static void diff --git a/sys/applemedia/qtkitvideosrc.m b/sys/applemedia/qtkitvideosrc.m index 8553bd13b..c228692dd 100644 --- a/sys/applemedia/qtkitvideosrc.m +++ b/sys/applemedia/qtkitvideosrc.m @@ -524,7 +524,8 @@ gst_qtkit_video_src_base_init (gpointer gclass) "Reads frames from a Mac OS X QTKit device", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); } static void diff --git a/sys/applemedia/vtdec.c b/sys/applemedia/vtdec.c index 982f73c6f..22db2e869 100644 --- a/sys/applemedia/vtdec.c +++ b/sys/applemedia/vtdec.c @@ -89,7 +89,6 @@ gst_vtdec_base_init (GstVTDecClass * klass) sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps); gst_element_class_add_pad_template (element_class, sink_template); - gst_object_unref (sink_template); src_template = gst_pad_template_new ("src", GST_PAD_SRC, @@ -101,7 +100,6 @@ gst_vtdec_base_init (GstVTDecClass * klass) "framerate", GST_TYPE_FRACTION_RANGE, min_fps_n, min_fps_d, max_fps_n, max_fps_d, NULL)); gst_element_class_add_pad_template (element_class, src_template); - gst_object_unref (src_template); } static void diff --git a/sys/applemedia/vtenc.c b/sys/applemedia/vtenc.c index aa0bcdda6..c7878482c 100644 --- a/sys/applemedia/vtenc.c +++ b/sys/applemedia/vtenc.c @@ -118,7 +118,6 @@ gst_vtenc_base_init (GstVTEncClass * klass) "framerate", GST_TYPE_FRACTION_RANGE, min_fps_n, min_fps_d, max_fps_n, max_fps_d, NULL)); gst_element_class_add_pad_template (element_class, sink_template); - gst_object_unref (sink_template); src_caps = gst_caps_new_simple (codec_details->mimetype, "width", GST_TYPE_INT_RANGE, min_width, max_width, @@ -132,7 +131,6 @@ gst_vtenc_base_init (GstVTEncClass * klass) src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps); gst_element_class_add_pad_template (element_class, src_template); - gst_object_unref (src_template); } static void diff --git a/sys/applemedia/vth264decbin.c b/sys/applemedia/vth264decbin.c index 816e15ec5..fbc718b3a 100644 --- a/sys/applemedia/vth264decbin.c +++ b/sys/applemedia/vth264decbin.c @@ -218,10 +218,10 @@ gst_vt_h264_dec_bin_base_init (gpointer gclass) "VideoToolbox H.264 decoder bin", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, - &vth264decbin_sink_template); - gst_element_class_add_static_pad_template (element_class, - &vth264decbin_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vth264decbin_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vth264decbin_src_template)); } static void diff --git a/sys/applemedia/vth264encbin.c b/sys/applemedia/vth264encbin.c index 222a73142..e97ef29d5 100644 --- a/sys/applemedia/vth264encbin.c +++ b/sys/applemedia/vth264encbin.c @@ -80,10 +80,10 @@ gst_vt_h264_enc_bin_base_init (gpointer gclass) "VideoToolbox H.264 encoder bin", "Ole André Vadla Ravnås <oravnas@cisco.com>"); - gst_element_class_add_static_pad_template (element_class, - &vth264encbin_sink_template); - gst_element_class_add_static_pad_template (element_class, - &vth264encbin_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vth264encbin_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&vth264encbin_src_template)); } static void diff --git a/sys/avc/gstavcsrc.cpp b/sys/avc/gstavcsrc.cpp index 405355282..c63c9853a 100644 --- a/sys/avc/gstavcsrc.cpp +++ b/sys/avc/gstavcsrc.cpp @@ -99,8 +99,8 @@ gst_avc_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_avc_src_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_avc_src_src_template)); gst_element_class_set_details_simple (element_class, "AVC Video Services Source", "Video/Source", diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index 53d5c89ff..9ca6b960e 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -278,8 +278,8 @@ gst_d3dvideosink_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "Direct3D video sink", "Sink/Video", diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp index bc24cfefe..922419774 100644 --- a/sys/decklink/gstdecklinksink.cpp +++ b/sys/decklink/gstdecklinksink.cpp @@ -158,10 +158,10 @@ gst_decklink_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_decklink_sink_videosink_template); - gst_element_class_add_static_pad_template (element_class, - &gst_decklink_sink_audiosink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_decklink_sink_videosink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_decklink_sink_audiosink_template)); gst_element_class_set_details_simple (element_class, "Decklink Sink", "Video/Sink", "Decklink Sink", "David Schleef <ds@entropywave.com>"); @@ -546,7 +546,7 @@ static gboolean gst_decklink_sink_set_clock (GstElement * element, GstClock * clock) { - return TRUE; + return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock); } static GstIndex * diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index b2e2c5127..61b546ede 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -153,15 +153,12 @@ static void gst_decklink_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - GstPadTemplate *pad_template; - gst_element_class_add_static_pad_template (element_class, - &gst_decklink_src_audio_src_template); - pad_template = + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_decklink_src_audio_src_template)); + gst_element_class_add_pad_template (element_class, gst_pad_template_new ("videosrc", GST_PAD_SRC, GST_PAD_ALWAYS, - gst_decklink_mode_get_template_caps ()); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); + gst_decklink_mode_get_template_caps ())); gst_element_class_set_details_simple (element_class, "Decklink source", "Source/Video", "DeckLink Source", "David Schleef <ds@entropywave.com>"); @@ -731,7 +728,7 @@ static gboolean gst_decklink_src_set_clock (GstElement * element, GstClock * clock) { - return TRUE; + return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock); } static GstIndex * diff --git a/sys/decklink/win/DeckLinkAPI_i.c b/sys/decklink/win/DeckLinkAPI_i.c index e9346db6a..ca14206ac 100644 --- a/sys/decklink/win/DeckLinkAPI_i.c +++ b/sys/decklink/win/DeckLinkAPI_i.c @@ -18,12 +18,13 @@ */ //@@MIDL_FILE_HEADING( ) -#pragma warning( disable: 4049 ) /* more than 64k source lines */ +#pragma warning( disable: 4049 ) /* more than 64k source lines */ #ifdef __cplusplus -extern "C"{ -#endif +extern "C" +{ +#endif #include <rpc.h> @@ -42,218 +43,277 @@ extern "C"{ #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_ +#else // !_MIDL_USE_GUIDDEF_ #ifndef __IID_DEFINED__ #define __IID_DEFINED__ -typedef struct _IID -{ + typedef struct _IID + { unsigned long x; unsigned short s1; unsigned short s2; - unsigned char c[8]; -} IID; + unsigned char c[8]; + } IID; -#endif // __IID_DEFINED__ +#endif // __IID_DEFINED__ #ifndef CLSID_DEFINED #define CLSID_DEFINED -typedef IID CLSID; -#endif // 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_ +#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, LIBID_DeckLinkAPI, 0xD864517A, 0xEDD5, 0x466D, 0x86, + 0x7D, 0xC8, 0x19, 0xF1, 0xC0, 0x52, 0xBB); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback,0x20AA5225,0x1958,0x47CB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE); + 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_IDeckLinkInputCallback, 0xDD04E5EC, 0x7415, + 0x42AB, 0xAE, 0x4A, 0xE8, 0x0C, 0x4D, 0xFC, 0x04, 0x4A); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkMemoryAllocator,0xB36EB6E7,0x9D29,0x4AA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8); + 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_IDeckLinkAudioOutputCallback, 0x403C681B, 0x7F46, + 0x4A12, 0xB9, 0x93, 0x2B, 0xB1, 0x27, 0x08, 0x4E, 0xE6); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator,0x74E936FC,0xCC28,0x4A67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkIterator, 0x74E936FC, 0xCC28, 0x4A67, + 0x81, 0xA0, 0x1E, 0x94, 0xE5, 0x2D, 0x4E, 0x69); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAPIInformation,0x7BEA3C68,0x730D,0x4322,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkAPIInformation, 0x7BEA3C68, 0x730D, + 0x4322, 0xAF, 0x34, 0x8A, 0x71, 0x52, 0xB5, 0x32, 0xA4); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator,0x9C88499F,0xF601,0x4021,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35); + 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_IDeckLinkDisplayMode, 0x3EB2C1AB, 0x0A3D, 0x4523, + 0xA3, 0xAD, 0xF4, 0x0D, 0x7F, 0xB1, 0x4E, 0x78); -MIDL_DEFINE_GUID(IID, IID_IDeckLink,0x62BFF75D,0x6569,0x4E55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC); + MIDL_DEFINE_GUID (IID, IID_IDeckLink, 0x62BFF75D, 0x6569, 0x4E55, 0x8D, + 0x4D, 0x66, 0xAA, 0x03, 0x82, 0x9A, 0xBC); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput,0xA3EF0963,0x0862,0x44ED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkOutput, 0xA3EF0963, 0x0862, 0x44ED, + 0x92, 0xA9, 0xEE, 0x89, 0xAB, 0xF4, 0x31, 0xC7); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput,0x6D40EF78,0x28B9,0x4E21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkInput, 0x6D40EF78, 0x28B9, 0x4E21, 0x99, + 0x0D, 0x95, 0xBB, 0x77, 0x50, 0xA0, 0x4F); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode,0xBC6CFBD3,0x8317,0x4325,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkTimecode, 0xBC6CFBD3, 0x8317, 0x4325, + 0xAC, 0x1C, 0x12, 0x16, 0x39, 0x1E, 0x93, 0x40); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame,0x3F716FE0,0xF023,0x4111,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17); + 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_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_IDeckLinkVideoFrame3DExtensions, 0xDA0F7E4A, + 0xEDC7, 0x48A8, 0x9C, 0xDD, 0x2D, 0xB5, 0x1C, 0x72, 0x9C, 0xD7); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame,0x05CFE374,0x537C,0x4094,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkVideoInputFrame, 0x05CFE374, 0x537C, + 0x4094, 0x9A, 0x57, 0x68, 0x05, 0x25, 0x11, 0x8F, 0x44); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillary,0x732E723C,0xD1A4,0x4E29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkVideoFrameAncillary, 0x732E723C, 0xD1A4, + 0x4E29, 0x9E, 0x8E, 0x4A, 0x88, 0x79, 0x7A, 0x00, 0x04); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket,0xE43D5870,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66); + 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_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_IDeckLinkGLScreenPreviewHelper, 0x504E2209, + 0xCAC7, 0x4C1A, 0x9F, 0xB4, 0xC5, 0xBB, 0x62, 0x74, 0xD2, 0x2F); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration,0xC679A35B,0x610C,0x4D09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkConfiguration, 0xC679A35B, 0x610C, + 0x4D09, 0xB7, 0x48, 0x1D, 0x04, 0x78, 0x10, 0x0F, 0xC0); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAttributes,0xABC11843,0xD966,0x44CB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkAttributes, 0xABC11843, 0xD966, 0x44CB, + 0x96, 0xE2, 0xA1, 0xCB, 0x5D, 0x31, 0x35, 0xC4); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkKeyer,0x89AFCAF5,0x65F8,0x421E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3); + 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_IDeckLinkVideoConversion, 0x3BBCB8A2, 0xDA2C, + 0x42D9, 0xB5, 0xD8, 0x88, 0x08, 0x36, 0x44, 0xE9, 0x9A); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControlStatusCallback,0xE5F693C1,0x4283,0x4716,0xB1,0x8F,0xC1,0x43,0x15,0x21,0x95,0x5B); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkDeckControlStatusCallback, 0xE5F693C1, + 0x4283, 0x4716, 0xB1, 0x8F, 0xC1, 0x43, 0x15, 0x21, 0x95, 0x5B); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl,0x522A9E39,0x0F3C,0x4742,0x94,0xEE,0xD8,0x0D,0xE3,0x35,0xDA,0x1D); + MIDL_DEFINE_GUID (IID, IID_IDeckLinkDeckControl, 0x522A9E39, 0x0F3C, 0x4742, + 0x94, 0xEE, 0xD8, 0x0D, 0xE3, 0x35, 0xDA, 0x1D); -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator,0xD9EDA3B3,0x2887,0x41FA,0xB7,0x24,0x01,0x7C,0xF1,0xEB,0x1D,0x37); + MIDL_DEFINE_GUID (CLSID, CLSID_CDeckLinkIterator, 0xD9EDA3B3, 0x2887, + 0x41FA, 0xB7, 0x24, 0x01, 0x7C, 0xF1, 0xEB, 0x1D, 0x37); -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkAPIInformation,0x263CA19F,0xED09,0x482E,0x9F,0x9D,0x84,0x00,0x57,0x83,0xA2,0x37); + 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_CDeckLinkGLScreenPreviewHelper, 0xF63E77C7, + 0xB655, 0x4A4A, 0x9A, 0xD0, 0x3C, 0xA8, 0x5D, 0x39, 0x43, 0x43); -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoConversion,0x7DBBBB11,0x5B7B,0x467D,0xAE,0xA4,0xCE,0xA4,0x68,0xFD,0x36,0x8C); + MIDL_DEFINE_GUID (CLSID, CLSID_CDeckLinkVideoConversion, 0x7DBBBB11, 0x5B7B, + 0x467D, 0xAE, 0xA4, 0xCE, 0xA4, 0x68, 0xFD, 0x36, 0x8C); -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl_v7_9,0xA4D81043,0x0619,0x42B7,0x8E,0xD6,0x60,0x2D,0x29,0x04,0x1D,0xF7); + 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_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_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_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_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_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_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_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_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_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_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_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_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_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 (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_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 (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_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_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_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_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_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_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_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_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_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_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_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_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); + 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 - - - diff --git a/sys/directdraw/gstdirectdrawsink.c b/sys/directdraw/gstdirectdrawsink.c index bd9b79ca1..429aa7ad1 100644 --- a/sys/directdraw/gstdirectdrawsink.c +++ b/sys/directdraw/gstdirectdrawsink.c @@ -386,8 +386,8 @@ gst_directdraw_sink_base_init (gpointer g_class) "Sink/Video", "Output to a video card via Direct Draw", "Sebastien Moutte <sebastien@moutte.net>"); - gst_element_class_add_static_pad_template (element_class, - &directdrawsink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&directdrawsink_sink_factory)); } static void diff --git a/sys/directsound/gstdirectsoundsrc.c b/sys/directsound/gstdirectsoundsrc.c index 7f0072d25..54282f664 100644 --- a/sys/directsound/gstdirectsoundsrc.c +++ b/sys/directsound/gstdirectsoundsrc.c @@ -156,8 +156,8 @@ gst_directsound_src_base_init (gpointer g_class) "Capture from a soundcard via DIRECTSOUND", "Joni Valtanen <joni.valtanen@movial.fi>"); - gst_element_class_add_static_pad_template (element_class, - &directsound_src_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&directsound_src_src_factory)); } diff --git a/sys/dshowdecwrapper/gstdshowaudiodec.cpp b/sys/dshowdecwrapper/gstdshowaudiodec.cpp index bd4bd6496..f10ac8cdc 100644 --- a/sys/dshowdecwrapper/gstdshowaudiodec.cpp +++ b/sys/dshowdecwrapper/gstdshowaudiodec.cpp @@ -349,9 +349,6 @@ gst_dshowaudiodec_base_init (gpointer klass) /* register */ gst_element_class_add_pad_template (element_class, src); gst_element_class_add_pad_template (element_class, sink); - - gst_object_unref (src); - gst_object_unref (sink); } static void diff --git a/sys/dshowdecwrapper/gstdshowvideodec.cpp b/sys/dshowdecwrapper/gstdshowvideodec.cpp index fdcfb28bb..663e98043 100644 --- a/sys/dshowdecwrapper/gstdshowvideodec.cpp +++ b/sys/dshowdecwrapper/gstdshowvideodec.cpp @@ -401,9 +401,6 @@ gst_dshowvideodec_base_init (gpointer klass) gst_element_class_add_pad_template (element_class, src); gst_element_class_add_pad_template (element_class, sink); - - gst_object_unref (src); - gst_object_unref (sink); } static void diff --git a/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp index fcd9f2fc5..e7fbadaab 100644 --- a/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp +++ b/sys/dshowsrcwrapper/gstdshowaudiosrc.cpp @@ -118,7 +118,8 @@ gst_dshowaudiosrc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Directshow audio capture source", "Source/Audio", diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp index 3fa13df3b..e84148ab4 100644 --- a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp +++ b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp @@ -126,7 +126,8 @@ gst_dshowvideosrc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "DirectShow video capture source", "Source/Video", diff --git a/sys/dshowvideosink/dshowvideosink.cpp b/sys/dshowvideosink/dshowvideosink.cpp index 5ac2a5f3b..8b8554ca6 100644 --- a/sys/dshowvideosink/dshowvideosink.cpp +++ b/sys/dshowvideosink/dshowvideosink.cpp @@ -212,14 +212,13 @@ gst_dshowvideosink_init_interfaces (GType type) GST_DEBUG_CATEGORY_INIT (dshowvideosink_debug, "dshowvideosink", 0, \ "DirectShow video sink"); } - static void gst_dshowvideosink_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "DirectShow video sink", "Sink/Video", "Display data using a DirectShow video renderer", diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c index a90860a7f..c0b7dd78d 100644 --- a/sys/dvb/dvbbasebin.c +++ b/sys/dvb/dvbbasebin.c @@ -34,13 +34,13 @@ GST_DEBUG_CATEGORY_STATIC (dvb_base_bin_debug); #define GST_CAT_DEFAULT dvb_base_bin_debug static GstStaticPadTemplate src_template = -GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); static GstStaticPadTemplate program_template = -GST_STATIC_PAD_TEMPLATE ("program_%d", GST_PAD_SRC, +GST_STATIC_PAD_TEMPLATE ("program_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("video/mpegts, " "systemstream = (boolean) true ") ); @@ -99,21 +99,21 @@ static void dvb_base_bin_get_property (GObject * object, guint prop_id, static void dvb_base_bin_dispose (GObject * object); static void dvb_base_bin_finalize (GObject * object); -static gboolean dvb_base_bin_ts_pad_probe_cb (GstPad * pad, - GstBuffer * buf, gpointer user_data); +static GstPadProbeReturn dvb_base_bin_ts_pad_probe_cb (GstPad * pad, + GstPadProbeInfo * info, gpointer user_data); static GstStateChangeReturn dvb_base_bin_change_state (GstElement * element, GstStateChange transition); static void dvb_base_bin_handle_message (GstBin * bin, GstMessage * message); static void dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, - GstStructure * pat); + const GstStructure * pat); static void dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, - GstStructure * pmt); + const GstStructure * pmt); static void dvb_base_bin_pad_added_cb (GstElement * mpegtsparse, GstPad * pad, DvbBaseBin * dvbbasebin); static void dvb_base_bin_pad_removed_cb (GstElement * mpegtsparse, GstPad * pad, DvbBaseBin * dvbbasebin); static GstPad *dvb_base_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name); + GstPadTemplate * templ, const gchar * name, const GstCaps * caps); static void dvb_base_bin_release_pad (GstElement * element, GstPad * pad); static void dvb_base_bin_rebuild_filter (DvbBaseBin * dvbbasebin); @@ -122,18 +122,6 @@ static void dvb_base_bin_uri_handler_init (gpointer g_iface, static void dvb_base_bin_program_destroy (gpointer data); -static void -dvb_base_bin_setup_interfaces (GType type) -{ - static const GInterfaceInfo urihandler_info = { - dvb_base_bin_uri_handler_init, - NULL, - NULL, - }; - - g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); -} - static DvbBaseBinStream * dvb_base_bin_add_stream (DvbBaseBin * dvbbasebin, guint16 pid) { @@ -187,26 +175,10 @@ dvb_base_bin_get_program (DvbBaseBin * dvbbasebin, gint program_number) static guint signals [LAST_SIGNAL] = { 0 }; */ -GST_BOILERPLATE_FULL (DvbBaseBin, dvb_base_bin, GstBin, GST_TYPE_BIN, - dvb_base_bin_setup_interfaces); - -static void -dvb_base_bin_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - element_class->request_new_pad = dvb_base_bin_request_new_pad; - element_class->release_pad = dvb_base_bin_release_pad; - - gst_element_class_add_static_pad_template (element_class, - &program_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_details_simple (element_class, "DVB bin", - "Source/Bin/Video", - "Access descramble and split DVB streams", - "Alessandro Decina <alessandro@nnva.org>"); -} +#define dvb_base_bin_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (DvbBaseBin, dvb_base_bin, GST_TYPE_BIN, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, + dvb_base_bin_uri_handler_init)); static void dvb_base_bin_class_init (DvbBaseBinClass * klass) @@ -246,6 +218,18 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass) element_class = GST_ELEMENT_CLASS (klass); element_class->change_state = dvb_base_bin_change_state; + element_class->request_new_pad = dvb_base_bin_request_new_pad; + element_class->release_pad = dvb_base_bin_release_pad; + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&program_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + + gst_element_class_set_details_simple (element_class, "DVB bin", + "Source/Bin/Video", + "Access descramble and split DVB streams", + "Alessandro Decina <alessandro@nnva.org>"); gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = dvb_base_bin_set_property; @@ -310,6 +294,7 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass) g_param_spec_string ("program-numbers", "Program Numbers", "Colon separated list of programs", "", G_PARAM_READWRITE)); + } static void @@ -331,7 +316,7 @@ dvb_base_bin_reset (DvbBaseBin * dvbbasebin) static gint16 initial_pids[] = { 0, 1, 0x10, 0x11, 0x12, 0x14, -1 }; static void -dvb_base_bin_init (DvbBaseBin * dvbbasebin, DvbBaseBinClass * klass) +dvb_base_bin_init (DvbBaseBin * dvbbasebin) { DvbBaseBinStream *stream; int i; @@ -472,7 +457,7 @@ dvb_base_bin_get_property (GObject * object, guint prop_id, static GstPad * dvb_base_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name) + GstPadTemplate * templ, const gchar * name, const GstCaps * caps) { GstPad *pad; GstPad *ghost; @@ -542,8 +527,9 @@ dvb_base_bin_reset_pmtlist (DvbBaseBin * dvbbasebin) dvbbasebin->pmtlist_changed = FALSE; } -static gboolean -dvb_base_bin_ts_pad_probe_cb (GstPad * pad, GstBuffer * buf, gpointer user_data) +static GstPadProbeReturn +dvb_base_bin_ts_pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, + gpointer user_data) { DvbBaseBin *dvbbasebin = GST_DVB_BASE_BIN (user_data); @@ -560,7 +546,7 @@ dvb_base_bin_ts_pad_probe_cb (GstPad * pad, GstBuffer * buf, gpointer user_data) } } - return TRUE; + return GST_PAD_PROBE_OK; } static void @@ -577,9 +563,10 @@ dvb_base_bin_init_cam (DvbBaseBin * dvbbasebin) if (cam_device_open (dvbbasebin->hwcam, ca_file)) { /* HACK: poll the cam in a buffer probe */ dvbbasebin->ts_pad = - gst_element_get_request_pad (dvbbasebin->mpegtsparse, "src%d"); - gst_pad_add_buffer_probe (dvbbasebin->ts_pad, - G_CALLBACK (dvb_base_bin_ts_pad_probe_cb), dvbbasebin); + gst_element_get_request_pad (dvbbasebin->mpegtsparse, "src_%u"); + gst_pad_add_probe (dvbbasebin->ts_pad, + GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, dvb_base_bin_ts_pad_probe_cb, + dvbbasebin, NULL); } else { GST_ERROR_OBJECT (dvbbasebin, "could not open %s", ca_file); cam_device_free (dvbbasebin->hwcam); @@ -796,12 +783,13 @@ dvb_base_bin_handle_message (GstBin * bin, GstMessage * message) if (message->type == GST_MESSAGE_ELEMENT && GST_ELEMENT (message->src) == GST_ELEMENT (dvbbasebin->mpegtsparse)) { - const gchar *structure_name = gst_structure_get_name (message->structure); + const GstStructure *s = gst_message_get_structure (message); + const gchar *structure_name = gst_structure_get_name (s); if (strcmp (structure_name, "pat") == 0) - dvb_base_bin_pat_info_cb (dvbbasebin, message->structure); + dvb_base_bin_pat_info_cb (dvbbasebin, s); else if (strcmp (structure_name, "pmt") == 0) - dvb_base_bin_pmt_info_cb (dvbbasebin, message->structure); + dvb_base_bin_pmt_info_cb (dvbbasebin, s); /*else if (strcmp (structure_name, "nit") == 0) dvb_base_bin_nit_info_cb (dvbbasebin, message->structure); @@ -821,7 +809,8 @@ dvb_base_bin_handle_message (GstBin * bin, GstMessage * message) static void -dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pat_info) +dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, + const GstStructure * pat_info) { DvbBaseBinProgram *program; DvbBaseBinStream *stream; @@ -869,7 +858,7 @@ dvb_base_bin_pat_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pat_info) } static void -dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, GstStructure * pmt) +dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, const GstStructure * pmt) { DvbBaseBinProgram *program; guint program_number; @@ -964,50 +953,58 @@ dvb_base_bin_pad_removed_cb (GstElement * mpegtsparse, } static guint -dvb_base_bin_uri_get_type (void) +dvb_base_bin_uri_get_type (GType type) { return GST_URI_SRC; } -static gchar ** -dvb_base_bin_uri_get_protocols (void) +static const gchar *const * +dvb_base_bin_uri_get_protocols (GType type) { - static gchar *protocols[] = { (char *) "dvb", NULL }; + static const gchar *protocols[] = { "dvb", NULL }; return protocols; } -static const gchar * +static gchar * dvb_base_bin_uri_get_uri (GstURIHandler * handler) { - return "dvb://"; + return g_strdup ("dvb://"); } static gboolean -dvb_base_bin_uri_set_uri (GstURIHandler * handler, const gchar * uri) +dvb_base_bin_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error) { - gboolean ret; - gchar *protocol; DvbBaseBin *dvbbasebin = GST_DVB_BASE_BIN (handler); + gchar *location; - protocol = gst_uri_get_protocol (uri); + location = gst_uri_get_location (uri); - if (strcmp (protocol, "dvb") != 0) { - ret = FALSE; - } else { - gchar *location = gst_uri_get_location (uri); + if (location == NULL) + goto no_location; - if (location != NULL) { - ret = set_properties_for_channel (G_OBJECT (dvbbasebin), location); - g_free (location); - } else - ret = FALSE; - } + if (!set_properties_for_channel (G_OBJECT (dvbbasebin), location)) + goto set_properties_failed; - /* here is where we parse channels.conf */ - g_free (protocol); + /* FIXME: here is where we parse channels.conf */ - return ret; + g_free (location); + return TRUE; +/* ERRORS */ +no_location: + { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "No details to DVB URI"); + return FALSE; + } +set_properties_failed: + { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + "Could not set properties from DVB URI"); + g_free (location); + return FALSE; + } } static void diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index 7eb2a2302..156290879 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -305,24 +305,8 @@ static GstStaticPadTemplate ts_src_factory = GST_STATIC_PAD_TEMPLATE ("src", ****************************** */ -GST_BOILERPLATE (GstDvbSrc, gst_dvbsrc, GstPushSrc, GST_TYPE_PUSH_SRC); - -static void -gst_dvbsrc_base_init (gpointer gclass) -{ - GstDvbSrcClass *klass = (GstDvbSrcClass *) gclass; - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, - &ts_src_factory); - - gst_element_class_set_details_simple (element_class, "DVB Source", - "Source/Video", - "Digital Video Broadcast Source", - "P2P-VCR, C-Lab, University of Paderborn," - "Zaheer Abbas Merali <zaheerabbas at merali dot org>"); -} - +#define gst_dvbsrc_parent_class parent_class +G_DEFINE_TYPE (GstDvbSrc, gst_dvbsrc, GST_TYPE_PUSH_SRC); /* initialize the plugin's class */ static void @@ -343,6 +327,16 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass) gobject_class->finalize = gst_dvbsrc_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvbsrc_change_state); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&ts_src_factory)); + + gst_element_class_set_details_simple (gstelement_class, "DVB Source", + "Source/Video", + "Digital Video Broadcast Source", + "P2P-VCR, C-Lab, University of Paderborn," + "Zaheer Abbas Merali <zaheerabbas at merali dot org>"); + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvbsrc_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dvbsrc_stop); gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_dvbsrc_unlock); @@ -459,7 +453,7 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass) * initialize structure */ static void -gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass) +gst_dvbsrc_init (GstDvbSrc * object) { int i = 0; @@ -907,12 +901,14 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size) gint ret_val = 0; GstBuffer *buf = gst_buffer_new_and_alloc (size); GstClockTime timeout = object->timeout * GST_USECOND; + guint8 *data; g_return_val_if_fail (GST_IS_BUFFER (buf), NULL); if (object->fd_dvr < 0) return NULL; + data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE); while (count < size) { ret_val = gst_poll_wait (object->poll, timeout); GST_LOG_OBJECT (object, "select returned %d", ret_val); @@ -925,10 +921,9 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size) /* timeout, post element message */ gst_element_post_message (GST_ELEMENT_CAST (object), gst_message_new_element (GST_OBJECT (object), - gst_structure_empty_new ("dvb-read-failure"))); + gst_structure_new_empty ("dvb-read-failure"))); } else { - int nread = - read (object->fd_dvr, GST_BUFFER_DATA (buf) + count, size - count); + int nread = read (object->fd_dvr, data + count, size - count); if (G_UNLIKELY (nread < 0)) { GST_WARNING_OBJECT @@ -937,24 +932,25 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size) object->adapter_number, object->frontend_number, errno); gst_element_post_message (GST_ELEMENT_CAST (object), gst_message_new_element (GST_OBJECT (object), - gst_structure_empty_new ("dvb-read-failure"))); + gst_structure_new_empty ("dvb-read-failure"))); } else count = count + nread; } } - - GST_BUFFER_SIZE (buf) = count; + gst_buffer_unmap (buf, data, count); GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE; return buf; stopped: GST_DEBUG_OBJECT (object, "stop called"); + gst_buffer_unmap (buf, data, 0); gst_buffer_unref (buf); return NULL; select_error: GST_ELEMENT_ERROR (object, RESOURCE, READ, (NULL), ("select error %d: %s (%d)", ret_val, g_strerror (errno), errno)); + gst_buffer_unmap (buf, data, 0); gst_buffer_unref (buf); return NULL; } @@ -981,13 +977,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf) GST_DEBUG_OBJECT (object, "Reading from DVR device"); *buf = gst_dvbsrc_read_device (object, buffer_size); if (*buf != NULL) { - GstCaps *caps; - retval = GST_FLOW_OK; - - caps = gst_pad_get_caps (GST_BASE_SRC_PAD (object)); - gst_buffer_set_caps (*buf, caps); - gst_caps_unref (caps); } if (object->stats_interval != 0 && diff --git a/sys/dvb/parsechannels.c b/sys/dvb/parsechannels.c index 6de7b12a3..b2d3aef2c 100644 --- a/sys/dvb/parsechannels.c +++ b/sys/dvb/parsechannels.c @@ -156,8 +156,8 @@ set_properties_for_channel (GObject * dvbbasebin, const gchar * channel_name) guint major, minor, micro, nano; gst_version (&major, &minor, µ, &nano); - filename = g_strdup_printf ("%s/.gstreamer-%d.%d/dvb-channels.conf", - g_get_home_dir (), major, minor); + filename = g_strdup_printf ("%s/gstreamer-%d.%d/dvb-channels.conf", + g_get_user_config_dir (), major, minor); } channels = parse_channels_conf_from_file (filename); g_free (filename); diff --git a/sys/dxr3/dxr3audiosink.c b/sys/dxr3/dxr3audiosink.c index b72544b2b..53a69636a 100644 --- a/sys/dxr3/dxr3audiosink.c +++ b/sys/dxr3/dxr3audiosink.c @@ -93,7 +93,8 @@ static gboolean dxr3audiosink_open (Dxr3AudioSink * sink); static gboolean dxr3audiosink_set_mode_pcm (Dxr3AudioSink * sink); static gboolean dxr3audiosink_set_mode_ac3 (Dxr3AudioSink * sink); static void dxr3audiosink_close (Dxr3AudioSink * sink); -static void dxr3audiosink_set_clock (GstElement * element, GstClock * clock); +static gboolean dxr3audiosink_set_clock (GstElement * element, + GstClock * clock); static GstPadLinkReturn dxr3audiosink_pcm_sinklink (GstPad * pad, const GstCaps * caps); @@ -148,10 +149,10 @@ dxr3audiosink_base_init (Dxr3AudioSinkClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &dxr3audiosink_pcm_sink_factory); - gst_element_class_add_static_pad_template (element_class, - &dxr3audiosink_ac3_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&dxr3audiosink_pcm_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&dxr3audiosink_ac3_sink_factory)); gst_element_class_set_details_simple (element_class, "dxr3/Hollywood+ mpeg decoder board audio plugin", "Audio/Sink", "Feeds audio to Sigma Designs em8300 based boards", @@ -440,12 +441,14 @@ dxr3audiosink_close (Dxr3AudioSink * sink) } -static void +static gboolean dxr3audiosink_set_clock (GstElement * element, GstClock * clock) { Dxr3AudioSink *src = DXR3AUDIOSINK (element); src->clock = clock; + + return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock); } diff --git a/sys/dxr3/dxr3spusink.c b/sys/dxr3/dxr3spusink.c index 7e4d021ef..ec713fbb4 100644 --- a/sys/dxr3/dxr3spusink.c +++ b/sys/dxr3/dxr3spusink.c @@ -72,7 +72,7 @@ static void dxr3spusink_get_property (GObject * object, static gboolean dxr3spusink_open (Dxr3SpuSink * sink); static void dxr3spusink_close (Dxr3SpuSink * sink); -static void dxr3spusink_set_clock (GstElement * element, GstClock * clock); +static gboolean dxr3spusink_set_clock (GstElement * element, GstClock * clock); static gboolean dxr3spusink_handle_event (GstPad * pad, GstEvent * event); static void dxr3spusink_chain (GstPad * pad, GstData * _data); @@ -126,8 +126,8 @@ dxr3spusink_base_init (Dxr3SpuSinkClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &dxr3spusink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&dxr3spusink_sink_factory)); gst_element_class_set_details_simple (element_class, "dxr3/Hollywood+ mpeg decoder board subpicture element", "Sink/Video", "Feeds subpicture information to Sigma Designs em8300 based boards", @@ -305,12 +305,14 @@ dxr3spusink_close (Dxr3SpuSink * sink) } -static void +static gboolean dxr3spusink_set_clock (GstElement * element, GstClock * clock) { Dxr3SpuSink *src = DXR3SPUSINK (element); src->clock = clock; + + return GST_ELEMENT_CLASS (element)->set_clock (element, clock); } diff --git a/sys/dxr3/dxr3videosink.c b/sys/dxr3/dxr3videosink.c index 437789cab..1c69295ab 100644 --- a/sys/dxr3/dxr3videosink.c +++ b/sys/dxr3/dxr3videosink.c @@ -96,7 +96,8 @@ static void dxr3videosink_get_property (GObject * object, static gboolean dxr3videosink_open (Dxr3VideoSink * sink); static void dxr3videosink_close (Dxr3VideoSink * sink); -static void dxr3videosink_set_clock (GstElement * element, GstClock * clock); +static gboolean dxr3videosink_set_clock (GstElement * element, + GstClock * clock); static void dxr3videosink_reset_parser (Dxr3VideoSink * sink); static int dxr3videosink_next_start_code (Dxr3VideoSink * sink); @@ -151,8 +152,8 @@ dxr3videosink_base_init (Dxr3VideoSinkClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, - &dxr3videosink_sink_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&dxr3videosink_sink_factory)); gst_element_class_set_details_simple (element_class, "dxr3/Hollywood+ mpeg decoder board video element", "Sink/Video", "Feeds MPEG2 video to Sigma Designs em8300 based boards", @@ -308,12 +309,14 @@ dxr3videosink_close (Dxr3VideoSink * sink) } -static void +static gboolean dxr3videosink_set_clock (GstElement * element, GstClock * clock) { Dxr3VideoSink *src = DXR3VIDEOSINK (element); src->clock = clock; + + return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock); } diff --git a/sys/fbdev/gstfbdevsink.c b/sys/fbdev/gstfbdevsink.c index 7878fbfbc..8925f3d30 100644 --- a/sys/fbdev/gstfbdevsink.c +++ b/sys/fbdev/gstfbdevsink.c @@ -93,8 +93,8 @@ gst_fbdevsink_base_init (gpointer g_class) gst_element_class_set_details_simple (element_class, "fbdev video sink", "Sink/Video", "A linux framebuffer videosink", "Sean D'Epagnier <sean@depagnier.com>"); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } diff --git a/sys/linsys/gstlinsyssdisink.c b/sys/linsys/gstlinsyssdisink.c index e4260c023..3e9ad165b 100644 --- a/sys/linsys/gstlinsyssdisink.c +++ b/sys/linsys/gstlinsyssdisink.c @@ -99,8 +99,8 @@ gst_linsys_sdi_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_linsys_sdi_sink_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_linsys_sdi_sink_sink_template)); gst_element_class_set_details_simple (element_class, "SDI video sink", "Sink/Video", "Writes video from SDI transmit device", diff --git a/sys/linsys/gstlinsyssdisrc.c b/sys/linsys/gstlinsyssdisrc.c index 467c54c50..c5a928c68 100644 --- a/sys/linsys/gstlinsyssdisrc.c +++ b/sys/linsys/gstlinsyssdisrc.c @@ -103,8 +103,8 @@ gst_linsys_sdi_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_linsys_sdi_src_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_linsys_sdi_src_src_template)); gst_element_class_set_details_simple (element_class, "SDI video source", "Source/Video", "Reads video from SDI capture device", diff --git a/sys/osxvideo/osxvideosrc.c b/sys/osxvideo/osxvideosrc.c index 864806dcc..ed84619d7 100644 --- a/sys/osxvideo/osxvideosrc.c +++ b/sys/osxvideo/osxvideosrc.c @@ -639,7 +639,8 @@ gst_osx_video_src_base_init (gpointer gclass) GST_DEBUG ("%s", G_STRFUNC); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Video Source (OSX)", "Source/Video", diff --git a/sys/pvr2d/gstpvr.c b/sys/pvr2d/gstpvr.c index 0112d1ee7..123d15d81 100644 --- a/sys/pvr2d/gstpvr.c +++ b/sys/pvr2d/gstpvr.c @@ -69,6 +69,34 @@ gst_ducati_alloc_2d (gint width, gint height, guint * sz) return MemMgr_Alloc (block, 2); } +static struct +{ + PVR2DERROR code; + const gchar *errstring; +} pvr2derrorcodestring[] = { + { + PVR2D_OK, "OK (0)"}, { + PVR2DERROR_INVALID_PARAMETER, "Invalid Parameter (-1)"}, { + PVR2DERROR_DEVICE_UNAVAILABLE, "Device Unavailable (-2)"}, { + PVR2DERROR_INVALID_CONTEXT, "Invalid Context (-3)"}, { + PVR2DERROR_MEMORY_UNAVAILABLE, "Memory Unavailable (-4)"}, { + PVR2DERROR_DEVICE_NOT_PRESENT, "Device not present (-5)"}, { + PVR2DERROR_IOCTL_ERROR, "ioctl Error (-6)"}, { + PVR2DERROR_GENERIC_ERROR, "Generic Error (-7)"}, { + PVR2DERROR_BLT_NOTCOMPLETE, "blt not complete (-8)"}, { + PVR2DERROR_HW_FEATURE_NOT_SUPPORTED, "Hardware feature not supported (-9)"}, { + PVR2DERROR_NOT_YET_IMPLEMENTED, "Not yet implemented (-10)"}, { + PVR2DERROR_MAPPING_FAILED, "Mapping failed (-11)"} +}; + +const gchar * +gst_pvr2d_error_get_string (PVR2DERROR code) +{ + if (code <= PVR2D_OK && code >= PVR2DERROR_MAPPING_FAILED) + return pvr2derrorcodestring[PVR2D_OK - code].errstring; + return "Uknown Error"; +} + /* PACKAGE: this is usually set by autotools depending on some _INIT macro * in configure.ac and then written into and defined in config.h, but we can * just set it ourselves here in case someone doesn't use autotools to diff --git a/sys/pvr2d/gstpvr.h b/sys/pvr2d/gstpvr.h index d2c57af00..bbde497ae 100644 --- a/sys/pvr2d/gstpvr.h +++ b/sys/pvr2d/gstpvr.h @@ -26,6 +26,8 @@ #include <tiler.h> #include <tilermem.h> #include <memmgr.h> +#include "pvr2d.h" + #include <gst/gst.h> @@ -37,6 +39,8 @@ G_BEGIN_DECLS void * gst_ducati_alloc_1d (gint sz); void * gst_ducati_alloc_2d (gint width, gint height, guint * sz); +const gchar * gst_pvr2d_error_get_string (PVR2DERROR code); + G_END_DECLS #endif /* __GST_DUCATI_H__ */ diff --git a/sys/pvr2d/gstpvrbufferpool.c b/sys/pvr2d/gstpvrbufferpool.c index 03bcafb68..7c269dbd3 100644 --- a/sys/pvr2d/gstpvrbufferpool.c +++ b/sys/pvr2d/gstpvrbufferpool.c @@ -1,6 +1,8 @@ /* * GStreamer * Copyright (c) 2010, Texas Instruments Incorporated + * Copyright (c) 2011, Collabora Ltd + * @author: Edward Hervey <edward@collabora.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,304 +19,351 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "gstpvrbufferpool.h" +/* Debugging category */ +#include <gst/gstinfo.h> + +/* Helper functions */ +#include <gst/video/video.h> +#include <gst/video/gstvideometa.h> +#include <gst/video/gstvideopool.h> + + GST_DEBUG_CATEGORY_EXTERN (gst_debug_pvrvideosink); #define GST_CAT_DEFAULT gst_debug_pvrvideosink -/* - * GstDucatiBuffer - */ +static void +gst_pvr_meta_free (GstPVRMeta * meta, GstBuffer * buffer) +{ + GstPVRVideoSink *pvrsink = (GstPVRVideoSink *) meta->sink; -static GstBufferClass *buffer_parent_class; + GST_LOG ("Releasing PVRMeta for buffer %p (src_mem:%p)", + buffer, meta->src_mem); -/* Get the original buffer, or whatever is the best output buffer. - * Consumes the input reference, produces the output reference - */ -GstBuffer * -gst_ducati_buffer_get (GstDucatiBuffer * self) -{ - if (self->orig) { - // TODO copy to orig buffer.. if needed. - gst_buffer_unref (self->orig); - self->orig = NULL; + if (meta->src_mem) { + PVR2DERROR pvr_error; + + GST_OBJECT_LOCK (pvrsink); + if (pvrsink->dcontext == NULL || pvrsink->dcontext->pvr_context == NULL) { + GST_OBJECT_UNLOCK (pvrsink); + goto done; + } + pvr_error = PVR2DMemFree (pvrsink->dcontext->pvr_context, meta->src_mem); + GST_OBJECT_UNLOCK (pvrsink); + + if (pvr_error != PVR2D_OK) + GST_ERROR ("Failed to unwrap PVR memory buffer. Error : %s", + gst_pvr2d_error_get_string (pvr_error)); } - return GST_BUFFER (self); + +done: + gst_pvrvideosink_untrack_buffer (pvrsink, buffer); + gst_object_unref (pvrsink); } -PVR2DMEMINFO * -gst_ducati_buffer_get_meminfo (GstDucatiBuffer * self) +const GstMetaInfo * +gst_pvr_meta_get_info (void) { - return self->src_mem; -} + static const GstMetaInfo *pvr_meta_info = NULL; + + if (pvr_meta_info == NULL) { + pvr_meta_info = gst_meta_register ("GstPVRMeta", "GstPVRMeta", + sizeof (GstPVRMeta), + (GstMetaInitFunction) NULL, + (GstMetaFreeFunction) gst_pvr_meta_free, + (GstMetaCopyFunction) NULL, (GstMetaTransformFunction) NULL); + } + return pvr_meta_info; +} -static GstDucatiBuffer * -gst_ducati_buffer_new (GstPvrBufferPool * pool) +/* Wrap existing buffers */ +GstPVRMeta * +gst_buffer_add_pvr_meta (GstBuffer * buffer, GstElement * sink) { + guint8 *data; + gsize size; + GstPVRMeta *meta; PVR2DERROR pvr_error; - GstDucatiBuffer *self = (GstDucatiBuffer *) - gst_mini_object_new (GST_TYPE_DUCATIBUFFER); + GstPVRVideoSink *pvrsink = (GstPVRVideoSink *) sink; - GST_LOG_OBJECT (pool->element, "creating buffer %p in pool %p", self, pool); + g_return_val_if_fail (gst_buffer_n_memory (buffer) > 0, NULL); + g_return_val_if_fail (pvrsink != NULL, NULL); - self->pool = (GstPvrBufferPool *) - gst_mini_object_ref (GST_MINI_OBJECT (pool)); + GST_LOG_OBJECT (pvrsink, "Adding PVRMeta to buffer %p", buffer); - GST_BUFFER_DATA (self) = gst_ducati_alloc_1d (pool->size); - GST_BUFFER_SIZE (self) = pool->size; - GST_LOG_OBJECT (pool->element, "width=%d, height=%d and size=%d", - pool->padded_width, pool->padded_height, pool->size); + /* Add the meta */ + meta = (GstPVRMeta *) gst_buffer_add_meta (buffer, GST_PVR_META_INFO, NULL); + meta->src_mem = NULL; + meta->sink = gst_object_ref (pvrsink); + gst_pvrvideosink_track_buffer (pvrsink, buffer); - pvr_error = - PVR2DMemWrap (pool->pvr_context, GST_BUFFER_DATA (self), 0, pool->size, - NULL, &(self->src_mem)); - if (pvr_error != PVR2D_OK) { - GST_LOG_OBJECT (pool->element, "Failed to Wrap buffer memory" - "returned %d", pvr_error); - } else { - self->wrapped = TRUE; - } + data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); - gst_buffer_set_caps (GST_BUFFER (self), pool->caps); + GST_LOG_OBJECT (pvrsink, "data:%p, size:%" G_GSIZE_FORMAT, data, size); - return self; -} + GST_OBJECT_LOCK (pvrsink); + if (pvrsink->dcontext == NULL || pvrsink->dcontext->pvr_context == NULL) + goto no_pvr_context; + /* Map the memory and wrap it */ + pvr_error = + PVR2DMemWrap (pvrsink->dcontext->pvr_context, data, 0, size, NULL, + &(meta->src_mem)); + GST_OBJECT_UNLOCK (pvrsink); + gst_buffer_unmap (buffer, data, size); -static void -gst_ducati_buffer_finalize (GstDucatiBuffer * self) -{ - PVR2DERROR pvr_error; - GstPvrBufferPool *pool = self->pool; - gboolean resuscitated = FALSE; - - GST_LOG_OBJECT (pool->element, "finalizing buffer %p", self); + if (pvr_error != PVR2D_OK) + goto wrap_error; - GST_PVR_BUFFERPOOL_LOCK (pool); - g_queue_remove (pool->used_buffers, self); - if (pool->running) { - resuscitated = TRUE; + return meta; - GST_LOG_OBJECT (pool->element, "reviving buffer %p", self); +wrap_error: + { + GST_WARNING_OBJECT (pvrsink, "Failed to Wrap buffer memory. Error : %s", + gst_pvr2d_error_get_string (pvr_error)); + gst_buffer_remove_meta (buffer, (GstMeta *) meta); - g_queue_push_head (pool->free_buffers, self); - } else { - GST_LOG_OBJECT (pool->element, "the pool is shutting down"); + return NULL; } - GST_PVR_BUFFERPOOL_UNLOCK (pool); - if (resuscitated) { - GST_LOG_OBJECT (pool->element, "reviving buffer %p, %d", self, index); - gst_buffer_ref (GST_BUFFER (self)); - GST_BUFFER_SIZE (self) = 0; - } - - if (!resuscitated) { - GST_LOG_OBJECT (pool->element, - "buffer %p (data %p, len %u) not recovered, freeing", - self, GST_BUFFER_DATA (self), GST_BUFFER_SIZE (self)); - - if (self->wrapped) { - pvr_error = PVR2DMemFree (pool->pvr_context, self->src_mem); - if (pvr_error != PVR2D_OK) { - GST_ERROR_OBJECT (pool->element, "Failed to Unwrap buffer memory" - "returned %d", pvr_error); - } - self->wrapped = FALSE; - } - MemMgr_Free ((void *) GST_BUFFER_DATA (self)); - GST_BUFFER_DATA (self) = NULL; - gst_mini_object_unref (GST_MINI_OBJECT (pool)); - GST_MINI_OBJECT_CLASS (buffer_parent_class)->finalize (GST_MINI_OBJECT - (self)); +no_pvr_context: + { + GST_OBJECT_UNLOCK (pvrsink); + GST_WARNING_OBJECT (pvrsink, "No PVR2D context available"); + gst_buffer_remove_meta (buffer, (GstMeta *) meta); + return NULL; } } -static void -gst_ducati_buffer_class_init (gpointer g_class, gpointer class_data) -{ - GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); +/* + * GstDucatiBufferPool + */ +static void gst_pvr_buffer_pool_finalize (GObject * object); - buffer_parent_class = g_type_class_peek_parent (g_class); +#define gst_pvr_buffer_pool_parent_class parent_class +G_DEFINE_TYPE (GstPVRBufferPool, gst_pvr_buffer_pool, GST_TYPE_BUFFER_POOL); +static const gchar ** +pvr_buffer_pool_get_options (GstBufferPool * pool) +{ + static const gchar *options[] = { GST_BUFFER_POOL_OPTION_VIDEO_META, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT, NULL + }; - mini_object_class->finalize = (GstMiniObjectFinalizeFunction) - GST_DEBUG_FUNCPTR (gst_ducati_buffer_finalize); + return options; } -GType -gst_ducati_buffer_get_type (void) +static gboolean +pvr_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) { - static GType type; - - if (G_UNLIKELY (type == 0)) { - static const GTypeInfo info = { - .class_size = sizeof (GstBufferClass), - .class_init = gst_ducati_buffer_class_init, - .instance_size = sizeof (GstDucatiBuffer), - }; - type = g_type_register_static (GST_TYPE_BUFFER, - "GstDucatiBufferPvrsink", &info, 0); + GstPVRBufferPool *pvrpool = GST_PVR_BUFFER_POOL_CAST (pool); + GstVideoInfo info; + guint size, align; + gboolean ret; + const GstCaps *caps; + + if (!gst_buffer_pool_config_get (config, &caps, &size, NULL, NULL, NULL, + &align)) + goto wrong_config; + + if (caps == NULL) + goto no_caps; + + /* now parse the caps from the config */ + if (!gst_video_info_from_caps (&info, caps)) + goto wrong_caps; + + GST_LOG_OBJECT (pool, "%dx%d, size:%u, align:%u caps %" GST_PTR_FORMAT, + info.width, info.height, size, align, caps); + + if (pvrpool->caps) + gst_caps_unref (pvrpool->caps); + pvrpool->caps = gst_caps_copy (caps); + pvrpool->info = info; + pvrpool->size = size; + pvrpool->align = align; + pvrpool->padded_width = GST_VIDEO_INFO_WIDTH (&info); + pvrpool->padded_height = GST_VIDEO_INFO_HEIGHT (&info); + + /* enable metadata based on config of the pool */ + pvrpool->add_metavideo = + gst_buffer_pool_config_has_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + +#if 0 + /* parse extra alignment info */ + priv->need_alignment = gst_buffer_pool_config_has_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + + if (priv->need_alignment) { + gst_buffer_pool_config_get_video_alignment (config, &priv->align); + + GST_LOG_OBJECT (pool, "padding %u-%ux%u-%u", priv->align.padding_top, + priv->align.padding_left, priv->align.padding_left, + priv->align.padding_bottom); + + /* we need the video metadata too now */ + priv->add_metavideo = TRUE; } - return type; -} -/* - * GstDucatiBufferPool - */ + /* add the padding */ + priv->padded_width = + GST_VIDEO_INFO_WIDTH (&info) + priv->align.padding_left + + priv->align.padding_right; + priv->padded_height = + GST_VIDEO_INFO_HEIGHT (&info) + priv->align.padding_top + + priv->align.padding_bottom; +#endif -static GstMiniObjectClass *bufferpool_parent_class = NULL; + GST_DEBUG_OBJECT (pool, "before calling parent class"); -/** create new bufferpool - * @element : the element that owns this pool - * @caps: the caps to set on the buffer - * @num_buffers: the requested number of buffers in the pool - */ -GstPvrBufferPool * -gst_pvr_bufferpool_new (GstElement * element, GstCaps * caps, gint num_buffers, - gint size, PVR2DCONTEXTHANDLE pvr_context) -{ - GstPvrBufferPool *self = (GstPvrBufferPool *) - gst_mini_object_new (GST_TYPE_PVRBUFFERPOOL); - GstStructure *s = gst_caps_get_structure (caps, 0); - - self->element = gst_object_ref (element); - gst_structure_get_int (s, "width", &self->padded_width); - gst_structure_get_int (s, "height", &self->padded_height); - self->caps = gst_caps_ref (caps); - self->size = size; - self->pvr_context = pvr_context; - - self->free_buffers = g_queue_new (); - self->used_buffers = g_queue_new (); - self->lock = g_mutex_new (); - self->running = TRUE; - - return self; + ret = GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); + + GST_DEBUG_OBJECT (pool, "parent_class returned %d", ret); + + return ret; + + /* 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; + } } -static void -unwrap_buffer (gpointer buffer, gpointer user_data) +/* This function handles GstXImageBuffer creation depending on XShm availability */ +static GstFlowReturn +pvr_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, + GstBufferPoolParams * params) { - PVR2DERROR pvr_error; - GstDucatiBuffer *buf = GST_DUCATIBUFFER (buffer); - GstPvrBufferPool *pool = (GstPvrBufferPool *) user_data; - - if (buf->wrapped) { - pvr_error = PVR2DMemFree (pool->pvr_context, buf->src_mem); - if (pvr_error != PVR2D_OK) { - GST_ERROR_OBJECT (pool->element, "Failed to Unwrap buffer memory" - "returned %d", pvr_error); + GstPVRBufferPool *pvrpool = GST_PVR_BUFFER_POOL_CAST (pool); + GstVideoInfo *info; + GstBuffer *pvr; + GstPVRMeta *meta; + + info = &pvrpool->info; + + pvr = gst_buffer_new_allocate (NULL, pvrpool->size, pvrpool->align); + meta = gst_buffer_add_pvr_meta (pvr, pvrpool->pvrsink); + if (meta == NULL) { + gst_buffer_unref (pvr); + goto no_buffer; + } + + if (pvrpool->add_metavideo) { + GstVideoMeta *meta; + + GST_DEBUG_OBJECT (pool, "adding GstVideoMeta"); + /* these are just the defaults for now */ + meta = gst_buffer_add_video_meta (pvr, 0, GST_VIDEO_INFO_FORMAT (info), + pvrpool->padded_width, pvrpool->padded_height); + if (G_UNLIKELY (meta == NULL)) + GST_WARNING_OBJECT (pool, "Failed to add GstVideoMeta"); + +#if 0 + const GstVideoFormatInfo *vinfo = info->finfo; + gint i; + + if (pvrpool->need_alignment) { + meta->width = GST_VIDEO_INFO_WIDTH (&pvrpool->info); + meta->height = GST_VIDEO_INFO_HEIGHT (&pvrpool->info); + + /* FIXME, not quite correct, NV12 would apply the vedge twice on the second + * plane */ + for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++) { + gint vedge, hedge, plane; + + hedge = + GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (vinfo, i, + pvrpool->align.padding_left); + vedge = + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo, i, + pvrpool->align.padding_top); + plane = GST_VIDEO_FORMAT_INFO_PLANE (vinfo, i); + + GST_LOG_OBJECT (pool, "comp %d, plane %d: hedge %d, vedge %d", i, + plane, hedge, vedge); + + meta->offset[plane] += (vedge * meta->stride[plane]) + hedge; + } } - buf->wrapped = FALSE; +#endif + } + + *buffer = pvr; + + return GST_FLOW_OK; + + /* ERROR */ +no_buffer: + { + GST_WARNING_OBJECT (pool, "can't create image"); + return GST_FLOW_ERROR; } } -void -gst_pvr_bufferpool_stop_running (GstPvrBufferPool * self, gboolean unwrap) +/** create new bufferpool + */ +GstBufferPool * +gst_pvr_buffer_pool_new (GstElement * pvrsink) { - gboolean empty = FALSE; - - g_return_if_fail (self); - - GST_PVR_BUFFERPOOL_LOCK (self); - self->running = FALSE; - GST_PVR_BUFFERPOOL_UNLOCK (self); - - GST_DEBUG_OBJECT (self->element, "free available buffers"); - - /* free all buffers on the freelist */ - while (!empty) { - GstDucatiBuffer *buf; - GST_PVR_BUFFERPOOL_LOCK (self); - buf = g_queue_pop_head (self->free_buffers); - GST_PVR_BUFFERPOOL_UNLOCK (self); - if (buf) - gst_buffer_unref (GST_BUFFER (buf)); - else - empty = TRUE; - } + GstPVRBufferPool *pool; + + g_return_val_if_fail (GST_IS_PVRVIDEOSINK (pvrsink), NULL); - if (unwrap) - g_queue_foreach (self->used_buffers, unwrap_buffer, self); + GST_DEBUG_OBJECT (pvrsink, "Creating new GstPVRBufferPool"); - gst_mini_object_unref (GST_MINI_OBJECT (self)); + pool = g_object_new (GST_TYPE_PVR_BUFFER_POOL, NULL); + pool->pvrsink = gst_object_ref (pvrsink); + + return GST_BUFFER_POOL_CAST (pool); } -/** get buffer from bufferpool, allocate new buffer if needed */ -GstDucatiBuffer * -gst_pvr_bufferpool_get (GstPvrBufferPool * self, GstBuffer * orig) +static void +gst_pvr_buffer_pool_class_init (GstPVRBufferPoolClass * klass) { - GstDucatiBuffer *buf = NULL; - - g_return_val_if_fail (self, NULL); - - GST_PVR_BUFFERPOOL_LOCK (self); - if (self->running) { - /* re-use a buffer off the freelist if any are available - */ - buf = g_queue_pop_head (self->free_buffers); - if (!buf) - buf = gst_ducati_buffer_new (self); - buf->orig = orig; - g_queue_push_head (self->used_buffers, buf); - } - GST_PVR_BUFFERPOOL_UNLOCK (self); + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBufferPoolClass *gstbufferpool_class = (GstBufferPoolClass *) klass; - if (buf && orig) { - GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_TIMESTAMP (orig); - GST_BUFFER_DURATION (buf) = GST_BUFFER_DURATION (orig); - } - GST_BUFFER_SIZE (buf) = self->size; + gobject_class->finalize = gst_pvr_buffer_pool_finalize; - return buf; + gstbufferpool_class->get_options = pvr_buffer_pool_get_options; + gstbufferpool_class->set_config = pvr_buffer_pool_set_config; + gstbufferpool_class->alloc_buffer = pvr_buffer_pool_alloc; } static void -gst_pvr_bufferpool_finalize (GstPvrBufferPool * self) +gst_pvr_buffer_pool_init (GstPVRBufferPool * pool) { - GST_DEBUG_OBJECT (self->element, "destroy bufferpool"); - g_mutex_free (self->lock); - self->lock = NULL; - - g_queue_free (self->free_buffers); - self->free_buffers = NULL; - g_queue_free (self->used_buffers); - self->used_buffers = NULL; - - gst_caps_unref (self->caps); - self->caps = NULL; - gst_object_unref (self->element); - self->element = NULL; - - GST_MINI_OBJECT_CLASS (bufferpool_parent_class)->finalize (GST_MINI_OBJECT - (self)); + } static void -gst_pvr_bufferpool_class_init (gpointer g_class, gpointer class_data) +gst_pvr_buffer_pool_finalize (GObject * object) { - GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + GstPVRBufferPool *pool = GST_PVR_BUFFER_POOL_CAST (object); - bufferpool_parent_class = g_type_class_peek_parent (g_class); + GST_LOG_OBJECT (pool, "finalize PVR buffer pool %p", pool); - mini_object_class->finalize = (GstMiniObjectFinalizeFunction) - GST_DEBUG_FUNCPTR (gst_pvr_bufferpool_finalize); -} + if (pool->caps) + gst_caps_unref (pool->caps); + gst_object_unref (pool->pvrsink); -GType -gst_pvr_bufferpool_get_type (void) -{ - static GType type; - - if (G_UNLIKELY (type == 0)) { - static const GTypeInfo info = { - .class_size = sizeof (GstMiniObjectClass), - .class_init = gst_pvr_bufferpool_class_init, - .instance_size = sizeof (GstPvrBufferPool), - }; - type = g_type_register_static (GST_TYPE_MINI_OBJECT, - "GstPvrBufferPool", &info, 0); - } - return type; + G_OBJECT_CLASS (gst_pvr_buffer_pool_parent_class)->finalize (object); } diff --git a/sys/pvr2d/gstpvrbufferpool.h b/sys/pvr2d/gstpvrbufferpool.h index 1d90472b6..c34504d7f 100644 --- a/sys/pvr2d/gstpvrbufferpool.h +++ b/sys/pvr2d/gstpvrbufferpool.h @@ -26,63 +26,56 @@ G_BEGIN_DECLS -GType gst_ducati_buffer_get_type (void); -#define GST_TYPE_DUCATIBUFFER (gst_ducati_buffer_get_type()) -#define GST_IS_DUCATIBUFFER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DUCATIBUFFER)) -#define GST_DUCATIBUFFER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DUCATIBUFFER, GstDucatiBuffer)) - -GType gst_pvr_bufferpool_get_type (void); -#define GST_TYPE_PVRBUFFERPOOL (gst_pvr_bufferpool_get_type()) -#define GST_IS_PVRBUFFERPOOL(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PVRBUFFERPOOL)) -#define GST_PVRBUFFERPOOL(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PVRBUFFERPOOL, \ - GstPvrBufferPool)) - -typedef struct _GstPvrBufferPool GstPvrBufferPool; -typedef struct _GstDucatiBuffer GstDucatiBuffer; - -struct _GstPvrBufferPool +typedef struct _GstPVRMeta GstPVRMeta; + +typedef struct _GstPVRBufferPool GstPVRBufferPool; +typedef struct _GstPVRBufferPoolClass GstPVRBufferPoolClass; + +#include "gstpvrvideosink.h" + +const GstMetaInfo * gst_pvr_meta_get_info (void); +#define GST_PVR_META_INFO (gst_pvr_meta_get_info()) + +#define gst_buffer_get_pvr_meta(b) ((GstPVRMeta*)gst_buffer_get_meta((b),GST_PVR_META_INFO)) + +struct _GstPVRMeta +{ + GstMeta meta; + + PVR2DMEMINFO *src_mem; /* Memory wrapped by pvr */ + GstElement *sink; /* sink, holds a ref */ +}; + +GstPVRMeta * +gst_buffer_add_pvr_meta(GstBuffer *buffer, GstElement *pvrsink); + +#define GST_TYPE_PVR_BUFFER_POOL (gst_pvr_buffer_pool_get_type()) +#define GST_IS_PVR_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PVR_BUFFER_POOL)) +#define GST_PVR_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PVR_BUFFER_POOL, GstPVRBufferPool)) +#define GST_PVR_BUFFER_POOL_CAST(obj) ((GstPVRBufferPool*)(obj)) + +struct _GstPVRBufferPool { - GstMiniObject parent; + GstBufferPool parent; /* output (padded) size including any codec padding: */ gint padded_width, padded_height; - gint size; - PVR2DCONTEXTHANDLE pvr_context; + guint size, align; + + GstElement *pvrsink; GstCaps *caps; - GMutex *lock; - gboolean running; /* with lock */ - GstElement *element; /* the element that owns us.. */ - GQueue *free_buffers; - GQueue *used_buffers; - guint buffer_count; + GstVideoInfo info; + gboolean add_metavideo; }; -GstPvrBufferPool * gst_pvr_bufferpool_new (GstElement * element, - GstCaps * caps, gint num_buffers, gint size, - PVR2DCONTEXTHANDLE pvr_context); -void gst_pvr_bufferpool_stop_running (GstPvrBufferPool * pool, gboolean unwrap); -GstDucatiBuffer * gst_pvr_bufferpool_get (GstPvrBufferPool * self, - GstBuffer * orig); - -#define GST_PVR_BUFFERPOOL_LOCK(self) g_mutex_lock ((self)->lock) -#define GST_PVR_BUFFERPOOL_UNLOCK(self) g_mutex_unlock ((self)->lock) - -struct _GstDucatiBuffer { - GstBuffer parent; - - GstPvrBufferPool *pool; /* buffer-pool that this buffer belongs to */ - GstBuffer *orig; /* original buffer, if we need to copy output */ - PVR2DMEMINFO *src_mem; /* Memory wrapped by pvr */ - gboolean wrapped; +struct _GstPVRBufferPoolClass +{ + GstBufferPoolClass parent_class; }; -GstBuffer * gst_ducati_buffer_get (GstDucatiBuffer * self); -PVR2DMEMINFO * gst_ducati_buffer_get_meminfo (GstDucatiBuffer * self); +GType gst_pvr_buffer_pool_get_type (void); +GstBufferPool *gst_pvr_buffer_pool_new (GstElement *pvrsink); G_END_DECLS diff --git a/sys/pvr2d/gstpvrvideosink.c b/sys/pvr2d/gstpvrvideosink.c index 3bfa3ad2d..19cbad657 100644 --- a/sys/pvr2d/gstpvrvideosink.c +++ b/sys/pvr2d/gstpvrvideosink.c @@ -3,6 +3,7 @@ * Copyright (C) 2011 Collabora Ltda * Copyright (C) 2011 Texas Instruments * @author: Luciana Fujii Pontello <luciana.fujii@collabora.co.uk> + * @author: Edward Hervey <edward@collabora.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,10 +23,12 @@ /* Object header */ #include "gstpvrvideosink.h" - #include "gstpvrbufferpool.h" + #include <gst/video/gstvideosink.h> -#include <gst/interfaces/xoverlay.h> +#include <gst/video/videooverlay.h> +/* Helper functions */ +#include <gst/video/gstvideometa.h> /* Debugging category */ #include <gst/gstinfo.h> @@ -37,7 +40,6 @@ #include <servicesext.h> #define DEFAULT_QUEUE_SIZE 12 -#define DEFAULT_MIN_QUEUED_BUFS 1 GST_DEBUG_CATEGORY_EXTERN (gst_debug_pvrvideosink); #define GST_CAT_DEFAULT gst_debug_pvrvideosink @@ -55,23 +57,27 @@ GST_DEBUG_CATEGORY_EXTERN (gst_debug_pvrvideosink); /* end of internal definitions */ static void gst_pvrvideosink_reset (GstPVRVideoSink * pvrvideosink); -static GstFlowReturn gst_pvrvideosink_buffer_alloc (GstBaseSink * bsink, - guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static void gst_pvrvideosink_xwindow_draw_borders (GstPVRVideoSink * pvrvideosink, GstXWindow * xwindow, GstVideoRectangle rect); -static void gst_pvrvideosink_expose (GstXOverlay * overlay); +static void gst_pvrvideosink_expose (GstVideoOverlay * overlay); static void gst_pvrvideosink_xwindow_destroy (GstPVRVideoSink * pvrvideosink, GstXWindow * xwindow); +static void gst_pvrvideosink_dcontext_free (GstDrawContext * dcontext); + +static void gst_pvrvideosink_videooverlay_init (GstVideoOverlayInterface * + iface); + +#define gst_pvrvideosink_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstPVRVideoSink, gst_pvrvideosink, GST_TYPE_VIDEO_SINK, + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, + gst_pvrvideosink_videooverlay_init)); + static GstStaticPadTemplate gst_pvrvideosink_sink_template_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv, " - "format = (fourcc) NV12, " - "width = " GST_VIDEO_SIZE_RANGE ", " - "height = " GST_VIDEO_SIZE_RANGE ", " - "framerate = " GST_VIDEO_FPS_RANGE)); + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("NV12"))); enum { @@ -81,8 +87,6 @@ enum PROP_WINDOW_HEIGHT }; -static GstVideoSinkClass *parent_class = NULL; - /* ============================================================= */ /* */ /* Private Methods */ @@ -91,12 +95,6 @@ static GstVideoSinkClass *parent_class = NULL; /* pvrvideo buffers */ -#define GST_TYPE_PVRVIDEO_BUFFER (gst_pvrvideo_buffer_get_type()) - -#define GST_IS_PVRVIDEO_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PVRVIDEO_BUFFER)) -#define GST_PVRVIDEO_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PVRVIDEO_BUFFER, GstPVRVideoBuffer)) -#define GST_PVRVIDEO_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PVRVIDEO_BUFFER, GstPVRVideoBufferClass)) - static void gst_pvrvideosink_xwindow_update_geometry (GstPVRVideoSink * pvrvideosink) { @@ -126,17 +124,16 @@ gst_pvrvideosink_xwindow_update_geometry (GstPVRVideoSink * pvrvideosink) } if (pvrvideosink->dcontext != NULL) { glerror = - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_DeleteDrawable (pvrvideosink->dcontext-> - drawable_handle); + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_DeleteDrawable (pvrvideosink->dcontext->drawable_handle); if (glerror != WSEGL_SUCCESS) { GST_ERROR_OBJECT (pvrvideosink, "Error destroying drawable"); return; } glerror = - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_CreateWindowDrawable (pvrvideosink->dcontext-> - display_handle, pvrvideosink->dcontext->glconfig, + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_CreateWindowDrawable (pvrvideosink->dcontext->display_handle, + pvrvideosink->dcontext->glconfig, &pvrvideosink->dcontext->drawable_handle, (NativeWindowType) pvrvideosink->xwindow->window, &pvrvideosink->dcontext->rotation); @@ -145,9 +142,9 @@ gst_pvrvideosink_xwindow_update_geometry (GstPVRVideoSink * pvrvideosink) return; } glerror = - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_GetDrawableParameters (pvrvideosink->dcontext-> - drawable_handle, &source_params, &pvrvideosink->render_params); + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_GetDrawableParameters (pvrvideosink->dcontext->drawable_handle, + &source_params, &pvrvideosink->render_params); if (glerror != WSEGL_SUCCESS) { GST_ERROR_OBJECT (pvrvideosink, "Error getting Drawable params"); return; @@ -198,7 +195,7 @@ gst_pvrvideosink_handle_xevents (GstPVRVideoSink * pvrvideosink) g_mutex_unlock (pvrvideosink->dcontext->x_lock); g_mutex_unlock (pvrvideosink->flow_lock); - gst_pvrvideosink_expose (GST_X_OVERLAY (pvrvideosink)); + gst_pvrvideosink_expose (GST_VIDEO_OVERLAY (pvrvideosink)); g_mutex_lock (pvrvideosink->flow_lock); g_mutex_lock (pvrvideosink->dcontext->x_lock); @@ -284,58 +281,108 @@ gst_pvrvideosink_manage_event_thread (GstPVRVideoSink * pvrvideosink) static GstDrawContext * gst_pvrvideosink_get_dcontext (GstPVRVideoSink * pvrvideosink) { - GstDrawContext *dcontext; + GstDrawContext *dcontext = NULL; PVR2DERROR pvr_error; gint refresh_rate; DRI2WSDisplay *displayImpl; WSEGLError glerror; const WSEGLCaps *glcaps; + GST_DEBUG_OBJECT (pvrvideosink, "Getting draw context"); + dcontext = g_new0 (GstDrawContext, 1); - dcontext->p_blt_info = 0; dcontext->x_lock = g_mutex_new (); dcontext->p_blt_info = g_new0 (PVR2D_3DBLT_EXT, 1); - if (!dcontext->p_blt_info) { - GST_ERROR_OBJECT (pvrvideosink, "Alloc of bltinfo failed"); - return NULL; - } + if (!dcontext->p_blt_info) + goto p_blt_info_alloc_failed; + dcontext->p_blt2d_info = g_new0 (PVR2DBLTINFO, 1); + GST_LOG_OBJECT (pvrvideosink, "Opening X Display"); dcontext->x_display = XOpenDisplay (NULL); + if (dcontext->x_display == NULL) + goto fail_open_display; + + GST_LOG_OBJECT (pvrvideosink, "WSEGL_GetFunctionTablePointer()"); dcontext->wsegl_table = WSEGL_GetFunctionTablePointer (); + + GST_LOG_OBJECT (pvrvideosink, "pfnWSEGL_IsDisplayValid()"); glerror = dcontext->wsegl_table->pfnWSEGL_IsDisplayValid ( (NativeDisplayType) dcontext->x_display); - if (glerror != WSEGL_SUCCESS) { - GST_ERROR_OBJECT (pvrvideosink, "Display is not valid"); - return NULL; - } + if (glerror != WSEGL_SUCCESS) + goto display_invalid; + + GST_LOG_OBJECT (pvrvideosink, "pfnWSEGL_InitialiseDisplay()"); glerror = dcontext->wsegl_table->pfnWSEGL_InitialiseDisplay ( (NativeDisplayType) dcontext->x_display, &dcontext->display_handle, &glcaps, &dcontext->glconfig); - if (glerror != WSEGL_SUCCESS) { - GST_ERROR_OBJECT (pvrvideosink, "Error initializing display"); - return NULL; - } + if (glerror != WSEGL_SUCCESS) + goto display_init_failed; displayImpl = (DRI2WSDisplay *) dcontext->display_handle; dcontext->pvr_context = displayImpl->hContext; + GST_LOG_OBJECT (pvrvideosink, "PVR2DGetScreenMode()"); + pvr_error = PVR2DGetScreenMode (dcontext->pvr_context, &dcontext->display_format, &dcontext->display_width, &dcontext->display_height, &dcontext->stride, &refresh_rate); - if (pvr_error != PVR2D_OK) { - GST_ERROR_OBJECT (pvrvideosink, "Failed) to get screen mode" - "returned %d", pvr_error); - return NULL; - } + if (pvr_error != PVR2D_OK) + goto screen_mode_failed; + + GST_DEBUG_OBJECT (pvrvideosink, + "Got format:%d, width:%d, height:%d, stride:%d, refresh_rate:%d", + dcontext->display_format, dcontext->display_width, + dcontext->display_height, dcontext->stride, refresh_rate); + dcontext->screen_num = DefaultScreen (dcontext->x_display); dcontext->black = XBlackPixel (dcontext->x_display, dcontext->screen_num); + GST_DEBUG_OBJECT (pvrvideosink, "Returning dcontext %p", dcontext); + return dcontext; + +p_blt_info_alloc_failed: + { + GST_ERROR_OBJECT (pvrvideosink, "Alloc of bltinfo failed"); + gst_pvrvideosink_dcontext_free (dcontext); + return NULL; + } + +fail_open_display: + { + GST_ERROR_OBJECT (pvrvideosink, "Failed to open X Display"); + gst_pvrvideosink_dcontext_free (dcontext); + return NULL; + } + +display_invalid: + { + GST_ERROR_OBJECT (pvrvideosink, "Display is not valid (glerror:%d)", + glerror); + gst_pvrvideosink_dcontext_free (dcontext); + return NULL; + } + +display_init_failed: + { + GST_ERROR_OBJECT (pvrvideosink, "Error initializing display (glerror:%d)", + glerror); + gst_pvrvideosink_dcontext_free (dcontext); + return NULL; + } + +screen_mode_failed: + { + GST_ERROR_OBJECT (pvrvideosink, "Failed to get screen mode. error : %s", + gst_pvr2d_error_get_string (pvr_error)); + gst_pvrvideosink_dcontext_free (dcontext); + return NULL; + } } static void @@ -438,8 +485,9 @@ gst_pvrvideosink_create_window (GstPVRVideoSink * pvrvideosink, gint width, g_mutex_unlock (pvrvideosink->dcontext->x_lock); glerror = - dcontext->wsegl_table->pfnWSEGL_CreateWindowDrawable (dcontext-> - display_handle, dcontext->glconfig, &(dcontext->drawable_handle), + dcontext->wsegl_table-> + pfnWSEGL_CreateWindowDrawable (dcontext->display_handle, + dcontext->glconfig, &(dcontext->drawable_handle), (NativeWindowType) xwindow->window, &(dcontext->rotation)); if (glerror != WSEGL_SUCCESS) { @@ -447,8 +495,9 @@ gst_pvrvideosink_create_window (GstPVRVideoSink * pvrvideosink, gint width, return NULL; } glerror = - dcontext->wsegl_table->pfnWSEGL_GetDrawableParameters (dcontext-> - drawable_handle, &source_params, &pvrvideosink->render_params); + dcontext->wsegl_table-> + pfnWSEGL_GetDrawableParameters (dcontext->drawable_handle, &source_params, + &pvrvideosink->render_params); client_mem_info = (PVRSRV_CLIENT_MEM_INFO *) pvrvideosink->render_params.hPrivateData; PVR2DMEMINFO_INITIALISE (&dcontext->dst_mem, client_mem_info); @@ -462,39 +511,38 @@ gst_pvrvideosink_blit (GstPVRVideoSink * pvrvideosink, GstBuffer * buffer) { PVR2DERROR pvr_error; GstDrawContext *dcontext = pvrvideosink->dcontext; - GstCaps *caps; - GstStructure *structure; gint video_width; gint video_height; - gboolean ret; gboolean draw_border = FALSE; PPVR2D_3DBLT_EXT p_blt_3d; PVR2DMEMINFO *src_mem; - PVR2DFORMAT pvr_format = pvrvideosink->format == GST_VIDEO_FORMAT_NV12 ? - PVR2D_YUV420_2PLANE : PVR2D_ARGB8888; + PVR2DFORMAT pvr_format; GstVideoRectangle result; + GstPVRMeta *meta; + GstVideoCropMeta *cropmeta; + + GST_DEBUG_OBJECT (pvrvideosink, "buffer %p", buffer); + + pvr_format = + GST_VIDEO_INFO_FORMAT (&pvrvideosink->info) == + GST_VIDEO_FORMAT_NV12 ? PVR2D_YUV420_2PLANE : PVR2D_ARGB8888; - GST_DEBUG_OBJECT (pvrvideosink, "begin"); g_mutex_lock (pvrvideosink->flow_lock); if (buffer == NULL) buffer = pvrvideosink->current_buffer; - if (buffer == NULL) { - g_mutex_unlock (pvrvideosink->flow_lock); - return; - } + if (buffer == NULL) + goto done; + + meta = gst_buffer_get_pvr_meta (buffer); + if (G_UNLIKELY (meta == NULL)) + goto no_pvr_meta; - caps = GST_BUFFER_CAPS (buffer); - src_mem = gst_ducati_buffer_get_meminfo ((GstDucatiBuffer *) buffer); + src_mem = meta->src_mem; p_blt_3d = dcontext->p_blt_info; - structure = gst_caps_get_structure (caps, 0); - ret = gst_structure_get_int (structure, "width", &video_width); - ret &= gst_structure_get_int (structure, "height", &video_height); - if (!ret) { - GST_ERROR_OBJECT (pvrvideosink, "Failed to get dimensions of the buffer"); - goto done; - } + video_width = GST_VIDEO_SINK_WIDTH (pvrvideosink); + video_height = GST_VIDEO_SINK_HEIGHT (pvrvideosink); g_mutex_lock (pvrvideosink->dcontext->x_lock); @@ -531,9 +579,7 @@ gst_pvrvideosink_blit (GstPVRVideoSink * pvrvideosink, GstBuffer * buffer) p_blt_3d->sDst.pSurfMemInfo = &dcontext->dst_mem; p_blt_3d->sDst.SurfOffset = 0; - p_blt_3d->sDst.Stride = - gst_video_format_get_row_stride (GST_VIDEO_FORMAT_BGRx, 0, - pvrvideosink->render_params.ui32Stride); + p_blt_3d->sDst.Stride = 4 * pvrvideosink->render_params.ui32Stride; p_blt_3d->sDst.Format = PVR2D_ARGB8888; p_blt_3d->sDst.SurfWidth = pvrvideosink->xwindow->width; p_blt_3d->sDst.SurfHeight = pvrvideosink->xwindow->height; @@ -545,56 +591,41 @@ gst_pvrvideosink_blit (GstPVRVideoSink * pvrvideosink, GstBuffer * buffer) p_blt_3d->sSrc.pSurfMemInfo = src_mem; p_blt_3d->sSrc.SurfOffset = 0; - p_blt_3d->sSrc.Stride = pvrvideosink->rowstride; + p_blt_3d->sSrc.Stride = GST_VIDEO_INFO_COMP_STRIDE (&pvrvideosink->info, 0); p_blt_3d->sSrc.Format = pvr_format; p_blt_3d->sSrc.SurfWidth = video_width; p_blt_3d->sSrc.SurfHeight = video_height; - p_blt_3d->rcSource.left = 0; - p_blt_3d->rcSource.top = 0; - p_blt_3d->rcSource.right = video_width; - p_blt_3d->rcSource.bottom = video_height; + /* If buffer has crop information, use that */ + if ((cropmeta = gst_buffer_get_video_crop_meta (buffer))) { + p_blt_3d->rcSource.left = cropmeta->x; + p_blt_3d->rcSource.top = cropmeta->y; + p_blt_3d->rcSource.right = cropmeta->x + cropmeta->width; + p_blt_3d->rcSource.bottom = cropmeta->y + cropmeta->height; + } else { + p_blt_3d->rcSource.left = 0; + p_blt_3d->rcSource.top = 0; + p_blt_3d->rcSource.right = video_width; + p_blt_3d->rcSource.bottom = video_height; + } p_blt_3d->hUseCode = NULL; - if (pvrvideosink->format == GST_VIDEO_FORMAT_NV12) + if (GST_VIDEO_INFO_FORMAT (&pvrvideosink->info) == GST_VIDEO_FORMAT_NV12) p_blt_3d->bDisableDestInput = TRUE; else /* blit fails for RGB without this... not sure why yet... */ p_blt_3d->bDisableDestInput = FALSE; + GST_DEBUG_OBJECT (pvrvideosink, "about to blit"); + pvr_error = PVR2DBlt3DExt (pvrvideosink->dcontext->pvr_context, dcontext->p_blt_info); - switch (pvr_error) { - case PVR2D_OK: - break; - case PVR2DERROR_DEVICE_UNAVAILABLE: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, device unavailable"); - goto done; - break; - case PVR2DERROR_INVALID_CONTEXT: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, invalid context"); - goto done; - break; - case PVR2DERROR_INVALID_PARAMETER: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, invalid parameter"); - goto done; - break; - case PVR2DERROR_HW_FEATURE_NOT_SUPPORTED: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, " - "hardware feature not supported"); - goto done; - break; - case PVR2DERROR_GENERIC_ERROR: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, generic error"); - goto done; - break; - default: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, " - "undefined error %d", pvr_error); - goto done; - break; + if (pvr_error != PVR2D_OK) { + GST_ERROR_OBJECT (pvrvideosink, "Failed to blit. Error : %s", + gst_pvr2d_error_get_string (pvr_error)); + goto done; } dcontext->wsegl_table->pfnWSEGL_SwapDrawable (dcontext->drawable_handle, 1); @@ -608,19 +639,35 @@ gst_pvrvideosink_blit (GstPVRVideoSink * pvrvideosink, GstBuffer * buffer) done: GST_DEBUG_OBJECT (pvrvideosink, "end"); g_mutex_unlock (pvrvideosink->flow_lock); + return; + + /* Error cases */ + +no_pvr_meta: + { + g_mutex_unlock (pvrvideosink->flow_lock); + GST_ERROR_OBJECT (pvrvideosink, "Got a buffer without GstPVRMeta"); + return; + } } static void gst_pvrvideosink_destroy_drawable (GstPVRVideoSink * pvrvideosink) { + GST_DEBUG_OBJECT (pvrvideosink, "dcontext : %p", pvrvideosink->dcontext); + if (pvrvideosink->dcontext != NULL) { - if (pvrvideosink->dcontext->drawable_handle) - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_DeleteDrawable (pvrvideosink->dcontext-> - drawable_handle); + if (pvrvideosink->dcontext->drawable_handle) { + GST_DEBUG_OBJECT (pvrvideosink, "Deleting Drawable (drawable_handle:%p)", + pvrvideosink->dcontext->drawable_handle); + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_DeleteDrawable (pvrvideosink->dcontext->drawable_handle); + } - pvrvideosink->dcontext->wsegl_table->pfnWSEGL_CloseDisplay (pvrvideosink-> - dcontext->display_handle); + GST_DEBUG_OBJECT (pvrvideosink, "Closing display (display_handle:%p)", + pvrvideosink->dcontext->display_handle); + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_CloseDisplay (pvrvideosink->dcontext->display_handle); } } @@ -641,9 +688,7 @@ gst_pvrvideosink_pvrfill_rectangle (GstPVRVideoSink * pvrvideosink, p_blt2d_info->BlitFlags = PVR2D_BLIT_DISABLE_ALL; p_blt2d_info->DstOffset = 0; p_blt2d_info->CopyCode = PVR2DROPclear; - p_blt2d_info->DstStride = - gst_video_format_get_row_stride (GST_VIDEO_FORMAT_BGRx, 0, - pvrvideosink->render_params.ui32Stride); + p_blt2d_info->DstStride = 4 * pvrvideosink->render_params.ui32Stride; p_blt2d_info->DstFormat = PVR2D_ARGB8888; p_blt2d_info->DstSurfWidth = pvrvideosink->xwindow->width; p_blt2d_info->DstSurfHeight = pvrvideosink->xwindow->height; @@ -654,35 +699,10 @@ gst_pvrvideosink_pvrfill_rectangle (GstPVRVideoSink * pvrvideosink, pvr_error = PVR2DBlt (pvrvideosink->dcontext->pvr_context, p_blt2d_info); - switch (pvr_error) { - case PVR2D_OK: - break; - case PVR2DERROR_DEVICE_UNAVAILABLE: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, device unavailable"); - goto done; - break; - case PVR2DERROR_INVALID_CONTEXT: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, invalid context"); - goto done; - break; - case PVR2DERROR_INVALID_PARAMETER: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, invalid parameter"); - goto done; - break; - case PVR2DERROR_HW_FEATURE_NOT_SUPPORTED: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, " - "hardware feature not supported"); - goto done; - break; - case PVR2DERROR_GENERIC_ERROR: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, generic error"); - goto done; - break; - default: - GST_ERROR_OBJECT (pvrvideosink, "Failed to blit, " - "undefined error %d", pvr_error); - goto done; - break; + if (pvr_error != PVR2D_OK) { + GST_ERROR_OBJECT (pvrvideosink, "Failed to blit. Error : %s", + gst_pvr2d_error_get_string (pvr_error)); + goto done; } dcontext->wsegl_table->pfnWSEGL_SwapDrawable (dcontext->drawable_handle, 1); @@ -744,112 +764,106 @@ static gboolean gst_pvrvideosink_setcaps (GstBaseSink * bsink, GstCaps * caps) { GstPVRVideoSink *pvrvideosink; - gboolean ret = TRUE; + GstVideoInfo info; GstStructure *structure; - gint new_width, new_height; - const GValue *fps; - GstQuery *query; + GstBufferPool *oldpool, *newpool; pvrvideosink = GST_PVRVIDEOSINK (bsink); GST_DEBUG_OBJECT (pvrvideosink, - "sinkconnect possible caps with given caps %", caps); - - structure = gst_caps_get_structure (caps, 0); - - ret = gst_video_format_parse_caps_strided (caps, &pvrvideosink->format, - &new_width, &new_height, &pvrvideosink->rowstride); - if (pvrvideosink->rowstride == 0) - pvrvideosink->rowstride = - gst_video_format_get_row_stride (pvrvideosink->format, 0, new_width); - fps = gst_structure_get_value (structure, "framerate"); - ret &= (fps != NULL); - if (!ret) { - GST_ERROR_OBJECT (pvrvideosink, "problem at parsing caps"); - return FALSE; - } + "sinkconnect possible caps with given caps %" GST_PTR_FORMAT, caps); - if (pvrvideosink->current_caps) { - GST_DEBUG_OBJECT (pvrvideosink, "already have caps set"); - if (gst_caps_is_equal (pvrvideosink->current_caps, caps)) { - GST_DEBUG_OBJECT (pvrvideosink, "caps are equal!"); - return TRUE; - } - GST_DEBUG_OBJECT (pvrvideosink, "caps are different"); - } - - g_mutex_lock (pvrvideosink->pool_lock); - if (pvrvideosink->buffer_pool) { - if (!gst_caps_is_equal (pvrvideosink->buffer_pool->caps, caps)) { - GST_INFO_OBJECT (pvrvideosink, "in set caps, pool->caps != caps"); - gst_pvr_bufferpool_stop_running (pvrvideosink->buffer_pool, FALSE); - pvrvideosink->buffer_pool = NULL; - } - } - g_mutex_unlock (pvrvideosink->pool_lock); - - /* query to find if anyone upstream using these buffers has any - * minimum requirements: - */ - query = gst_query_new_buffers (caps); - if (gst_element_query (GST_ELEMENT (pvrvideosink), query)) { - gint min_buffers; - - gst_query_parse_buffers_count (query, &min_buffers); - - GST_DEBUG_OBJECT (pvrvideosink, "min_buffers=%d", min_buffers); - - /* XXX need to account for some buffers used by queue, etc.. probably - * queue should handle query, pass on to sink pad, and then add some - * number of buffers to the min, so this value is dynamic depending - * on the pipeline? - */ - if (min_buffers != -1) { - min_buffers += 3 + pvrvideosink->min_queued_bufs; - pvrvideosink->num_buffers_can_change = FALSE; - } + if (!gst_video_info_from_caps (&info, caps)) + goto invalid_format; - if (min_buffers > pvrvideosink->num_buffers) { - pvrvideosink->num_buffers = min_buffers; - } - } - gst_query_unref (query); + GST_VIDEO_SINK_WIDTH (pvrvideosink) = info.width; + GST_VIDEO_SINK_HEIGHT (pvrvideosink) = info.height; /* Notify application to set xwindow id now */ g_mutex_lock (pvrvideosink->flow_lock); if (!pvrvideosink->xwindow) { g_mutex_unlock (pvrvideosink->flow_lock); - gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (pvrvideosink)); + gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (pvrvideosink)); } else { g_mutex_unlock (pvrvideosink->flow_lock); } - GST_VIDEO_SINK_WIDTH (pvrvideosink) = new_width; - GST_VIDEO_SINK_HEIGHT (pvrvideosink) = new_height; g_mutex_lock (pvrvideosink->flow_lock); if (!pvrvideosink->xwindow) pvrvideosink->xwindow = gst_pvrvideosink_create_window (pvrvideosink, - new_width, new_height); + GST_VIDEO_SINK_WIDTH (pvrvideosink), + GST_VIDEO_SINK_HEIGHT (pvrvideosink)); g_mutex_unlock (pvrvideosink->flow_lock); - pvrvideosink->fps_n = gst_value_get_fraction_numerator (fps); - pvrvideosink->fps_d = gst_value_get_fraction_denominator (fps); + pvrvideosink->info = info; - pvrvideosink->current_caps = gst_caps_ref (caps); + /* After a resize, we want to redraw the borders in case the new frame size + * doesn't cover the same area */ + pvrvideosink->redraw_borders = TRUE; + + /* create a new pool for the new configuration */ + newpool = gst_pvr_buffer_pool_new (GST_ELEMENT_CAST (pvrvideosink)); + + /* PVR needs at least 3 buffers */ + structure = gst_buffer_pool_get_config (newpool); + gst_buffer_pool_config_set (structure, caps, GST_VIDEO_INFO_SIZE (&info), 3, + 0, 0, 15); + if (!gst_buffer_pool_set_config (newpool, structure)) + goto config_failed; + + oldpool = pvrvideosink->pool; + pvrvideosink->pool = newpool; + g_mutex_unlock (pvrvideosink->flow_lock); + + /* unref the old sink */ + if (oldpool) { + /* we don't deactivate, some elements might still be using it, it will + * be deactivated when the last ref is gone */ + gst_object_unref (oldpool); + } return TRUE; + +config_failed: + { + GST_ERROR_OBJECT (pvrvideosink, "failed to set config."); + g_mutex_unlock (pvrvideosink->flow_lock); + return FALSE; + } + +invalid_format: + { + GST_DEBUG_OBJECT (pvrvideosink, + "Could not locate image format from caps %" GST_PTR_FORMAT, caps); + return FALSE; + } } static GstCaps * -gst_pvrvideosink_getcaps (GstBaseSink * bsink) +gst_pvrvideosink_getcaps (GstBaseSink * bsink, GstCaps * filter) { GstPVRVideoSink *pvrvideosink; GstCaps *caps; + GST_DEBUG_OBJECT (bsink, "filter:%" GST_PTR_FORMAT, filter); + pvrvideosink = GST_PVRVIDEOSINK (bsink); - caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK - (pvrvideosink)->sinkpad)); + /* FIXME : If we have curently configured caps, we should return those + * intersected with the filter*/ + + caps = gst_pad_get_pad_template_caps (GST_BASE_SINK (pvrvideosink)->sinkpad); + if (filter) { + GstCaps *intersection; + + intersection = + gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = intersection; + } + + GST_DEBUG_OBJECT (bsink, "Returning %" GST_PTR_FORMAT, caps); + return caps; } @@ -875,14 +889,8 @@ gst_pvrvideosink_change_state (GstElement * element, GstStateChange transition) gst_pvrvideosink_manage_event_thread (pvrvideosink); break; case GST_STATE_CHANGE_READY_TO_PAUSED: - g_mutex_lock (pvrvideosink->pool_lock); - pvrvideosink->pool_invalid = FALSE; - g_mutex_unlock (pvrvideosink->pool_lock); break; case GST_STATE_CHANGE_PAUSED_TO_READY: - g_mutex_lock (pvrvideosink->pool_lock); - pvrvideosink->pool_invalid = TRUE; - g_mutex_unlock (pvrvideosink->pool_lock); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; @@ -896,8 +904,6 @@ gst_pvrvideosink_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: - pvrvideosink->fps_n = 0; - pvrvideosink->fps_d = 1; GST_VIDEO_SINK_WIDTH (pvrvideosink) = 0; GST_VIDEO_SINK_HEIGHT (pvrvideosink) = 0; break; @@ -924,185 +930,125 @@ gst_pvrvideosink_get_times (GstBaseSink * bsink, GstBuffer * buf, if (GST_BUFFER_DURATION_IS_VALID (buf)) { *end = *start + GST_BUFFER_DURATION (buf); } else { - if (pvrvideosink->fps_n > 0) { - *end = *start + - gst_util_uint64_scale_int (GST_SECOND, pvrvideosink->fps_d, - pvrvideosink->fps_n); + gint fps_n, fps_d; + fps_n = GST_VIDEO_INFO_FPS_N (&pvrvideosink->info); + fps_d = GST_VIDEO_INFO_FPS_D (&pvrvideosink->info); + if (fps_n > 0) { + *end = *start + gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); } } } } static GstFlowReturn -gst_pvrvideosink_show_frame (GstBaseSink * vsink, GstBuffer * buf) +gst_pvrvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buf) { - GstPVRVideoSink *pvrvideosink; - GstBuffer *newbuf = NULL; - g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); - - pvrvideosink = GST_PVRVIDEOSINK (vsink); + GstPVRVideoSink *pvrvideosink = GST_PVRVIDEOSINK (vsink); + GstPVRMeta *meta; GST_DEBUG_OBJECT (pvrvideosink, "render buffer: %p", buf); - if (!GST_IS_BUFFER (buf)) { - GstFlowReturn ret; - - /* special case check for sub-buffers: In certain cases, places like - * GstBaseTransform, which might check that the buffer is writable - * before copying metadata, timestamp, and such, will find that the - * buffer has more than one reference to it. In these cases, they - * will create a sub-buffer with an offset=0 and length equal to the - * original buffer size. - * - * This could happen in two scenarios: (1) a tee in the pipeline, and - * (2) because the refcnt is incremented in gst_mini_object_free() - * before the finalize function is called, and decremented after it - * returns.. but returning this buffer to the buffer pool in the - * finalize function, could wake up a thread blocked in _buffer_alloc() - * which could run and get a buffer w/ refcnt==2 before the thread - * originally unref'ing the buffer returns from finalize function and - * decrements the refcnt back to 1! - */ - if (buf->parent && - (GST_BUFFER_DATA (buf) == GST_BUFFER_DATA (buf->parent)) && - (GST_BUFFER_SIZE (buf) == GST_BUFFER_SIZE (buf->parent))) { - GST_DEBUG_OBJECT (pvrvideosink, "I have a sub-buffer!"); - return gst_pvrvideosink_show_frame (vsink, buf->parent); - } - - GST_DEBUG_OBJECT (pvrvideosink, - "slow-path.. I got a %s so I need to memcpy", - g_type_name (G_OBJECT_TYPE (buf))); - - ret = gst_pvrvideosink_buffer_alloc (GST_BASE_SINK (vsink), - GST_BUFFER_OFFSET (buf), GST_BUFFER_SIZE (buf), GST_BUFFER_CAPS (buf), - &newbuf); - - if (GST_FLOW_OK != ret) { - GST_DEBUG_OBJECT (pvrvideosink, "dropping frame!!"); - return GST_FLOW_OK; - } - - memcpy (GST_BUFFER_DATA (newbuf), - GST_BUFFER_DATA (buf), - MIN (GST_BUFFER_SIZE (newbuf), GST_BUFFER_SIZE (buf))); + meta = gst_buffer_get_pvr_meta (buf); - GST_DEBUG_OBJECT (pvrvideosink, "render copied buffer: %p", newbuf); - - buf = newbuf; + if (G_UNLIKELY (meta == NULL)) { + meta = gst_buffer_add_pvr_meta (buf, GST_ELEMENT_CAST (pvrvideosink)); + if (meta == NULL) + goto meta_failure; } gst_pvrvideosink_blit (pvrvideosink, buf); - if (newbuf) { - gst_buffer_unref (newbuf); - } - return GST_FLOW_OK; -} +meta_failure: + { + GST_WARNING_OBJECT (pvrvideosink, "Failed to map incoming buffer"); + return GST_FLOW_ERROR; + } +} -/* Buffer management - * - * The buffer_alloc function must either return a buffer with given size and - * caps or create a buffer with different caps attached to the buffer. This - * last option is called reverse negotiation, ie, where the sink suggests a - * different format from the upstream peer. - * - * We try to do reverse negotiation when our geometry changes and we like a - * resized buffer. - */ -static GstFlowReturn -gst_pvrvideosink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, - GstCaps * caps, GstBuffer ** buf) +static gboolean +gst_pvrvideosink_propose_allocation (GstBaseSink * bsink, GstQuery * query) { - GstPVRVideoSink *pvrvideosink; - GstDucatiBuffer *pvrvideo = NULL; - GstStructure *structure = NULL; - GstFlowReturn ret = GST_FLOW_OK; - gint width, height; + GstPVRVideoSink *pvrvideosink = (GstPVRVideoSink *) bsink; + GstBufferPool *pool; + GstStructure *config; + GstCaps *caps; + guint size; + gboolean need_pool; - pvrvideosink = GST_PVRVIDEOSINK (bsink); + gst_query_parse_allocation (query, &caps, &need_pool); - GST_DEBUG_OBJECT (pvrvideosink, "begin"); + if (caps == NULL) + goto no_caps; - if (G_UNLIKELY (!caps)) { - GST_WARNING_OBJECT (pvrvideosink, - "have no caps, doing fallback allocation"); - *buf = NULL; - ret = GST_FLOW_OK; - goto beach; - } + g_mutex_lock (pvrvideosink->flow_lock); + if ((pool = pvrvideosink->pool)) + gst_object_ref (pool); + g_mutex_unlock (pvrvideosink->flow_lock); - g_mutex_lock (pvrvideosink->pool_lock); - if (G_UNLIKELY (pvrvideosink->pool_invalid)) { - GST_DEBUG_OBJECT (pvrvideosink, "the pool is flushing"); - ret = GST_FLOW_WRONG_STATE; - g_mutex_unlock (pvrvideosink->pool_lock); - goto beach; - } else { - g_mutex_unlock (pvrvideosink->pool_lock); - } + if (pool != NULL) { + const GstCaps *pcaps; - GST_LOG_OBJECT (pvrvideosink, - "a buffer of %d bytes was requested with caps %" GST_PTR_FORMAT - " and offset %" G_GUINT64_FORMAT, size, caps, offset); - - /* get struct to see what is requested */ - structure = gst_caps_get_structure (caps, 0); - if (!gst_structure_get_int (structure, "width", &width) || - !gst_structure_get_int (structure, "height", &height)) { - GST_WARNING_OBJECT (pvrvideosink, "invalid caps for buffer allocation %" - GST_PTR_FORMAT, caps); - ret = GST_FLOW_NOT_NEGOTIATED; - goto beach; - } + /* we had a pool, check caps */ + GST_DEBUG_OBJECT (pvrvideosink, "check existing pool caps"); + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL); - g_mutex_lock (pvrvideosink->pool_lock); - /* initialize the buffer pool if not initialized yet */ - if (G_UNLIKELY (!pvrvideosink->buffer_pool || - pvrvideosink->buffer_pool->size != size)) { - if (pvrvideosink->buffer_pool) { - GST_INFO_OBJECT (pvrvideosink, "in buffer alloc, pool->size != size"); - gst_pvr_bufferpool_stop_running (pvrvideosink->buffer_pool, FALSE); + if (!gst_caps_is_equal (caps, pcaps)) { + GST_DEBUG_OBJECT (pvrvideosink, "pool has different caps"); + /* different caps, we can't use this pool */ + gst_object_unref (pool); + pool = NULL; } + } - GST_LOG_OBJECT (pvrvideosink, "Creating a buffer pool with %d buffers", - pvrvideosink->num_buffers); - if (!(pvrvideosink->buffer_pool = - gst_pvr_bufferpool_new (GST_ELEMENT (pvrvideosink), - caps, pvrvideosink->num_buffers, size, - pvrvideosink->dcontext->pvr_context))) { - g_mutex_unlock (pvrvideosink->pool_lock); - return GST_FLOW_ERROR; - } + if (pool == NULL && need_pool) { + GstVideoInfo info; + + GST_DEBUG_OBJECT (pvrvideosink, "create new pool"); + pool = gst_pvr_buffer_pool_new (GST_ELEMENT_CAST (pvrvideosink)); + + if (!gst_video_info_from_caps (&info, caps)) + goto invalid_caps; + + /* the normal size of a frame */ + size = info.size; + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0); + if (!gst_buffer_pool_set_config (pool, config)) + goto config_failed; } - pvrvideo = gst_pvr_bufferpool_get (pvrvideosink->buffer_pool, NULL); - g_mutex_unlock (pvrvideosink->pool_lock); + /* we need at least 3 buffers */ + gst_query_set_allocation_params (query, size, 3, 0, 0, 0, pool); - *buf = GST_BUFFER_CAST (pvrvideo); + /* we also support various metadata */ + gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API); -beach: - return ret; -} + gst_object_unref (pool); -/* Interfaces stuff */ + return TRUE; -static gboolean -gst_pvrvideosink_interface_supported (GstImplementsInterface * iface, - GType type) -{ - if (type == GST_TYPE_X_OVERLAY) - return TRUE; - else + /* ERRORS */ +no_caps: + { + GST_DEBUG_OBJECT (bsink, "no caps specified"); + return FALSE; + } +invalid_caps: + { + GST_DEBUG_OBJECT (bsink, "invalid caps specified"); + return FALSE; + } +config_failed: + { + GST_DEBUG_OBJECT (bsink, "failed setting config"); return FALSE; + } } -static void -gst_pvrvideosink_interface_init (GstImplementsInterfaceClass * klass) -{ - klass->supported = gst_pvrvideosink_interface_supported; -} +/* Interfaces stuff */ /* This function destroys a GstXWindow */ static void @@ -1129,9 +1075,9 @@ gst_pvrvideosink_xwindow_destroy (GstPVRVideoSink * pvrvideosink, } static void -gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) +gst_pvrvideosink_set_window_handle (GstVideoOverlay * overlay, guintptr id) { - XID xwindow_id = id; + XID window_handle = id; GstPVRVideoSink *pvrvideosink = GST_PVRVIDEOSINK (overlay); GstXWindow *xwindow = NULL; @@ -1140,7 +1086,7 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) g_mutex_lock (pvrvideosink->flow_lock); /* If we already use that window return */ - if (pvrvideosink->xwindow && (xwindow_id == pvrvideosink->xwindow->window)) { + if (pvrvideosink->xwindow && (window_handle == pvrvideosink->xwindow->window)) { g_mutex_unlock (pvrvideosink->flow_lock); return; } @@ -1153,14 +1099,6 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) return; } - /* Clear image pool as the images are unusable anyway */ - g_mutex_lock (pvrvideosink->pool_lock); - if (pvrvideosink->buffer_pool) { - gst_pvr_bufferpool_stop_running (pvrvideosink->buffer_pool, FALSE); - pvrvideosink->buffer_pool = NULL; - } - g_mutex_unlock (pvrvideosink->pool_lock); - /* If a window is there already we destroy it */ if (pvrvideosink->xwindow) { gst_pvrvideosink_xwindow_destroy (pvrvideosink, pvrvideosink->xwindow); @@ -1168,14 +1106,14 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) } /* If the xid is 0 we will create an internal one in buffer_alloc */ - if (xwindow_id != 0) { + if (window_handle != 0) { XWindowAttributes attr; WSEGLError glerror; WSEGLDrawableParams source_params; PVRSRV_CLIENT_MEM_INFO *client_mem_info; xwindow = g_new0 (GstXWindow, 1); - xwindow->window = xwindow_id; + xwindow->window = window_handle; /* Set the event we want to receive and create a GC */ g_mutex_lock (pvrvideosink->dcontext->x_lock); @@ -1203,9 +1141,9 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) g_mutex_unlock (pvrvideosink->dcontext->x_lock); glerror = - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_CreateWindowDrawable (pvrvideosink->dcontext-> - display_handle, pvrvideosink->dcontext->glconfig, + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_CreateWindowDrawable (pvrvideosink->dcontext->display_handle, + pvrvideosink->dcontext->glconfig, &(pvrvideosink->dcontext->drawable_handle), (NativeWindowType) xwindow->window, &(pvrvideosink->dcontext->rotation)); @@ -1215,9 +1153,9 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) return; } glerror = - pvrvideosink->dcontext-> - wsegl_table->pfnWSEGL_GetDrawableParameters (pvrvideosink->dcontext-> - drawable_handle, &source_params, &pvrvideosink->render_params); + pvrvideosink->dcontext->wsegl_table-> + pfnWSEGL_GetDrawableParameters (pvrvideosink->dcontext->drawable_handle, + &source_params, &pvrvideosink->render_params); client_mem_info = (PVRSRV_CLIENT_MEM_INFO *) pvrvideosink->render_params.hPrivateData; @@ -1231,7 +1169,7 @@ gst_pvrvideosink_set_window_handle (GstXOverlay * overlay, guintptr id) } static void -gst_pvrvideosink_expose (GstXOverlay * overlay) +gst_pvrvideosink_expose (GstVideoOverlay * overlay) { GstPVRVideoSink *pvrvideosink = GST_PVRVIDEOSINK (overlay); @@ -1239,7 +1177,7 @@ gst_pvrvideosink_expose (GstXOverlay * overlay) } static void -gst_pvrvideosink_set_event_handling (GstXOverlay * overlay, +gst_pvrvideosink_set_event_handling (GstVideoOverlay * overlay, gboolean handle_events) { GstPVRVideoSink *pvrvideosink = GST_PVRVIDEOSINK (overlay); @@ -1262,8 +1200,8 @@ gst_pvrvideosink_set_event_handling (GstXOverlay * overlay, } static void -gst_pvrvideosink_set_render_rectangle (GstXOverlay * overlay, gint x, gint y, - gint width, gint height) +gst_pvrvideosink_set_render_rectangle (GstVideoOverlay * overlay, gint x, + gint y, gint width, gint height) { GstPVRVideoSink *pvrvideosink = GST_PVRVIDEOSINK (overlay); @@ -1284,7 +1222,7 @@ gst_pvrvideosink_set_render_rectangle (GstXOverlay * overlay, gint x, gint y, } static void -gst_pvrvideosink_xoverlay_init (GstXOverlayClass * iface) +gst_pvrvideosink_videooverlay_init (GstVideoOverlayInterface * iface) { iface->set_window_handle = gst_pvrvideosink_set_window_handle; iface->expose = gst_pvrvideosink_expose; @@ -1338,11 +1276,72 @@ gst_pvrvideosink_get_property (GObject * object, guint prop_id, } } +void +gst_pvrvideosink_track_buffer (GstPVRVideoSink * pvrsink, GstBuffer * buffer) +{ + GST_DEBUG_OBJECT (pvrsink, "Adding buffer %p to tracked buffers", buffer); + pvrsink->metabuffers = g_list_prepend (pvrsink->metabuffers, buffer); +} + +void +gst_pvrvideosink_untrack_buffer (GstPVRVideoSink * pvrsink, GstBuffer * buffer) +{ + GST_DEBUG_OBJECT (pvrsink, "Removing buffer %p from tracked buffers", buffer); + pvrsink->metabuffers = g_list_remove_all (pvrsink->metabuffers, buffer); +} + +static void +gst_pvrvideosink_release_pvr_metas (GstPVRVideoSink * pvrsink) +{ + GstBuffer *buf; + GstPVRMeta *pvrmeta; + + GST_DEBUG_OBJECT (pvrsink, "Releasing pending PVR metas"); + + while (pvrsink->metabuffers) { + buf = (GstBuffer *) pvrsink->metabuffers->data; + + pvrmeta = gst_buffer_get_pvr_meta (buf); + if (pvrmeta) + gst_buffer_remove_meta (buf, (GstMeta *) pvrmeta); + } + + GST_DEBUG_OBJECT (pvrsink, "Done"); +} + +static void +gst_pvrvideosink_dcontext_free (GstDrawContext * dcontext) +{ + GST_DEBUG ("Freeing dcontext %p", dcontext); + + if (dcontext->p_blt_info) + g_free (dcontext->p_blt_info); + + if (dcontext->p_blt2d_info) + g_free (dcontext->p_blt2d_info); + + if (dcontext->x_lock) + g_mutex_lock (dcontext->x_lock); + if (dcontext->x_display) { + GST_LOG ("Closing display"); + XCloseDisplay (dcontext->x_display); + } + if (dcontext->x_lock) { + g_mutex_unlock (dcontext->x_lock); + g_mutex_free (dcontext->x_lock); + } + + g_free (dcontext); +} + static void gst_pvrvideosink_dcontext_clear (GstPVRVideoSink * pvrvideosink) { GstDrawContext *dcontext; + GST_DEBUG_OBJECT (pvrvideosink, "Clearing dcontext %p", + pvrvideosink->dcontext); + GST_OBJECT_LOCK (pvrvideosink); if (!pvrvideosink->dcontext) { GST_OBJECT_UNLOCK (pvrvideosink); @@ -1353,15 +1352,7 @@ gst_pvrvideosink_dcontext_clear (GstPVRVideoSink * pvrvideosink) pvrvideosink->dcontext = NULL; GST_OBJECT_UNLOCK (pvrvideosink); - if (dcontext->p_blt_info) - g_free (dcontext->p_blt_info); - - g_mutex_lock (dcontext->x_lock); - XCloseDisplay (dcontext->x_display); - g_mutex_unlock (dcontext->x_lock); - g_mutex_free (dcontext->x_lock); - - g_free (dcontext); + gst_pvrvideosink_dcontext_free (dcontext); } static void @@ -1369,6 +1360,8 @@ gst_pvrvideosink_reset (GstPVRVideoSink * pvrvideosink) { GThread *thread; + GST_DEBUG_OBJECT (pvrvideosink, "Resetting"); + GST_OBJECT_LOCK (pvrvideosink); pvrvideosink->running = FALSE; thread = pvrvideosink->event_thread; @@ -1379,23 +1372,24 @@ gst_pvrvideosink_reset (GstPVRVideoSink * pvrvideosink) g_thread_join (thread); if (pvrvideosink->current_buffer) { + GST_LOG_OBJECT (pvrvideosink, "Removing cached buffer"); gst_buffer_unref (pvrvideosink->current_buffer); pvrvideosink->current_buffer = NULL; } - g_mutex_lock (pvrvideosink->pool_lock); - pvrvideosink->pool_invalid = TRUE; - if (pvrvideosink->buffer_pool) { - gst_pvr_bufferpool_stop_running (pvrvideosink->buffer_pool, TRUE); - pvrvideosink->buffer_pool = NULL; + if (pvrvideosink->pool) { + GST_LOG_OBJECT (pvrvideosink, "Unreffing pool"); + gst_object_unref (pvrvideosink->pool); + pvrvideosink->pool = NULL; } - g_mutex_unlock (pvrvideosink->pool_lock); memset (&pvrvideosink->render_params, 0, sizeof (WSEGLDrawableParams)); pvrvideosink->render_rect.x = pvrvideosink->render_rect.y = 0; pvrvideosink->render_rect.w = pvrvideosink->render_rect.h = 0; pvrvideosink->have_render_rect = FALSE; + gst_pvrvideosink_release_pvr_metas (pvrvideosink); + gst_pvrvideosink_destroy_drawable (pvrvideosink); if (pvrvideosink->xwindow) { @@ -1419,10 +1413,6 @@ gst_pvrvideosink_finalize (GObject * object) g_mutex_free (pvrvideosink->flow_lock); pvrvideosink->flow_lock = NULL; } - if (pvrvideosink->pool_lock) { - g_mutex_free (pvrvideosink->pool_lock); - pvrvideosink->pool_lock = NULL; - } G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -1432,19 +1422,11 @@ gst_pvrvideosink_init (GstPVRVideoSink * pvrvideosink) { pvrvideosink->running = FALSE; - pvrvideosink->fps_n = 0; - pvrvideosink->fps_d = 1; - pvrvideosink->flow_lock = g_mutex_new (); - pvrvideosink->pool_lock = g_mutex_new (); - pvrvideosink->buffer_pool = NULL; - pvrvideosink->pool_invalid = TRUE; + pvrvideosink->pool = NULL; pvrvideosink->keep_aspect = FALSE; pvrvideosink->current_caps = NULL; - pvrvideosink->num_buffers = DEFAULT_QUEUE_SIZE; - pvrvideosink->num_buffers_can_change = TRUE; - pvrvideosink->min_queued_bufs = DEFAULT_MIN_QUEUED_BUFS; pvrvideosink->dcontext = NULL; pvrvideosink->xwindow = NULL; pvrvideosink->redraw_borders = TRUE; @@ -1454,29 +1436,17 @@ gst_pvrvideosink_init (GstPVRVideoSink * pvrvideosink) } static void -gst_pvrvideosink_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, - "PVR Video sink", "Sink/Video", - "A PVR videosink", - "Luciana Fujii Pontello <luciana.fujii@collabora.co.uk"); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_pvrvideosink_sink_template_factory)); -} - -static void gst_pvrvideosink_class_init (GstPVRVideoSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; + GstVideoSinkClass *videosink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; + videosink_class = (GstVideoSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); @@ -1490,59 +1460,21 @@ gst_pvrvideosink_class_init (GstPVRVideoSinkClass * klass) "original aspect ratio", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_set_details_simple (gstelement_class, + "PVR Video sink", "Sink/Video", + "A PVR videosink", + "Luciana Fujii Pontello <luciana.fujii@collabora.co.uk"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_pvrvideosink_sink_template_factory)); + gstelement_class->change_state = gst_pvrvideosink_change_state; gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_pvrvideosink_setcaps); gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_pvrvideosink_getcaps); - gstbasesink_class->buffer_alloc = - GST_DEBUG_FUNCPTR (gst_pvrvideosink_buffer_alloc); + gstbasesink_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_pvrvideosink_propose_allocation); gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_pvrvideosink_get_times); - gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_pvrvideosink_show_frame); -} - -/* ============================================================= */ -/* */ -/* Public Methods */ -/* */ -/* ============================================================= */ - -/* =========================================== */ -/* */ -/* Object typing & Creation */ -/* */ -/* =========================================== */ - -GType -gst_pvrvideosink_get_type (void) -{ - static GType pvrvideosink_type = 0; - - if (!pvrvideosink_type) { - static const GTypeInfo pvrvideosink_info = { - sizeof (GstPVRVideoSinkClass), - gst_pvrvideosink_base_init, - NULL, - (GClassInitFunc) gst_pvrvideosink_class_init, - NULL, - NULL, - sizeof (GstPVRVideoSink), 0, (GInstanceInitFunc) gst_pvrvideosink_init, - }; - static const GInterfaceInfo iface_info = { - (GInterfaceInitFunc) gst_pvrvideosink_interface_init, NULL, NULL, - }; - static const GInterfaceInfo overlay_info = { - (GInterfaceInitFunc) gst_pvrvideosink_xoverlay_init, NULL, NULL, - }; - - pvrvideosink_type = g_type_register_static (GST_TYPE_VIDEO_SINK, - "GstPVRVideoSink", &pvrvideosink_info, 0); - - g_type_add_interface_static (pvrvideosink_type, - GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); - g_type_add_interface_static (pvrvideosink_type, GST_TYPE_X_OVERLAY, - &overlay_info); - } - - return pvrvideosink_type; + videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_pvrvideosink_show_frame); } diff --git a/sys/pvr2d/gstpvrvideosink.h b/sys/pvr2d/gstpvrvideosink.h index 45f6a129e..f0b9df6a9 100644 --- a/sys/pvr2d/gstpvrvideosink.h +++ b/sys/pvr2d/gstpvrvideosink.h @@ -25,7 +25,6 @@ #include <gst/video/gstvideosink.h> #include <gst/video/video.h> -#include "gstpvrbufferpool.h" #include <string.h> #include <math.h> @@ -98,7 +97,6 @@ struct _GstXWindow * @fps_d: the framerate fraction denominator * @flow_lock: used to protect data flow routines from external calls such as * events from @event_thread or methods from the #GstXOverlay interface - * @pool_lock: used to protect the buffer pool * @x_lock: used to protect X calls * @buffer_pool: a list of #GstPVRVideoBuffer that could be reused at next buffer * allocation call @@ -115,20 +113,12 @@ struct _GstPVRVideoSink gboolean running; /* Framerate numerator and denominator */ - GstVideoFormat format; - gint fps_n; - gint fps_d; - gint rowstride; + GstVideoInfo info; GThread *event_thread; GMutex *flow_lock; - GMutex *pool_lock; - GstPvrBufferPool *buffer_pool; - gboolean pool_invalid; - gint num_buffers; - gboolean num_buffers_can_change; - gint min_queued_bufs; + GstBufferPool *pool; gboolean keep_aspect; @@ -143,6 +133,9 @@ struct _GstPVRVideoSink gboolean redraw_borders; GstBuffer *current_buffer; + /* List of buffer using GstPVRMeta on ourselves */ + GList *metabuffers; + WSEGLDrawableParams render_params; }; @@ -153,5 +146,8 @@ struct _GstPVRVideoSinkClass GType gst_pvrvideosink_get_type (void); +void gst_pvrvideosink_track_buffer (GstPVRVideoSink * pvrsink, GstBuffer * buffer); +void gst_pvrvideosink_untrack_buffer (GstPVRVideoSink * pvrsink, GstBuffer * buffer); + G_END_DECLS #endif /* __GST_PVRVIDEOSINK_H__ */ diff --git a/sys/qcam/gstqcamsrc.c b/sys/qcam/gstqcamsrc.c index 2bd3a5855..76229ac76 100644 --- a/sys/qcam/gstqcamsrc.c +++ b/sys/qcam/gstqcamsrc.c @@ -148,8 +148,8 @@ gst_qcamsrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &gst_qcamsrc_src_factory); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_qcamsrc_src_factory)); gst_element_class_set_details_simple (element_class, "QCam Source", "Source/Video", "Read from a QuickCam device", "Wim Taymans <wim.taymans@chello.be>"); diff --git a/sys/qtwrapper/audiodecoders.c b/sys/qtwrapper/audiodecoders.c index abb2541de..32f8e1d43 100644 --- a/sys/qtwrapper/audiodecoders.c +++ b/sys/qtwrapper/audiodecoders.c @@ -747,7 +747,8 @@ process_buffer_cb (ComponentInstance inAudioConverter, return noErr; } - GST_LOG_OBJECT (qtwrapper, "No remaining input data, returning NO_MORE_INPUT_DATA"); + GST_LOG_OBJECT (qtwrapper, + "No remaining input data, returning NO_MORE_INPUT_DATA"); return NO_MORE_INPUT_DATA; } @@ -970,7 +971,8 @@ qtwrapper_audio_decoder_base_init (QTWrapperAudioDecoderClass * klass) klass->sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, params->sinkcaps); gst_element_class_add_pad_template (element_class, klass->sinktempl); - gst_element_class_add_static_pad_template (element_class, &src_templ); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); /* Store class-global values */ klass->componentSubType = desc.componentSubType; diff --git a/sys/qtwrapper/videodecoders.c b/sys/qtwrapper/videodecoders.c index c532ef9bb..b2e58e968 100644 --- a/sys/qtwrapper/videodecoders.c +++ b/sys/qtwrapper/videodecoders.c @@ -171,7 +171,8 @@ qtwrapper_video_decoder_base_init (QTWrapperVideoDecoderClass * klass) GST_PAD_ALWAYS, params->sinkcaps); gst_element_class_add_pad_template (element_class, klass->sinktempl); - gst_element_class_add_static_pad_template (element_class, &src_templ); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); /* Store class-global values */ klass->component = params->component; diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c index 903760be1..cb6c92bfa 100644 --- a/sys/shm/gstshmsink.c +++ b/sys/shm/gstshmsink.c @@ -96,7 +96,8 @@ gst_shm_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sinktemplate)); gst_element_class_set_details_simple (element_class, "Shared Memory Sink", diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c index cff5d46da..bbeadcd7d 100644 --- a/sys/shm/gstshmsrc.c +++ b/sys/shm/gstshmsrc.c @@ -85,7 +85,8 @@ gst_shm_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); gst_element_class_set_details_simple (element_class, "Shared Memory Source", diff --git a/sys/vcd/vcdsrc.c b/sys/vcd/vcdsrc.c index 553e264cc..5ce58d870 100644 --- a/sys/vcd/vcdsrc.c +++ b/sys/vcd/vcdsrc.c @@ -99,7 +99,8 @@ gst_vcdsrc_base_init (gpointer g_class) "Source/File", "Asynchronous read from VCD disk", "Erik Walthinsen <omega@cse.ogi.edu>"); - gst_element_class_add_static_pad_template (element_class, &srctemplate); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&srctemplate)); } static void diff --git a/sys/vdpau/gstvdp/gstvdpdecoder.c b/sys/vdpau/gstvdp/gstvdpdecoder.c index a400a39d6..977f6e6b2 100644 --- a/sys/vdpau/gstvdp/gstvdpdecoder.c +++ b/sys/vdpau/gstvdp/gstvdpdecoder.c @@ -293,7 +293,6 @@ gst_vdp_decoder_base_init (gpointer g_class) GST_PAD_SRC, GST_PAD_ALWAYS, src_caps); gst_element_class_add_pad_template (element_class, src_template); - gst_object_unref (src_template); } static void diff --git a/sys/vdpau/gstvdpsink.c b/sys/vdpau/gstvdpsink.c index 7b9fa2e6c..c3d097fdd 100644 --- a/sys/vdpau/gstvdpsink.c +++ b/sys/vdpau/gstvdpsink.c @@ -1383,8 +1383,8 @@ gst_vdp_sink_base_init (gpointer g_class) "Sink/Video", "VDPAU Sink", "Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } static void diff --git a/sys/vdpau/gstvdpvideopostprocess.c b/sys/vdpau/gstvdpvideopostprocess.c index 09e484409..ced168fec 100644 --- a/sys/vdpau/gstvdpvideopostprocess.c +++ b/sys/vdpau/gstvdpvideopostprocess.c @@ -1190,14 +1190,12 @@ gst_vdp_vpp_base_init (gpointer gclass) src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps); gst_element_class_add_pad_template (element_class, src_template); - gst_object_unref (src_template); /* SINK PAD */ sink_caps = gst_vdp_video_buffer_get_caps (FALSE, 0); sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps); gst_element_class_add_pad_template (element_class, sink_template); - gst_object_unref (sink_template); } /* initialize the vdpaumpegdecoder's class */ diff --git a/sys/vdpau/h264/gstvdph264dec.c b/sys/vdpau/h264/gstvdph264dec.c index 6b6c3360a..6c181aff0 100644 --- a/sys/vdpau/h264/gstvdph264dec.c +++ b/sys/vdpau/h264/gstvdph264dec.c @@ -870,8 +870,8 @@ gst_vdp_h264_dec_base_init (gpointer g_class) "Decode h264 stream with vdpau", "Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } static void diff --git a/sys/vdpau/mpeg/gstvdpmpegdec.c b/sys/vdpau/mpeg/gstvdpmpegdec.c index 6a473e48e..3de0eec65 100644 --- a/sys/vdpau/mpeg/gstvdpmpegdec.c +++ b/sys/vdpau/mpeg/gstvdpmpegdec.c @@ -624,8 +624,8 @@ gst_vdp_mpeg_dec_base_init (gpointer gclass) "Decode mpeg stream with vdpau", "Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } /* initialize the vdpaumpegdecoder's class */ diff --git a/sys/vdpau/mpeg4/gstvdpmpeg4dec.c b/sys/vdpau/mpeg4/gstvdpmpeg4dec.c index 4c1bcb8b3..2ecf434e1 100644 --- a/sys/vdpau/mpeg4/gstvdpmpeg4dec.c +++ b/sys/vdpau/mpeg4/gstvdpmpeg4dec.c @@ -445,8 +445,8 @@ gst_vdp_mpeg4_dec_base_init (gpointer gclass) "Decode mpeg4 stream with vdpau", "Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>"); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); } /* initialize the vdpaumpeg4decoder's class */ diff --git a/sys/wasapi/gstwasapisink.c b/sys/wasapi/gstwasapisink.c index 8e515dc93..3a3d9e906 100644 --- a/sys/wasapi/gstwasapisink.c +++ b/sys/wasapi/gstwasapisink.c @@ -65,8 +65,8 @@ gst_wasapi_sink_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); gst_element_class_set_details_simple (element_class, "WasapiSrc", "Sink/Audio", "Stream audio to an audio capture device through WASAPI", diff --git a/sys/wasapi/gstwasapisrc.c b/sys/wasapi/gstwasapisrc.c index 0ef642b08..a4100315b 100644 --- a/sys/wasapi/gstwasapisrc.c +++ b/sys/wasapi/gstwasapisrc.c @@ -69,7 +69,8 @@ gst_wasapi_src_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "WasapiSrc", "Source/Audio", "Stream audio from an audio capture device through WASAPI", diff --git a/sys/wininet/gstwininetsrc.c b/sys/wininet/gstwininetsrc.c index b21e3d0be..8104f7cea 100644 --- a/sys/wininet/gstwininetsrc.c +++ b/sys/wininet/gstwininetsrc.c @@ -83,7 +83,8 @@ gst_win_inet_src_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "Windows Network Source", "Source/Network", diff --git a/sys/winks/gstksvideosrc.c b/sys/winks/gstksvideosrc.c index 3f2b66914..897ff0c34 100644 --- a/sys/winks/gstksvideosrc.c +++ b/sys/winks/gstksvideosrc.c @@ -167,7 +167,6 @@ static void gst_ks_video_src_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - GstPadTemplate *pad_template; gst_element_class_set_details_simple (element_class, "KsVideoSrc", "Source/Video", @@ -176,11 +175,9 @@ gst_ks_video_src_base_init (gpointer gclass) "Haakon Sporsheim <hakon.sporsheim@tandberg.com>\n" "Andres Colubri <andres.colubri@gmail.com>"); - pad_template = + gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - ks_video_get_all_caps ()); - gst_element_class_add_pad_template (element_class, pad_template); - gst_object_unref (pad_template); + ks_video_get_all_caps ())); } static void @@ -756,7 +753,7 @@ gst_ks_video_src_set_clock (GstElement * element, GstClock * clock) gst_ks_clock_provide_master_clock (priv->ksclock, clock); GST_OBJECT_UNLOCK (element); - return TRUE; + return GST_ELEMENT_CLASS (element)->set_clock (element, clock); } static GstCaps * diff --git a/sys/winscreencap/gstdx9screencapsrc.c b/sys/winscreencap/gstdx9screencapsrc.c index 72a04cecd..83bcea277 100644 --- a/sys/winscreencap/gstdx9screencapsrc.c +++ b/sys/winscreencap/gstdx9screencapsrc.c @@ -101,7 +101,8 @@ gst_dx9screencapsrc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "DirectX 9 screen capture source", "Source/Video", "Captures screen", diff --git a/sys/winscreencap/gstgdiscreencapsrc.c b/sys/winscreencap/gstgdiscreencapsrc.c index a10a2fc00..ff9ea7b72 100644 --- a/sys/winscreencap/gstgdiscreencapsrc.c +++ b/sys/winscreencap/gstgdiscreencapsrc.c @@ -97,7 +97,8 @@ gst_gdiscreencapsrc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_static_pad_template (element_class, &src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); gst_element_class_set_details_simple (element_class, "GDI screen capture source", "Source/Video", "Captures screen", "Haakon Sporsheim <hakon.sporsheim@tandberg.com>"); diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 74e186073..76f39f59e 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -213,7 +213,7 @@ noinst_HEADERS = elements/mxfdemux.h TESTS = $(check_PROGRAMS) -AM_CFLAGS = $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) \ +AM_CFLAGS = $(GST_CFLAGS) $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) \ -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS LDADD = $(GST_CHECK_LIBS) @@ -223,7 +223,7 @@ noinst_LTLIBRARIES = libparser.la libparser_la_SOURCES = elements/parser.c elements/parser.h libparser_la_CFLAGS = \ -I$(top_srcdir)/tests/check \ - $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) + $(GST_CFLAGS) $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) elements_mpegvideoparse_LDADD = libparser.la $(LDADD) diff --git a/tests/check/elements/asfmux.c b/tests/check/elements/asfmux.c index abc641f97..c2bfeaf4e 100644 --- a/tests/check/elements/asfmux.c +++ b/tests/check/elements/asfmux.c @@ -92,9 +92,7 @@ teardown_src_pad (GstElement * element, const gchar * sinkname) gchar *padname; /* clean up floating src pad */ - /* hm, asfmux uses _01 as suffixes for padnames */ - padname = g_strdup (sinkname); - memcpy (strchr (padname, '%'), "01", 2); + padname = g_strdup_printf (sinkname, 1); if (!(sinkpad = gst_element_get_static_pad (element, padname))) sinkpad = gst_element_get_request_pad (element, padname); g_free (padname); @@ -130,7 +128,7 @@ setup_asfmux (GstStaticPadTemplate * srctemplate, const gchar * sinkname) asfmux = gst_check_setup_element ("asfmux"); mysrcpad = setup_src_pad (asfmux, srctemplate, NULL, sinkname); - mysinkpad = gst_check_setup_sink_pad (asfmux, &sinktemplate, NULL); + mysinkpad = gst_check_setup_sink_pad (asfmux, &sinktemplate); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return asfmux; @@ -181,14 +179,14 @@ check_asfmux_pad (GstStaticPadTemplate * srctemplate, GST_START_TEST (test_video_pad) { - check_asfmux_pad (&srcvideotemplate, VIDEO_CAPS_STRING, "video_%d"); + check_asfmux_pad (&srcvideotemplate, VIDEO_CAPS_STRING, "video_%u"); } GST_END_TEST; GST_START_TEST (test_audio_pad) { - check_asfmux_pad (&srcaudiotemplate, AUDIO_CAPS_STRING, "audio_%d"); + check_asfmux_pad (&srcaudiotemplate, AUDIO_CAPS_STRING, "audio_%u"); } GST_END_TEST; diff --git a/tests/check/elements/autoconvert.c b/tests/check/elements/autoconvert.c index f341a9944..e1fffe00c 100644 --- a/tests/check/elements/autoconvert.c +++ b/tests/check/elements/autoconvert.c @@ -115,9 +115,9 @@ GST_START_TEST (test_autoconvert_simple) set_autoconvert_factories (autoconvert); - test_src_pad = gst_check_setup_src_pad (autoconvert, &src_factory, NULL); + test_src_pad = gst_check_setup_src_pad (autoconvert, &src_factory); gst_pad_set_active (test_src_pad, TRUE); - test_sink_pad = gst_check_setup_sink_pad (autoconvert, &sink_factory, NULL); + test_sink_pad = gst_check_setup_sink_pad (autoconvert, &sink_factory); gst_pad_set_active (test_sink_pad, TRUE); gst_element_set_state (GST_ELEMENT_CAST (autoconvert), GST_STATE_PLAYING); @@ -206,9 +206,13 @@ static void test_element1_class_init (TestElement1Class * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstPadTemplate *src_template, *sink_template; - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + src_template = gst_static_pad_template_get (&src_factory); + gst_element_class_add_pad_template (element_class, src_template); + + sink_template = gst_static_pad_template_get (&sink_factory); + gst_element_class_add_pad_template (element_class, sink_template); } static void @@ -221,9 +225,13 @@ static void test_element2_class_init (TestElement2Class * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstPadTemplate *src_template, *sink_template; + + src_template = gst_static_pad_template_get (&src_factory); + gst_element_class_add_pad_template (element_class, src_template); - gst_element_class_add_static_pad_template (element_class, &src_factory); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + sink_template = gst_static_pad_template_get (&sink_factory); + gst_element_class_add_pad_template (element_class, sink_template); } static void diff --git a/tests/check/elements/baseaudiovisualizer.c b/tests/check/elements/baseaudiovisualizer.c index f06b53d04..7de009518 100644 --- a/tests/check/elements/baseaudiovisualizer.c +++ b/tests/check/elements/baseaudiovisualizer.c @@ -72,10 +72,10 @@ gst_test_scope_base_init (gpointer g_class) "Visualization", "Dummy test scope", "Stefan Kost <ensonic@users.sf.net>"); - gst_element_class_add_static_pad_template (element_class, - &gst_test_scope_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_test_scope_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_test_scope_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_test_scope_sink_template)); } static void @@ -126,8 +126,8 @@ GST_START_TEST (count_in_out) /* setup up */ elem = gst_check_setup_element ("testscope"); - srcpad = gst_check_setup_src_pad (elem, &srctemplate, NULL); - sinkpad = gst_check_setup_sink_pad (elem, &sinktemplate, NULL); + srcpad = gst_check_setup_src_pad (elem, &srctemplate); + sinkpad = gst_check_setup_sink_pad (elem, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); fail_unless (gst_element_set_state (elem, diff --git a/tests/check/elements/camerabin2.c b/tests/check/elements/camerabin2.c index f39e4aaaf..efdd977f0 100644 --- a/tests/check/elements/camerabin2.c +++ b/tests/check/elements/camerabin2.c @@ -38,8 +38,8 @@ #define CAPTURE_COUNT 3 #define VIDEO_DURATION 5 -#define VIDEO_PAD_SUPPORTED_CAPS GST_VIDEO_CAPS_RGB ", width=600, height=480" -#define IMAGE_PAD_SUPPORTED_CAPS GST_VIDEO_CAPS_RGB ", width=800, height=600" +#define VIDEO_PAD_SUPPORTED_CAPS "video/x-raw, format=rgb, width=600, height=480" +#define IMAGE_PAD_SUPPORTED_CAPS "video/x-raw, format=rgb, width=800, height=600" /* custom test camera src element */ #define GST_TYPE_TEST_CAMERA_SRC \ @@ -74,8 +74,8 @@ struct _GstTestCameraSrcClass GType gst_test_camera_src_get_type (void); -GST_BOILERPLATE (GstTestCameraSrc, - gst_test_camera_src, GstBaseCameraSrc, GST_TYPE_BASE_CAMERA_SRC); +#define gst_test_camera_src_parent_class parent_class +G_DEFINE_TYPE (GstTestCameraSrc, gst_test_camera_src, GST_TYPE_BASE_CAMERA_SRC); static gboolean gst_test_camera_src_set_mode (GstBaseCameraSrc * src, GstCameraBinMode mode) @@ -86,51 +86,65 @@ gst_test_camera_src_set_mode (GstBaseCameraSrc * src, GstCameraBinMode mode) return TRUE; } -static GstCaps * -gst_test_camera_src_get_caps (GstPad * pad) +static gboolean +gst_test_camera_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstTestCameraSrc *self = (GstTestCameraSrc *) GST_PAD_PARENT (pad); GstCaps *result = NULL; - - if (pad == self->vfpad) { - result = gst_caps_new_any (); - } else if (pad == self->vidpad) { - result = gst_caps_from_string (VIDEO_PAD_SUPPORTED_CAPS); - } else if (pad == self->imgpad) { - result = gst_caps_from_string (IMAGE_PAD_SUPPORTED_CAPS); - } else { - g_assert_not_reached (); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CAPS: + if (pad == self->vfpad) { + result = gst_caps_new_any (); + } else if (pad == self->vidpad) { + result = gst_caps_from_string (VIDEO_PAD_SUPPORTED_CAPS); + } else if (pad == self->imgpad) { + result = gst_caps_from_string (IMAGE_PAD_SUPPORTED_CAPS); + } else { + g_assert_not_reached (); + } + if (result) { + GstCaps *filter; + + gst_query_parse_caps (query, &filter); + if (filter) { + GstCaps *tmp; + tmp = gst_caps_intersect (result, filter); + gst_caps_replace (&result, tmp); + gst_caps_unref (tmp); + } + gst_query_set_caps_result (query, result); + ret = TRUE; + } + break; + default: + break; } - return result; -} - -static void -gst_test_camera_src_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (gstelement_class, - "Test Camera Src", - "Camera/Src", - "Some test camera src", - "Thiago Santos <thiago.sousa.santos@collabora.co.uk>"); + return ret; } static void gst_test_camera_src_class_init (GstTestCameraSrcClass * klass) { GstBaseCameraSrcClass *gstbasecamera_class; + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gstbasecamera_class = GST_BASE_CAMERA_SRC_CLASS (klass); gstbasecamera_class->set_mode = gst_test_camera_src_set_mode; + + gst_element_class_set_details_simple (gstelement_class, + "Test Camera Src", + "Camera/Src", + "Some test camera src", + "Thiago Santos <thiago.sousa.santos@collabora.com>"); } static void -gst_test_camera_src_init (GstTestCameraSrc * self, - GstTestCameraSrcClass * g_class) +gst_test_camera_src_init (GstTestCameraSrc * self) { - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (parent_class); GstPadTemplate *template; /* create pads */ @@ -153,9 +167,9 @@ gst_test_camera_src_init (GstTestCameraSrc * self, gst_element_add_pad (GST_ELEMENT_CAST (self), self->vidpad); /* add get caps functions */ - gst_pad_set_getcaps_function (self->vfpad, gst_test_camera_src_get_caps); - gst_pad_set_getcaps_function (self->vidpad, gst_test_camera_src_get_caps); - gst_pad_set_getcaps_function (self->imgpad, gst_test_camera_src_get_caps); + gst_pad_set_query_function (self->vfpad, gst_test_camera_src_query); + gst_pad_set_query_function (self->vidpad, gst_test_camera_src_query); + gst_pad_set_query_function (self->imgpad, gst_test_camera_src_query); } /* end of custom test camera src element */ @@ -315,9 +329,11 @@ check_preview_image (GstElement * camera, const gchar * filename, gint index) fail_unless (strcmp (preview_filename, prev_filename) == 0); } if (preview_caps) { - fail_unless (GST_BUFFER_CAPS (preview_buffer) != NULL); - fail_unless (gst_caps_can_intersect (GST_BUFFER_CAPS (preview_buffer), - preview_caps)); + /* TODO porting + fail_unless (GST_BUFFER_CAPS (preview_buffer) != NULL); + fail_unless (gst_caps_can_intersect (GST_BUFFER_CAPS (preview_buffer), + preview_caps)); + */ } g_free (prev_filename); } @@ -526,7 +542,7 @@ check_file_validity (const gchar * filename, gint num, GstTagList * taglist, if (width != 0 && height != 0) { g_signal_emit_by_name (playbin, "get-video-pad", 0, &pad, NULL); g_assert (pad != NULL); - caps = gst_pad_get_negotiated_caps (pad); + caps = gst_pad_get_current_caps (pad); g_assert (gst_structure_get_int (gst_caps_get_structure (caps, 0), "width", &caps_width)); @@ -569,14 +585,14 @@ check_file_validity (const gchar * filename, gint num, GstTagList * taglist, return TRUE; } -static gboolean -filter_buffer_count (GstPad * pad, GstMiniObject * obj, gpointer data) +static GstPadProbeReturn +filter_buffer_count (GstPad * pad, GstPadProbeInfo * info, gpointer data) { gint *counter = data; (*counter)++; - return TRUE; + return GST_PAD_PROBE_OK; } static GstMessage * @@ -982,7 +998,7 @@ GST_START_TEST (test_image_capture_with_tags) if (!camera) return; - taglists[0] = gst_tag_list_new_full (GST_TAG_COMMENT, "test1", + taglists[0] = gst_tag_list_new (GST_TAG_COMMENT, "test1", GST_TAG_GEO_LOCATION_LATITUDE, 36.6, GST_TAG_GEO_LOCATION_LONGITUDE, -12.5, GST_TAG_COPYRIGHT, "My copyright notice", @@ -991,7 +1007,7 @@ GST_START_TEST (test_image_capture_with_tags) GST_TAG_DESCRIPTION, "some description", GST_TAG_APPLICATION_NAME, "camerabin2 test", GST_TAG_GEO_LOCATION_ELEVATION, 300.85, NULL); - taglists[1] = gst_tag_list_new_full (GST_TAG_COMMENT, "test2", + taglists[1] = gst_tag_list_new (GST_TAG_COMMENT, "test2", GST_TAG_GEO_LOCATION_LATITUDE, 1.6, GST_TAG_GEO_LOCATION_LONGITUDE, 0.0, GST_TAG_COPYRIGHT, "some cp", @@ -1000,7 +1016,7 @@ GST_START_TEST (test_image_capture_with_tags) GST_TAG_DESCRIPTION, "desc", GST_TAG_APPLICATION_NAME, "another cam test", GST_TAG_GEO_LOCATION_ELEVATION, 10.0, NULL); - taglists[2] = gst_tag_list_new_full (GST_TAG_COMMENT, "test3", + taglists[2] = gst_tag_list_new (GST_TAG_COMMENT, "test3", GST_TAG_GEO_LOCATION_LATITUDE, 1.3, GST_TAG_GEO_LOCATION_LONGITUDE, -5.0, GST_TAG_COPYRIGHT, "CC", @@ -1054,9 +1070,9 @@ GST_START_TEST (test_video_capture_with_tags) if (!camera) return; - taglists[0] = gst_tag_list_new_full (GST_TAG_COMMENT, "test1", NULL); - taglists[1] = gst_tag_list_new_full (GST_TAG_COMMENT, "test2", NULL); - taglists[2] = gst_tag_list_new_full (GST_TAG_COMMENT, "test3", NULL); + taglists[0] = gst_tag_list_new (GST_TAG_COMMENT, "test1", NULL); + taglists[1] = gst_tag_list_new (GST_TAG_COMMENT, "test2", NULL); + taglists[2] = gst_tag_list_new (GST_TAG_COMMENT, "test3", NULL); /* set video mode */ g_object_set (camera, "mode", 2, "location", video_filename, NULL); @@ -1072,7 +1088,7 @@ GST_START_TEST (test_video_capture_with_tags) profile = gst_encoding_container_profile_new ("qt", "jpeg+qt", caps, NULL); gst_caps_unref (caps); - caps = gst_caps_new_simple ("image/jpeg", NULL); + caps = gst_caps_new_simple ("image/jpeg", NULL, NULL); if (!gst_encoding_container_profile_add_profile (profile, (GstEncodingProfile *) gst_encoding_video_profile_new (caps, NULL, NULL, 1))) { @@ -1241,18 +1257,18 @@ GST_START_TEST (test_image_custom_filter) preview_filter = gst_element_factory_make ("identity", "preview-filter"); pad = gst_element_get_static_pad (vf_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &vf_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &vf_probe_counter, NULL); gst_object_unref (pad); pad = gst_element_get_static_pad (image_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &image_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &image_probe_counter, NULL); gst_object_unref (pad); pad = gst_element_get_static_pad (preview_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &preview_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &preview_probe_counter, NULL); gst_object_unref (pad); /* set still image mode and filters */ @@ -1314,23 +1330,23 @@ GST_START_TEST (test_video_custom_filter) audio_filter = gst_element_factory_make ("identity", "audio-filter"); pad = gst_element_get_static_pad (vf_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &vf_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &vf_probe_counter, NULL); gst_object_unref (pad); pad = gst_element_get_static_pad (video_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &video_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &video_probe_counter, NULL); gst_object_unref (pad); pad = gst_element_get_static_pad (audio_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &audio_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &audio_probe_counter, NULL); gst_object_unref (pad); pad = gst_element_get_static_pad (preview_filter, "src"); - gst_pad_add_buffer_probe (pad, (GCallback) filter_buffer_count, - &preview_probe_counter); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, filter_buffer_count, + &preview_probe_counter, NULL); gst_object_unref (pad); /* set still image mode and filters */ diff --git a/tests/check/elements/legacyresample.c b/tests/check/elements/legacyresample.c index 26c572a62..055313b2e 100644 --- a/tests/check/elements/legacyresample.c +++ b/tests/check/elements/legacyresample.c @@ -71,8 +71,9 @@ setup_legacyresample (int channels, int inrate, int outrate) GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS, "could not set to paused"); - mysrcpad = gst_check_setup_src_pad (legacyresample, &srctemplate, caps); - gst_pad_set_caps (mysrcpad, caps); + mysrcpad = gst_check_setup_src_pad (legacyresample, &srctemplate); + gst_pad_set_active (mysrcpad, TRUE); + fail_unless (gst_pad_set_caps (mysrcpad, caps)); gst_caps_unref (caps); caps = gst_caps_from_string (RESAMPLE_CAPS_TEMPLATE_STRING); @@ -81,16 +82,14 @@ setup_legacyresample (int channels, int inrate, int outrate) "rate", G_TYPE_INT, outrate, NULL); fail_unless (gst_caps_is_fixed (caps)); - mysinkpad = gst_check_setup_sink_pad (legacyresample, &sinktemplate, caps); + mysinkpad = gst_check_setup_sink_pad (legacyresample, &sinktemplate); + gst_pad_set_active (mysinkpad, TRUE); /* this installs a getcaps func that will always return the caps we set * later */ - gst_pad_set_caps (mysinkpad, caps); + fail_unless (gst_pad_set_caps (mysinkpad, caps)); gst_pad_use_fixed_caps (mysinkpad); gst_caps_unref (caps); - gst_pad_set_active (mysinkpad, TRUE); - gst_pad_set_active (mysrcpad, TRUE); - return legacyresample; } diff --git a/tests/check/elements/mplex.c b/tests/check/elements/mplex.c index 356de173f..d9e21809a 100644 --- a/tests/check/elements/mplex.c +++ b/tests/check/elements/mplex.c @@ -182,7 +182,7 @@ setup_mplex (void) GST_DEBUG ("setup_mplex"); mplex = gst_check_setup_element ("mplex"); - mysrcpad = setup_src_pad (mplex, &srctemplate, NULL, "audio_%d"); + mysrcpad = setup_src_pad (mplex, &srctemplate, NULL, "audio_%u"); mysinkpad = gst_check_setup_sink_pad (mplex, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); @@ -205,7 +205,7 @@ cleanup_mplex (GstElement * mplex) gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); - teardown_src_pad (mplex, "audio_%d"); + teardown_src_pad (mplex, "audio_%u"); gst_check_teardown_sink_pad (mplex); gst_check_teardown_element (mplex); diff --git a/tests/check/elements/parser.c b/tests/check/elements/parser.c index 392f3ce57..70b05b035 100644 --- a/tests/check/elements/parser.c +++ b/tests/check/elements/parser.c @@ -55,16 +55,19 @@ buffer_new (const unsigned char *buffer_data, guint size) buffer = gst_buffer_new_and_alloc (size); if (buffer_data) { - memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); + gst_buffer_fill (buffer, 0, buffer_data, size); } else { guint i; + guint8 *data; + /* Create a recognizable pattern (loop 0x00 -> 0xff) in the data block */ + data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE); for (i = 0; i < size; i++) { - GST_BUFFER_DATA (buffer)[i] = i % 0x100; + data[i] = i % 0x100; } + gst_buffer_unmap (buffer, data, size); } - gst_buffer_set_caps (buffer, GST_PAD_CAPS (srcpad)); GST_BUFFER_OFFSET (buffer) = dataoffset; dataoffset += size; return buffer; @@ -77,7 +80,7 @@ static void buffer_count_size (void *buffer, void *user_data) { guint *sum = (guint *) user_data; - *sum += GST_BUFFER_SIZE (buffer); + *sum += gst_buffer_get_size (buffer); } /* @@ -99,7 +102,7 @@ buffer_verify_data (void *buffer, void *user_data) if (ctx_verify_buffer) ctx_verify_buffer (vdata, buffer); vdata->buffer_counter++; - vdata->offset_counter += GST_BUFFER_SIZE (buffer); + vdata->offset_counter += gst_buffer_get_size (buffer); if (vdata->buffer_counter == vdata->discard) { vdata->buffer_counter = 0; vdata->discard = 0; @@ -108,8 +111,8 @@ buffer_verify_data (void *buffer, void *user_data) } if (!ctx_verify_buffer || !ctx_verify_buffer (vdata, buffer)) { - fail_unless (GST_BUFFER_SIZE (buffer) == vdata->data_to_verify_size); - fail_unless (memcmp (GST_BUFFER_DATA (buffer), vdata->data_to_verify, + fail_unless (gst_buffer_get_size (buffer) == vdata->data_to_verify_size); + fail_unless (gst_buffer_memcmp (buffer, 0, vdata->data_to_verify, vdata->data_to_verify_size) == 0); } @@ -125,14 +128,8 @@ buffer_verify_data (void *buffer, void *user_data) fail_unless (GST_BUFFER_OFFSET (buffer) == vdata->offset_counter); } - if (vdata->caps) { - GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", - GST_BUFFER_CAPS (buffer), vdata->caps); - fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), vdata->caps)); - } - vdata->ts_counter += GST_BUFFER_DURATION (buffer); - vdata->offset_counter += GST_BUFFER_SIZE (buffer); + vdata->offset_counter += gst_buffer_get_size (buffer); vdata->buffer_counter++; } @@ -150,10 +147,14 @@ setup_element (const gchar * factory, ElementSetup setup, } else { element = gst_check_setup_element (factory); } - srcpad = gst_check_setup_src_pad (element, src_template, src_caps); - sinkpad = gst_check_setup_sink_pad (element, sink_template, sink_caps); + srcpad = gst_check_setup_src_pad (element, src_template); + sinkpad = gst_check_setup_sink_pad (element, sink_template); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); + if (src_caps) + fail_unless (gst_pad_set_caps (srcpad, src_caps)); + if (sink_caps) + fail_unless (gst_pad_set_caps (sinkpad, sink_caps)); bus = gst_bus_new (); gst_element_set_bus (element, bus); @@ -246,14 +247,8 @@ gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps) if (!k) buffer = buffer_new (test->series[j].data, test->series[j].size); else { - GstCaps *caps = gst_buffer_get_caps (buffer); - buffer = gst_buffer_join (buffer, buffer_new (test->series[j].data, test->series[j].size)); - if (caps) { - gst_buffer_set_caps (buffer, caps); - gst_caps_unref (caps); - } } } fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); @@ -292,7 +287,7 @@ gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps) fail_unless_equals_int (datasum, size); } - src_caps = gst_pad_get_negotiated_caps (sinkpad); + src_caps = gst_pad_get_current_caps (sinkpad); GST_LOG ("output caps: %" GST_PTR_FORMAT, src_caps); if (test->sink_caps) { diff --git a/tests/check/elements/vp8dec.c b/tests/check/elements/vp8dec.c index 30b010d14..4d7da4487 100644 --- a/tests/check/elements/vp8dec.c +++ b/tests/check/elements/vp8dec.c @@ -76,10 +76,11 @@ setup_vp8dec (const gchar * src_caps_str) gst_element_add_pad (bin, ghostpad); gst_object_unref (targetpad); - srcpad = gst_check_setup_src_pad (bin, &srctemplate, srccaps); - sinkpad = gst_check_setup_sink_pad (bin, &sinktemplate, NULL); + srcpad = gst_check_setup_src_pad (bin, &srctemplate); + sinkpad = gst_check_setup_sink_pad (bin, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); + fail_unless (gst_pad_set_caps (srcpad, srccaps)); bus = gst_bus_new (); gst_element_set_bus (bin, bus); diff --git a/tests/check/elements/vp8enc.c b/tests/check/elements/vp8enc.c index 1008c9ba5..d9c1df69f 100644 --- a/tests/check/elements/vp8enc.c +++ b/tests/check/elements/vp8enc.c @@ -51,10 +51,11 @@ setup_vp8enc (const gchar * src_caps_str) vp8enc = gst_check_setup_element ("vp8enc"); fail_unless (vp8enc != NULL); - srcpad = gst_check_setup_src_pad (vp8enc, &srctemplate, srccaps); - sinkpad = gst_check_setup_sink_pad (vp8enc, &sinktemplate, NULL); + srcpad = gst_check_setup_src_pad (vp8enc, &srctemplate); + sinkpad = gst_check_setup_sink_pad (vp8enc, &sinktemplate); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); + fail_unless (gst_pad_set_caps (srcpad, srccaps)); bus = gst_bus_new (); gst_element_set_bus (vp8enc, bus); diff --git a/tests/check/pipelines/colorspace.c b/tests/check/pipelines/colorspace.c index 3704e86e3..1acb4ab67 100644 --- a/tests/check/pipelines/colorspace.c +++ b/tests/check/pipelines/colorspace.c @@ -199,17 +199,16 @@ colorspace_compare (gint width, gint height, gboolean comp) for (j = 0; j < gst_caps_get_size (caps); j++) { GstCaps *in_caps, *out_caps; GstStructure *s; - guint32 fourcc; + const gchar *fourcc; in_caps = gst_caps_copy_nth (caps, i); out_caps = gst_caps_copy_nth (caps, j); /* FIXME remove if videotestsrc and video format handle these properly */ s = gst_caps_get_structure (in_caps, 0); - if (gst_structure_get_fourcc (s, "format", &fourcc)) { - if (fourcc == GST_MAKE_FOURCC ('Y', 'U', 'V', '9') || - fourcc == GST_MAKE_FOURCC ('Y', 'V', 'U', '9') || - fourcc == GST_MAKE_FOURCC ('v', '2', '1', '6')) { + if ((fourcc = gst_structure_get_string (s, "format"))) { + if (!strcmp (fourcc, "YUV9") || + !strcmp (fourcc, "YVU9") || !strcmp (fourcc, "v216")) { gst_caps_unref (in_caps); gst_caps_unref (out_caps); continue; diff --git a/tests/examples/camerabin/Makefile.am b/tests/examples/camerabin/Makefile.am index 9d74d91d7..aa9f23f7b 100644 --- a/tests/examples/camerabin/Makefile.am +++ b/tests/examples/camerabin/Makefile.am @@ -15,6 +15,7 @@ gst_camera_LDADD = \ $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstvideo-@GST_MAJORMINOR@ \ $(GST_LIBS) \ $(GTK_LIBS) \ $(GMODULE_EXPORT_LIBS) @@ -40,6 +41,7 @@ gst_camerabin_test_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUG gst_camerabin_test_LDADD = \ $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la \ -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstvideo-@GST_MAJORMINOR@ \ $(GST_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ $(X11_LIBS) diff --git a/tests/examples/camerabin/gst-camera-perf.c b/tests/examples/camerabin/gst-camera-perf.c index c5554a0e3..1b1c9d868 100644 --- a/tests/examples/camerabin/gst-camera-perf.c +++ b/tests/examples/camerabin/gst-camera-perf.c @@ -171,15 +171,15 @@ static const gchar *test_names[TEST_CASES] = { static void print_result (void); static gboolean run_test (gpointer user_data); static gboolean setup_add_pad_probe (GstElement * elem, const gchar * pad_name, - GCallback handler, gpointer data); + GstPadProbeCallback handler, gpointer data); /* * Callbacks */ -static gboolean -pad_has_buffer (GstPad * pad, GstBuffer * buf, gpointer user_data) +static GstPadProbeReturn +pad_has_buffer (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) { gboolean *signal_sink = (gboolean *) user_data; gboolean print_and_restart = FALSE; @@ -209,7 +209,7 @@ pad_has_buffer (GstPad * pad, GstBuffer * buf, gpointer user_data) print_result (); g_idle_add ((GSourceFunc) run_test, NULL); } - return TRUE; + return GST_PAD_PROBE_OK; } static void @@ -227,8 +227,7 @@ element_added (GstBin * bin, GstElement * element, gpointer user_data) if (elem) { need_vmux_pad_probe = FALSE; GST_INFO_OBJECT (elem, "got default video muxer"); - if (setup_add_pad_probe (elem, "src", (GCallback) pad_has_buffer, - &signal_vid_sink)) { + if (setup_add_pad_probe (elem, "src", pad_has_buffer, &signal_vid_sink)) { /* enable test */ target[8] = test_09_taget; } @@ -239,8 +238,7 @@ element_added (GstBin * bin, GstElement * element, gpointer user_data) if (elem) { need_ienc_pad_probe = FALSE; GST_INFO_OBJECT (elem, "got default image encoder"); - if (setup_add_pad_probe (elem, "src", (GCallback) pad_has_buffer, - &signal_img_enc)) { + if (setup_add_pad_probe (elem, "src", pad_has_buffer, &signal_img_enc)) { /* enable test */ target[5] = test_06_taget; } @@ -480,7 +478,7 @@ cleanup_pipeline (void) static gboolean setup_add_pad_probe (GstElement * elem, const gchar * pad_name, - GCallback handler, gpointer data) + GstPadProbeCallback handler, gpointer data) { GstPad *pad = NULL; @@ -489,7 +487,8 @@ setup_add_pad_probe (GstElement * elem, const gchar * pad_name, return FALSE; } - gst_pad_add_buffer_probe (pad, (GCallback) handler, data); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER, + handler, data, NULL); gst_object_unref (pad); return TRUE; @@ -567,13 +566,12 @@ setup_pipeline (void) /* set properties */ g_object_set (camera_bin, "filename", filename->str, NULL); - if (src_csp && strlen (src_csp) == 4) { + if (src_csp) { GstCaps *filter_caps; /* FIXME: why do we need to set this? */ - filter_caps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, - GST_MAKE_FOURCC (src_csp[0], src_csp[1], src_csp[2], src_csp[3]), NULL); + filter_caps = gst_caps_new_simple ("video/x-raw", + "format", G_TYPE_STRING, src_csp, NULL); if (filter_caps) { g_object_set (camera_bin, "filter-caps", filter_caps, NULL); gst_caps_unref (filter_caps); @@ -589,8 +587,7 @@ setup_pipeline (void) /* connect signal handlers */ g_assert (sink); - if (!setup_add_pad_probe (sink, "sink", (GCallback) pad_has_buffer, - &signal_vf_sink)) { + if (!setup_add_pad_probe (sink, "sink", pad_has_buffer, &signal_vf_sink)) { goto error; } if (!vmux) { @@ -603,8 +600,7 @@ setup_pipeline (void) } } if (vmux) { - if (!setup_add_pad_probe (vmux, "src", (GCallback) pad_has_buffer, - &signal_vid_sink)) { + if (!setup_add_pad_probe (vmux, "src", pad_has_buffer, &signal_vid_sink)) { goto error; } } @@ -618,8 +614,7 @@ setup_pipeline (void) } } if (ienc) { - if (!setup_add_pad_probe (ienc, "src", (GCallback) pad_has_buffer, - &signal_img_enc)) { + if (!setup_add_pad_probe (ienc, "src", pad_has_buffer, &signal_img_enc)) { goto error; } } diff --git a/tests/examples/camerabin/gst-camera.c b/tests/examples/camerabin/gst-camera.c index 80a31217a..e5e48e68f 100644 --- a/tests/examples/camerabin/gst-camera.c +++ b/tests/examples/camerabin/gst-camera.c @@ -32,8 +32,8 @@ #include "gst-camera.h" #include <gst/gst.h> -#include <gst/interfaces/xoverlay.h> -#include <gst/interfaces/colorbalance.h> +#include <gst/video/videooverlay.h> +#include <gst/video/colorbalance.h> #include <gst/interfaces/photography.h> #include <gtk/gtk.h> #include <gdk/gdkx.h> @@ -219,8 +219,7 @@ handle_element_message (GstMessage * msg) const GValue *image; GstBuffer *buf = NULL; guint8 *data = NULL; - gchar *caps_string; - guint size = 0; + gsize size = 0; gchar *filename = NULL; FILE *f = NULL; size_t written; @@ -232,8 +231,6 @@ handle_element_message (GstMessage * msg) image = gst_structure_get_value (st, "buffer"); if (image) { buf = gst_value_get_buffer (image); - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); if (g_str_equal (gst_structure_get_name (st), "raw-image")) { filename = g_strdup_printf ("test_%04u.raw", num_pics); } else if (g_str_equal (gst_structure_get_name (st), "preview-image")) { @@ -243,13 +240,12 @@ handle_element_message (GstMessage * msg) g_print ("unknown buffer received\n"); return; } - caps_string = gst_caps_to_string (GST_BUFFER_CAPS (buf)); - g_print ("writing buffer to %s, buffer caps: %s\n", - filename, caps_string); - g_free (caps_string); + g_print ("writing buffer to %s\n", filename); f = g_fopen (filename, "w"); if (f) { + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); written = fwrite (data, size, 1, f); + gst_buffer_unmap (buf, data, size); if (!written) { g_print ("errro writing file\n"); } @@ -270,11 +266,11 @@ my_bus_sync_callback (GstBus * bus, GstMessage * message, gpointer data) if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) return GST_BUS_PASS; - if (!gst_structure_has_name (message->structure, "prepare-xwindow-id")) + if (!gst_message_has_name (message, "prepare-xwindow-id")) return GST_BUS_PASS; /* FIXME: make sure to get XID in main thread */ - gst_x_overlay_set_window_handle (GST_X_OVERLAY (message->src), + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (message->src), #if GTK_CHECK_VERSION (2, 91, 6) GDK_WINDOW_XID (gtk_widget_get_window (ui_drawing))); #else @@ -465,7 +461,7 @@ me_gst_setup_pipeline_create_post_bin (const gchar * post, gboolean video) } caps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); + "format", G_TYPE_STRING, "I420", NULL); g_object_set (G_OBJECT (filter), "caps", caps, NULL); gst_caps_unref (caps); @@ -1110,7 +1106,7 @@ create_menu_items_from_structure (GstStructure * structure) GString *item_str = NULL; guint j, num_items_created = 0, num_framerates = 1; gint w = 0, h = 0, n = 0, d = 1; - guint32 fourcc = 0; + const gchar *format = NULL; g_return_val_if_fail (structure != NULL, 0); @@ -1120,8 +1116,8 @@ create_menu_items_from_structure (GstStructure * structure) if (0 == strcmp (structure_name, "video/x-raw-yuv")) { item_str = g_string_new_len ("", 128); - if (gst_structure_has_field_typed (structure, "format", GST_TYPE_FOURCC)) { - gst_structure_get_fourcc (structure, "format", &fourcc); + if (gst_structure_has_field_typed (structure, "format", G_TYPE_STRING)) { + format = gst_structure_get_string (structure, "format"); } if (gst_structure_has_field_typed (structure, "width", GST_TYPE_INT_RANGE)) { @@ -1170,15 +1166,14 @@ create_menu_items_from_structure (GstStructure * structure) d = gst_value_get_fraction_denominator (item); } g_string_assign (item_str, structure_name); - g_string_append_printf (item_str, " (%" GST_FOURCC_FORMAT ")", - GST_FOURCC_ARGS (fourcc)); + g_string_append_printf (item_str, " (%s)", format); g_string_append_printf (item_str, ", %dx%d at %d/%d", w, h, n, d); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, item_str->str, -1); video_caps = - gst_caps_new_simple (structure_name, "format", GST_TYPE_FOURCC, - fourcc, + gst_caps_new_simple (structure_name, "format", G_TYPE_STRING, + format, "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, "framerate", GST_TYPE_FRACTION, n, d, NULL); video_caps_list = g_list_append (video_caps_list, video_caps); diff --git a/tests/examples/camerabin/gst-camerabin-test.c b/tests/examples/camerabin/gst-camerabin-test.c index 27037fad3..e877de1e9 100644 --- a/tests/examples/camerabin/gst-camerabin-test.c +++ b/tests/examples/camerabin/gst-camerabin-test.c @@ -89,7 +89,7 @@ #define GST_USE_UNSTABLE_API 1 #include <gst/gst.h> -#include <gst/interfaces/xoverlay.h> +#include <gst/video/videooverlay.h> #include <gst/interfaces/photography.h> #include <string.h> #include <sys/time.h> @@ -240,8 +240,7 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) const GValue *image; GstBuffer *buf = NULL; guint8 *data_buf = NULL; - gchar *caps_string; - guint size = 0; + gsize size = 0; gchar *preview_filename = NULL; FILE *f = NULL; size_t written; @@ -250,10 +249,10 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) case GST_MESSAGE_ELEMENT:{ st = gst_message_get_structure (message); if (st) { - if (gst_structure_has_name (message->structure, "prepare-xwindow-id")) { + if (gst_structure_has_name (st, "prepare-xwindow-id")) { if (!no_xwindow && window) { - gst_x_overlay_set_window_handle (GST_X_OVERLAY (GST_MESSAGE_SRC - (message)), window); + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY + (GST_MESSAGE_SRC (message)), window); gst_message_unref (message); message = NULL; return GST_BUS_DROP; @@ -266,13 +265,10 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) image = gst_structure_get_value (st, "buffer"); if (image) { buf = gst_value_get_buffer (image); - data_buf = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); + data_buf = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); preview_filename = g_strdup_printf ("test_vga.rgb"); - caps_string = gst_caps_to_string (GST_BUFFER_CAPS (buf)); - g_print ("writing buffer to %s, elapsed: %.2fs, buffer caps: %s\n", - preview_filename, g_timer_elapsed (timer, NULL), caps_string); - g_free (caps_string); + g_print ("writing buffer to %s, elapsed: %.2fs\n", + preview_filename, g_timer_elapsed (timer, NULL)); f = g_fopen (preview_filename, "w"); if (f) { written = fwrite (data_buf, size, 1, f); @@ -284,6 +280,7 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) g_print ("error opening file for raw image writing\n"); } g_free (preview_filename); + gst_buffer_unmap (buf, data_buf, size); } } } @@ -526,12 +523,11 @@ setup_pipeline (void) /* set properties */ if (src_format) { filter_caps = gst_caps_from_string (src_format); - } else if (src_csp && strlen (src_csp) == 4) { + } else if (src_csp) { /* Set requested colorspace format, this is needed if the default colorspace negotiated for viewfinder doesn't match with e.g. encoders. */ - filter_caps = gst_caps_new_simple ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, - GST_MAKE_FOURCC (src_csp[0], src_csp[1], src_csp[2], src_csp[3]), NULL); + filter_caps = gst_caps_new_simple ("video/x-raw", + "format", G_TYPE_STRING, src_csp, NULL); } if (filter_caps) { @@ -646,8 +642,7 @@ run_pipeline (gpointer user_data) g_object_get (camera_bin, "video-source", &video_source, NULL); if (video_source) { - if (GST_IS_ELEMENT (video_source) && - gst_element_implements_interface (video_source, GST_TYPE_PHOTOGRAPHY)) { + if (GST_IS_ELEMENT (video_source) && GST_IS_PHOTOGRAPHY (video_source)) { /* Set GstPhotography interface options. If option not given as command-line parameter use default of the source element. */ if (scene_mode != SCENE_MODE_NONE) diff --git a/tests/examples/camerabin2/Makefile.am b/tests/examples/camerabin2/Makefile.am index 6b38bd278..807a22924 100644 --- a/tests/examples/camerabin2/Makefile.am +++ b/tests/examples/camerabin2/Makefile.am @@ -15,6 +15,7 @@ gst_camera2_LDADD = \ $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-@GST_MAJORMINOR@.la \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstvideo-@GST_MAJORMINOR@ \ $(GST_LIBS) \ $(GTK_LIBS) \ $(GMODULE_EXPORT_LIBS) diff --git a/tests/examples/camerabin2/gst-camera2.c b/tests/examples/camerabin2/gst-camera2.c index bd612e701..c8cc8dc84 100644 --- a/tests/examples/camerabin2/gst-camera2.c +++ b/tests/examples/camerabin2/gst-camera2.c @@ -32,7 +32,7 @@ #include "gst-camera2.h" #include <gst/gst.h> -#include <gst/interfaces/xoverlay.h> +#include <gst/video/videooverlay.h> #include <gtk/gtk.h> #include <gdk/gdkx.h> #include <gdk/gdkkeysyms.h> @@ -92,12 +92,12 @@ bus_sync_callback (GstBus * bus, GstMessage * message, gpointer data) if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) return GST_BUS_PASS; - if (!gst_structure_has_name (message->structure, "prepare-xwindow-id")) + if (!gst_message_has_name (message, "prepare-xwindow-id")) return GST_BUS_PASS; /* FIXME: make sure to get XID in main thread */ ui_drawing = GTK_WIDGET (gtk_builder_get_object (builder, "viewfinderArea")); - gst_x_overlay_set_window_handle (GST_X_OVERLAY (message->src), + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (message->src), #if GTK_CHECK_VERSION (2, 91, 6) GDK_WINDOW_XID (gtk_widget_get_window (ui_drawing))); #else diff --git a/tests/examples/camerabin2/gst-camerabin2-test.c b/tests/examples/camerabin2/gst-camerabin2-test.c index f112dbcb3..952dadfb2 100644 --- a/tests/examples/camerabin2/gst-camerabin2-test.c +++ b/tests/examples/camerabin2/gst-camerabin2-test.c @@ -105,7 +105,7 @@ #define GST_USE_UNSTABLE_API 1 #include <gst/gst.h> -#include <gst/interfaces/xoverlay.h> +#include <gst/video/videooverlay.h> #include <gst/interfaces/photography.h> #include <string.h> #include <sys/time.h> @@ -311,8 +311,8 @@ create_host_window (void) } } -static gboolean -camera_src_get_timestamp_probe (GstPad * pad, GstMiniObject * obj, +static GstPadProbeReturn +camera_src_get_timestamp_probe (GstPad * pad, GstPadProbeInfo * info, gpointer udata) { CaptureTiming *timing; @@ -320,13 +320,11 @@ camera_src_get_timestamp_probe (GstPad * pad, GstMiniObject * obj, timing = (CaptureTiming *) g_list_first (capture_times)->data; timing->camera_capture = gst_util_get_timestamp (); - gst_pad_remove_data_probe (pad, camera_probe_id); - - return TRUE; + return GST_PAD_PROBE_REMOVE; } -static gboolean -viewfinder_get_timestamp_probe (GstPad * pad, GstMiniObject * obj, +static GstPadProbeReturn +viewfinder_get_timestamp_probe (GstPad * pad, GstPadProbeInfo * info, gpointer udata) { CaptureTiming *timing; @@ -334,9 +332,7 @@ viewfinder_get_timestamp_probe (GstPad * pad, GstMiniObject * obj, timing = (CaptureTiming *) g_list_first (capture_times)->data; timing->precapture = gst_util_get_timestamp (); - gst_pad_remove_data_probe (pad, viewfinder_probe_id); - - return TRUE; + return GST_PAD_PROBE_REMOVE; } static GstBusSyncReply @@ -346,8 +342,7 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) const GValue *image; GstBuffer *buf = NULL; guint8 *data_buf = NULL; - gchar *caps_string; - guint size = 0; + gsize size = 0; gchar *preview_filename = NULL; FILE *f = NULL; size_t written; @@ -356,10 +351,10 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) case GST_MESSAGE_ELEMENT:{ st = gst_message_get_structure (message); if (st) { - if (gst_structure_has_name (message->structure, "prepare-xwindow-id")) { + if (gst_message_has_name (message, "prepare-xwindow-id")) { if (!no_xwindow && window) { - gst_x_overlay_set_window_handle (GST_X_OVERLAY (GST_MESSAGE_SRC - (message)), window); + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY + (GST_MESSAGE_SRC (message)), window); gst_message_unref (message); message = NULL; return GST_BUS_DROP; @@ -376,8 +371,9 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) /* set up probe to check when the viewfinder gets data */ GstPad *pad = gst_element_get_static_pad (viewfinder_sink, "sink"); - viewfinder_probe_id = gst_pad_add_buffer_probe (pad, - (GCallback) viewfinder_get_timestamp_probe, NULL); + viewfinder_probe_id = + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + viewfinder_get_timestamp_probe, NULL, NULL); gst_object_unref (pad); } @@ -386,14 +382,12 @@ sync_bus_callback (GstBus * bus, GstMessage * message, gpointer data) image = gst_structure_get_value (st, "buffer"); if (image) { buf = gst_value_get_buffer (image); - data_buf = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); preview_filename = g_strdup_printf ("test_vga.rgb"); - caps_string = gst_caps_to_string (GST_BUFFER_CAPS (buf)); - g_free (caps_string); f = g_fopen (preview_filename, "w"); if (f) { + data_buf = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); written = fwrite (data_buf, size, 1, f); + gst_buffer_unmap (buf, data_buf, size); if (!written) { g_print ("error writing file\n"); } @@ -915,8 +909,7 @@ run_pipeline (gpointer user_data) g_object_get (camerabin, "camera-source", &video_source, NULL); if (video_source) { - if (GST_IS_ELEMENT (video_source) && - gst_element_implements_interface (video_source, GST_TYPE_PHOTOGRAPHY)) { + if (GST_IS_ELEMENT (video_source) && GST_IS_PHOTOGRAPHY (video_source)) { /* Set GstPhotography interface options. If option not given as command-line parameter use default of the source element. */ if (scene_mode != SCENE_MODE_NONE) @@ -953,8 +946,8 @@ run_pipeline (gpointer user_data) GstPad *pad; pad = gst_element_get_static_pad (video_source, "imgsrc"); - camera_probe_id = gst_pad_add_buffer_probe (pad, - (GCallback) camera_src_get_timestamp_probe, NULL); + camera_probe_id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + camera_src_get_timestamp_probe, NULL, NULL); gst_object_unref (pad); } diff --git a/tests/examples/mxf/mxfdemux-structure.c b/tests/examples/mxf/mxfdemux-structure.c index 6f735c4da..03ab7b920 100644 --- a/tests/examples/mxf/mxfdemux-structure.c +++ b/tests/examples/mxf/mxfdemux-structure.c @@ -30,8 +30,14 @@ static gchar * g_value_to_string (const GValue * val) { if (G_VALUE_TYPE (val) == GST_TYPE_BUFFER) { - const GstBuffer *buf = gst_value_get_buffer (val); - gchar *ret = g_base64_encode (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + GstBuffer *buf = gst_value_get_buffer (val); + gpointer data; + gsize size; + gchar *ret; + + data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + ret = g_base64_encode (data, size); + gst_buffer_unmap (buf, data, size); return ret; } else { diff --git a/tests/examples/opencv/gst_element_print_properties.c b/tests/examples/opencv/gst_element_print_properties.c index 4192fe84e..e91188b52 100644 --- a/tests/examples/opencv/gst_element_print_properties.c +++ b/tests/examples/opencv/gst_element_print_properties.c @@ -403,8 +403,8 @@ gst_element_print_properties (GstElement * element) pfraction->def_num, pfraction->def_den); } - else if (GST_IS_PARAM_SPEC_MINI_OBJECT (param)) { - g_print ("%-*.*s | MiniObject of type \"%s\"", + else if (G_IS_PARAM_SPEC_BOXED (param)) { + g_print ("%-*.*s | Boxed of type \"%s\"", c3w, c3w, g_type_name (param->value_type), g_type_name (param->value_type)); } diff --git a/tests/examples/opencv/gstmotioncells_dynamic_test.c b/tests/examples/opencv/gstmotioncells_dynamic_test.c index 83834065b..56e359f9c 100644 --- a/tests/examples/opencv/gstmotioncells_dynamic_test.c +++ b/tests/examples/opencv/gstmotioncells_dynamic_test.c @@ -26,7 +26,6 @@ #include <stdlib.h> #include <stdio.h> #include <locale.h> -#include <gst/interfaces/propertyprobe.h> #include "gstmotioncells_dynamic_test.h" #include "gst_element_print_properties.h" diff --git a/tests/examples/scaletempo/demo-player.c b/tests/examples/scaletempo/demo-player.c index 0adf0e1f0..8ff0fc521 100644 --- a/tests/examples/scaletempo/demo-player.c +++ b/tests/examples/scaletempo/demo-player.c @@ -68,19 +68,19 @@ no_pipeline (DemoPlayer * player) return FALSE; } -static gboolean -demo_player_event_listener (GstElement * host, GstEvent * event, gpointer data) +static GstPadProbeReturn +demo_player_event_listener (GstPad * pad, GstPadProbeInfo * info, gpointer data) { + GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info); DemoPlayer *player = DEMO_PLAYER (data); DemoPlayerPrivate *priv = DEMO_PLAYER_GET_PRIVATE (player); - if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { - gdouble rate, applied_rate; + if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) { + const GstSegment *segment; gdouble new_rate; - gst_event_parse_new_segment_full (event, NULL, &rate, &applied_rate, NULL, - NULL, NULL, NULL); - new_rate = rate * applied_rate; + gst_event_parse_segment (event, &segment); + new_rate = segment->rate * segment->applied_rate; if (priv->rate != new_rate) { priv->rate = new_rate; g_signal_emit (player, demo_player_signals[SIGNAL_RATE_CHANGE], 0, @@ -88,7 +88,7 @@ demo_player_event_listener (GstElement * host, GstEvent * event, gpointer data) } } - return TRUE; + return GST_PAD_PROBE_OK; } static void @@ -174,8 +174,9 @@ demo_player_build_pipeline (DemoPlayer * player) LINK_ELEMENTS (format, resample); LINK_ELEMENTS (resample, asink); - gst_pad_add_event_probe (gst_element_get_static_pad (asink, "sink"), - G_CALLBACK (demo_player_event_listener), player); + gst_pad_add_probe (gst_element_get_static_pad (asink, "sink"), + GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, + demo_player_event_listener, player, NULL); ghostpad = gst_element_get_static_pad (filter, "sink"); gst_element_add_pad (audioline, gst_ghost_pad_new ("sink", ghostpad)); @@ -196,8 +197,9 @@ demo_player_build_pipeline (DemoPlayer * player) priv->scaletempo_line = audioline; MAKE_ELEMENT (NULL, priv->scalerate_line, audiosink_name, "scaling_audio_sink"); - gst_pad_add_event_probe (gst_element_get_static_pad (priv->scalerate_line, - "sink"), G_CALLBACK (demo_player_event_listener), player); + gst_pad_add_probe (gst_element_get_static_pad (priv->scalerate_line, + "sink"), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, + demo_player_event_listener, player, NULL); g_object_ref (priv->scaletempo_line); g_object_ref (priv->scalerate_line); } @@ -221,9 +223,8 @@ _set_rate (DemoPlayer * player, gdouble new_rate, gint second) priv = DEMO_PLAYER_GET_PRIVATE (player); if (second < 0) { - GstFormat fmt = GST_FORMAT_TIME; seek_type = GST_SEEK_TYPE_SET; - if (!gst_element_query_position (priv->pipeline, &fmt, &pos)) { + if (!gst_element_query_position (priv->pipeline, GST_FORMAT_TIME, &pos)) { // This should be the default but too many upstream elements seek anyway pos = GST_CLOCK_TIME_NONE; seek_type = GST_SEEK_TYPE_NONE; @@ -461,12 +462,12 @@ demo_player_get_position_func (DemoPlayer * player) { DemoPlayerPrivate *priv = DEMO_PLAYER_GET_PRIVATE (player); gint64 pos; - GstFormat fmt = GST_FORMAT_TIME; if (!priv->pipeline) return -1; - if (!gst_element_query_position (priv->pipeline, &fmt, &pos) || pos < 0) { + if (!gst_element_query_position (priv->pipeline, GST_FORMAT_TIME, &pos) + || pos < 0) { return -1; } @@ -478,12 +479,12 @@ demo_player_get_duration_func (DemoPlayer * player) { DemoPlayerPrivate *priv = DEMO_PLAYER_GET_PRIVATE (player); gint64 dur; - GstFormat fmt = GST_FORMAT_TIME; if (!priv->pipeline) return -1; - if (!gst_element_query_duration (priv->pipeline, &fmt, &dur) || dur < 0) { + if (!gst_element_query_duration (priv->pipeline, GST_FORMAT_TIME, &dur) + || dur < 0) { return -1; } diff --git a/tests/icles/pitch-test.c b/tests/icles/pitch-test.c index 152bde35b..2936dd0d3 100644 --- a/tests/icles/pitch-test.c +++ b/tests/icles/pitch-test.c @@ -25,7 +25,6 @@ #include <string.h> #include <unistd.h> #include <gst/gst.h> -#include <gst/controller/gstcontroller.h> int main (int argc, char **argv) @@ -49,7 +48,6 @@ main (int argc, char **argv) /* initialize GStreamer */ gst_init (&argc, &argv); - gst_controller_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); @@ -76,8 +74,7 @@ main (int argc, char **argv) } csource = gst_interpolation_control_source_new (); - gst_interpolation_control_source_set_interpolation_mode (csource, - GST_INTERPOLATE_LINEAR); + g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); gst_controller_set_control_source (ctl, "pitch", GST_CONTROL_SOURCE (csource)); @@ -91,7 +88,8 @@ main (int argc, char **argv) else g_value_set_float (&val, 1.5); - gst_interpolation_control_source_set (csource, i * GST_SECOND, &val); + gst_timed_value_control_source_set ((GstTimedValueControlSource *) csource, + i * GST_SECOND, &val); } g_value_unset (&val); diff --git a/tools/element-templates/element b/tools/element-templates/element index ed025ee2b..001f48762 100644 --- a/tools/element-templates/element +++ b/tools/element-templates/element @@ -97,7 +97,7 @@ static gboolean gst_replace_set_clock (GstElement * element, GstClock * clock) { - return TRUE; + return GST_ELEMENT_CLASS (parent_class)->set_clock (element, clock); } static GstIndex * diff --git a/tools/element-templates/sinkpad b/tools/element-templates/sinkpad index ec8a98060..6d3bad1fb 100644 --- a/tools/element-templates/sinkpad +++ b/tools/element-templates/sinkpad @@ -30,8 +30,8 @@ GST_STATIC_PAD_TEMPLATE ("sink", ); % base-init - gst_element_class_add_static_pad_template (element_class, - &gst_replace_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_replace_sink_template)); % instance-init replace->sinkpad = gst_pad_new_from_static_template (&gst_replace_sink_template diff --git a/tools/element-templates/sinkpad-simple b/tools/element-templates/sinkpad-simple index 822079bee..e8538b6ec 100644 --- a/tools/element-templates/sinkpad-simple +++ b/tools/element-templates/sinkpad-simple @@ -12,8 +12,8 @@ GST_STATIC_PAD_TEMPLATE ("sink", ); % base-init - gst_element_class_add_static_pad_template (element_class, - &gst_replace_sink_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_replace_sink_template)); % instance-init replace->sinkpad = gst_pad_new_from_static_template (&gst_replace_sink_template diff --git a/tools/element-templates/srcpad b/tools/element-templates/srcpad index 9c4f32052..d1f799267 100644 --- a/tools/element-templates/srcpad +++ b/tools/element-templates/srcpad @@ -28,8 +28,8 @@ GST_STATIC_PAD_TEMPLATE ("src", ); % base-init - gst_element_class_add_static_pad_template (element_class, - &gst_replace_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_replace_src_template)); % instance-init replace->srcpad = gst_pad_new_from_static_template (&gst_replace_src_template diff --git a/tools/element-templates/srcpad-simple b/tools/element-templates/srcpad-simple index efb3190c6..0fca9157e 100644 --- a/tools/element-templates/srcpad-simple +++ b/tools/element-templates/srcpad-simple @@ -12,8 +12,8 @@ GST_STATIC_PAD_TEMPLATE ("src", ); % base-init - gst_element_class_add_static_pad_template (element_class, - &gst_replace_src_template); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_replace_src_template)); % instance-init replace->srcpad = gst_pad_new_from_static_template (&gst_replace_src_template diff --git a/win32/common/config.h b/win32/common/config.h index 16f0ed287..dd84f004b 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -6,7 +6,7 @@ #undef ENABLE_NLS /* gettext package name */ -#define GETTEXT_PACKAGE "gst-plugins-bad-0.10" +#define GETTEXT_PACKAGE "gst-plugins-bad-0.11" /* PREFIX - specifically added for Windows for easier moving */ #define PREFIX "C:\\gstreamer" @@ -199,7 +199,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.22.1" +#define VERSION "0.11.0.1" /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ |