2002-10-10 21:19:12 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should 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.
|
|
|
|
*/
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
/**
|
|
|
|
* SECTION:element-smpte
|
|
|
|
*
|
|
|
|
* smpte can accept I420 video streams with the same width, height and
|
|
|
|
* framerate. The two incomming buffers are blended together using an effect
|
|
|
|
* specific alpha mask.
|
2009-01-28 10:29:42 +00:00
|
|
|
*
|
|
|
|
* The #GstSmpte:depth property defines the presision in bits of the mask. A
|
|
|
|
* higher presision will create a mask with smoother gradients in order to avoid
|
2006-12-07 17:30:03 +00:00
|
|
|
* banding.
|
2009-01-28 10:29:42 +00:00
|
|
|
*
|
|
|
|
* <refsect2>
|
2006-12-07 17:30:03 +00:00
|
|
|
* <title>Sample pipelines</title>
|
2009-01-28 10:29:42 +00:00
|
|
|
* |[
|
|
|
|
* gst-launch -v videotestsrc pattern=1 ! smpte name=s border=20000 type=234 duration=2000000000 ! ffmpegcolorspace ! ximagesink videotestsrc ! s.
|
|
|
|
* ]| A pipeline to demonstrate the smpte transition.
|
|
|
|
* It shows a pinwheel transition a from a snow videotestsrc to an smpte
|
2006-12-07 17:30:03 +00:00
|
|
|
* pattern videotestsrc. The transition will take 2 seconds to complete. The
|
|
|
|
* edges of the transition are smoothed with a 20000 big border.
|
|
|
|
* </refsect2>
|
|
|
|
*/
|
|
|
|
|
2003-06-29 19:46:12 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
2002-10-10 21:19:12 +00:00
|
|
|
#include <string.h>
|
2004-07-27 21:51:32 +00:00
|
|
|
#include "gstsmpte.h"
|
2003-07-06 20:49:52 +00:00
|
|
|
#include <gst/video/video.h>
|
2002-10-10 21:19:12 +00:00
|
|
|
#include "paint.h"
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (gst_smpte_debug);
|
|
|
|
#define GST_CAT_DEFAULT gst_smpte_debug
|
|
|
|
|
2003-12-22 01:47:09 +00:00
|
|
|
static GstStaticPadTemplate gst_smpte_src_template =
|
2004-03-14 22:34:33 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("src",
|
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")
|
|
|
|
)
|
|
|
|
);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2003-12-22 01:47:09 +00:00
|
|
|
static GstStaticPadTemplate gst_smpte_sink1_template =
|
2004-03-14 22:34:33 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("sink1",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")
|
|
|
|
)
|
|
|
|
);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2003-12-22 01:47:09 +00:00
|
|
|
static GstStaticPadTemplate gst_smpte_sink2_template =
|
2004-03-14 22:34:33 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("sink2",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")
|
|
|
|
)
|
|
|
|
);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* SMPTE signals and args */
|
2004-03-14 22:34:33 +00:00
|
|
|
enum
|
|
|
|
{
|
2002-10-10 21:19:12 +00:00
|
|
|
/* FILL ME */
|
|
|
|
LAST_SIGNAL
|
|
|
|
};
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
#define DEFAULT_PROP_TYPE 1
|
|
|
|
#define DEFAULT_PROP_BORDER 0
|
|
|
|
#define DEFAULT_PROP_DEPTH 16
|
|
|
|
#define DEFAULT_PROP_FPS 0.
|
|
|
|
#define DEFAULT_PROP_DURATION GST_SECOND
|
2010-04-15 20:28:58 +00:00
|
|
|
#define DEFAULT_PROP_INVERT FALSE
|
2006-12-07 17:30:03 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
enum
|
|
|
|
{
|
2006-12-07 17:30:03 +00:00
|
|
|
PROP_0,
|
|
|
|
PROP_TYPE,
|
|
|
|
PROP_BORDER,
|
|
|
|
PROP_DEPTH,
|
|
|
|
PROP_FPS,
|
|
|
|
PROP_DURATION,
|
2010-04-15 20:28:58 +00:00
|
|
|
PROP_INVERT,
|
2006-12-07 17:30:03 +00:00
|
|
|
PROP_LAST,
|
2002-10-10 21:19:12 +00:00
|
|
|
};
|
|
|
|
|
2007-01-19 10:35:13 +00:00
|
|
|
#define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width))
|
|
|
|
#define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2)
|
|
|
|
#define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2)
|
|
|
|
|
|
|
|
#define I420_Y_OFFSET(w,h) (0)
|
|
|
|
#define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h)))
|
|
|
|
#define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2))
|
|
|
|
|
|
|
|
#define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2))
|
|
|
|
|
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
#define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_transition_type_get_type())
|
|
|
|
static GType
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_transition_type_get_type (void)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
static GType smpte_transition_type = 0;
|
|
|
|
GEnumValue *smpte_transitions;
|
|
|
|
|
|
|
|
if (!smpte_transition_type) {
|
|
|
|
const GList *definitions;
|
2004-03-14 22:34:33 +00:00
|
|
|
gint i = 0;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
definitions = gst_mask_get_definitions ();
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte_transitions =
|
2004-03-15 19:32:27 +00:00
|
|
|
g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
while (definitions) {
|
|
|
|
GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
definitions = g_list_next (definitions);
|
|
|
|
|
|
|
|
smpte_transitions[i].value = definition->type;
|
2007-02-06 16:29:30 +00:00
|
|
|
/* older GLib versions have the two fields as non-const, hence the cast */
|
|
|
|
smpte_transitions[i].value_nick = (gchar *) definition->short_name;
|
|
|
|
smpte_transitions[i].value_name = (gchar *) definition->long_name;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte_transition_type =
|
2004-03-15 19:32:27 +00:00
|
|
|
g_enum_register_static ("GstSMPTETransitionType", smpte_transitions);
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
return smpte_transition_type;
|
2004-03-14 22:34:33 +00:00
|
|
|
}
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
static void gst_smpte_class_init (GstSMPTEClass * klass);
|
|
|
|
static void gst_smpte_base_init (GstSMPTEClass * klass);
|
|
|
|
static void gst_smpte_init (GstSMPTE * smpte);
|
Fix a bunch of leaks shown by the newly-added states test.
Original commit message from CVS:
* ext/flac/gstflacenc.c: (gst_flac_enc_finalize):
* ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_class_init),
(gst_gconf_audio_sink_dispose), (gst_gconf_audio_sink_finalize):
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init),
(gst_gconf_audio_src_class_init), (gst_gconf_audio_src_dispose),
(gst_gconf_audio_src_finalize), (do_toggle_element):
* ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init),
(gst_gconf_video_sink_class_init), (gst_gconf_video_sink_finalize),
(do_toggle_element):
* ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init),
(gst_gconf_video_src_class_init), (gst_gconf_video_src_dispose),
(gst_gconf_video_src_finalize), (do_toggle_element):
* ext/gconf/gstswitchsink.c: (gst_switch_sink_class_init),
(gst_switch_sink_reset), (gst_switch_sink_set_child):
* ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init):
* ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init):
* ext/shout2/gstshout2.c: (gst_shout2send_class_init),
(gst_shout2send_init), (gst_shout2send_finalize):
* gst/debug/testplugin.c: (gst_test_class_init),
(gst_test_finalize):
* gst/flx/gstflxdec.c: (gst_flxdec_class_init),
(gst_flxdec_dispose):
* gst/multipart/multipartmux.c: (gst_multipart_mux_finalize):
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize):
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init),
(gst_rtspsrc_finalize):
* gst/rtsp/rtspextwms.c: (rtsp_ext_wms_free_context):
* gst/rtsp/rtspextwms.h:
* gst/smpte/gstsmpte.c: (gst_smpte_class_init),
(gst_smpte_finalize):
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_finalize):
* gst/udp/gstudpsink.c: (gst_udpsink_class_init),
(gst_udpsink_finalize):
* gst/wavparse/gstwavparse.c: (gst_wavparse_dispose),
(gst_wavparse_sink_activate):
* sys/oss/gstosssink.c: (gst_oss_sink_finalise):
* sys/oss/gstosssrc.c: (gst_oss_src_class_init),
(gst_oss_src_finalize):
* sys/v4l2/gstv4l2object.c: (gst_v4l2_object_destroy):
* sys/v4l2/gstv4l2object.h:
* sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init),
(gst_v4l2src_finalize):
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get):
Fix a bunch of leaks shown by the newly-added states test.
2007-03-04 13:52:03 +00:00
|
|
|
static void gst_smpte_finalize (GstSMPTE * smpte);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2011-12-14 19:13:21 +00:00
|
|
|
static GstFlowReturn gst_smpte_collected (GstCollectPads2 * pads,
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
GstSMPTE * smpte);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
static void gst_smpte_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec);
|
|
|
|
static void gst_smpte_get_property (GObject * object, guint prop_id,
|
|
|
|
GValue * value, GParamSpec * pspec);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
static GstStateChangeReturn gst_smpte_change_state (GstElement * element,
|
|
|
|
GstStateChange transition);
|
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
static GstElementClass *parent_class = NULL;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
/*static guint gst_smpte_signals[LAST_SIGNAL] = { 0 }; */
|
|
|
|
|
|
|
|
static GType
|
|
|
|
gst_smpte_get_type (void)
|
|
|
|
{
|
|
|
|
static GType smpte_type = 0;
|
|
|
|
|
|
|
|
if (!smpte_type) {
|
|
|
|
static const GTypeInfo smpte_info = {
|
2004-03-14 22:34:33 +00:00
|
|
|
sizeof (GstSMPTEClass),
|
|
|
|
(GBaseInitFunc) gst_smpte_base_init,
|
2002-10-10 21:19:12 +00:00
|
|
|
NULL,
|
2004-03-14 22:34:33 +00:00
|
|
|
(GClassInitFunc) gst_smpte_class_init,
|
2002-10-10 21:19:12 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
2004-03-14 22:34:33 +00:00
|
|
|
sizeof (GstSMPTE),
|
2002-10-10 21:19:12 +00:00
|
|
|
0,
|
2004-03-14 22:34:33 +00:00
|
|
|
(GInstanceInitFunc) gst_smpte_init,
|
2002-10-10 21:19:12 +00:00
|
|
|
};
|
2004-03-15 19:32:27 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte_type =
|
2004-03-15 19:32:27 +00:00
|
|
|
g_type_register_static (GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0);
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
return smpte_type;
|
|
|
|
}
|
|
|
|
|
2003-11-02 22:26:51 +00:00
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_base_init (GstSMPTEClass * klass)
|
2003-11-02 22:26:51 +00:00
|
|
|
{
|
|
|
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
|
|
|
|
2011-11-28 12:58:44 +00:00
|
|
|
gst_element_class_add_static_pad_template (element_class,
|
|
|
|
&gst_smpte_sink1_template);
|
|
|
|
gst_element_class_add_static_pad_template (element_class,
|
|
|
|
&gst_smpte_sink2_template);
|
|
|
|
gst_element_class_add_static_pad_template (element_class,
|
|
|
|
&gst_smpte_src_template);
|
2010-03-18 13:31:35 +00:00
|
|
|
gst_element_class_set_details_simple (element_class, "SMPTE transitions",
|
|
|
|
"Filter/Editor/Video",
|
|
|
|
"Apply the standard SMPTE transitions on video images",
|
|
|
|
"Wim Taymans <wim.taymans@chello.be>");
|
2003-11-02 22:26:51 +00:00
|
|
|
}
|
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_class_init (GstSMPTEClass * klass)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
GObjectClass *gobject_class;
|
|
|
|
GstElementClass *gstelement_class;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gstelement_class = (GstElementClass *) klass;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2006-04-08 21:21:45 +00:00
|
|
|
parent_class = g_type_class_peek_parent (klass);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
gobject_class->set_property = gst_smpte_set_property;
|
|
|
|
gobject_class->get_property = gst_smpte_get_property;
|
Fix a bunch of leaks shown by the newly-added states test.
Original commit message from CVS:
* ext/flac/gstflacenc.c: (gst_flac_enc_finalize):
* ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_class_init),
(gst_gconf_audio_sink_dispose), (gst_gconf_audio_sink_finalize):
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init),
(gst_gconf_audio_src_class_init), (gst_gconf_audio_src_dispose),
(gst_gconf_audio_src_finalize), (do_toggle_element):
* ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init),
(gst_gconf_video_sink_class_init), (gst_gconf_video_sink_finalize),
(do_toggle_element):
* ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init),
(gst_gconf_video_src_class_init), (gst_gconf_video_src_dispose),
(gst_gconf_video_src_finalize), (do_toggle_element):
* ext/gconf/gstswitchsink.c: (gst_switch_sink_class_init),
(gst_switch_sink_reset), (gst_switch_sink_set_child):
* ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init):
* ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init):
* ext/shout2/gstshout2.c: (gst_shout2send_class_init),
(gst_shout2send_init), (gst_shout2send_finalize):
* gst/debug/testplugin.c: (gst_test_class_init),
(gst_test_finalize):
* gst/flx/gstflxdec.c: (gst_flxdec_class_init),
(gst_flxdec_dispose):
* gst/multipart/multipartmux.c: (gst_multipart_mux_finalize):
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize):
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init),
(gst_rtspsrc_finalize):
* gst/rtsp/rtspextwms.c: (rtsp_ext_wms_free_context):
* gst/rtsp/rtspextwms.h:
* gst/smpte/gstsmpte.c: (gst_smpte_class_init),
(gst_smpte_finalize):
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_finalize):
* gst/udp/gstudpsink.c: (gst_udpsink_class_init),
(gst_udpsink_finalize):
* gst/wavparse/gstwavparse.c: (gst_wavparse_dispose),
(gst_wavparse_sink_activate):
* sys/oss/gstosssink.c: (gst_oss_sink_finalise):
* sys/oss/gstosssrc.c: (gst_oss_src_class_init),
(gst_oss_src_finalize):
* sys/v4l2/gstv4l2object.c: (gst_v4l2_object_destroy):
* sys/v4l2/gstv4l2object.h:
* sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init),
(gst_v4l2src_finalize):
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get):
Fix a bunch of leaks shown by the newly-added states test.
2007-03-04 13:52:03 +00:00
|
|
|
gobject_class->finalize = (GObjectFinalizeFunc) gst_smpte_finalize;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
_gst_mask_init ();
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TYPE,
|
2004-03-14 22:34:33 +00:00
|
|
|
g_param_spec_enum ("type", "Type", "The type of transition to use",
|
2006-12-07 17:30:03 +00:00
|
|
|
GST_TYPE_SMPTE_TRANSITION_TYPE, DEFAULT_PROP_TYPE,
|
2010-10-13 14:21:23 +00:00
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2006-12-07 17:30:03 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FPS,
|
|
|
|
g_param_spec_float ("fps", "FPS",
|
|
|
|
"Frames per second if no input files are given (deprecated)", 0.,
|
2010-10-13 14:21:23 +00:00
|
|
|
G_MAXFLOAT, DEFAULT_PROP_FPS,
|
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2006-12-07 17:30:03 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER,
|
2004-03-14 22:34:33 +00:00
|
|
|
g_param_spec_int ("border", "Border",
|
2006-12-07 17:30:03 +00:00
|
|
|
"The border width of the transition", 0, G_MAXINT,
|
2010-10-13 14:21:23 +00:00
|
|
|
DEFAULT_PROP_BORDER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2006-12-07 17:30:03 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEPTH,
|
2004-03-14 22:34:33 +00:00
|
|
|
g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24,
|
2010-10-13 14:21:23 +00:00
|
|
|
DEFAULT_PROP_DEPTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2006-12-07 17:30:03 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DURATION,
|
|
|
|
g_param_spec_uint64 ("duration", "Duration",
|
|
|
|
"Duration of the transition effect in nanoseconds", 0, G_MAXUINT64,
|
2010-10-13 14:21:23 +00:00
|
|
|
DEFAULT_PROP_DURATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2010-04-15 20:28:58 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERT,
|
|
|
|
g_param_spec_boolean ("invert", "Invert",
|
2010-10-13 14:21:23 +00:00
|
|
|
"Invert transition mask", DEFAULT_PROP_INVERT,
|
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2006-12-07 17:30:03 +00:00
|
|
|
|
|
|
|
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_smpte_change_state);
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
|
2007-01-19 13:06:07 +00:00
|
|
|
/* wht yel cya grn mag red blu blk -I Q */
|
|
|
|
static const int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 };
|
|
|
|
static const int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 };
|
|
|
|
static const int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 };
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
fill_i420 (guint8 * data, gint width, gint height, gint color)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
2007-01-19 10:35:13 +00:00
|
|
|
gint size = I420_Y_ROWSTRIDE (width) * GST_ROUND_UP_2 (height);
|
|
|
|
gint size4 = size >> 2;
|
2002-10-10 21:19:12 +00:00
|
|
|
guint8 *yp = data;
|
2007-01-19 10:35:13 +00:00
|
|
|
guint8 *up = data + I420_U_OFFSET (width, height);
|
|
|
|
guint8 *vp = data + I420_V_OFFSET (width, height);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2002-10-13 18:46:10 +00:00
|
|
|
memset (yp, y_colors[color], size);
|
|
|
|
memset (up, u_colors[color], size4);
|
|
|
|
memset (vp, v_colors[color], size4);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2010-04-15 20:28:58 +00:00
|
|
|
gst_smpte_update_mask (GstSMPTE * smpte, gint type, gboolean invert,
|
|
|
|
gint depth, gint width, gint height)
|
2002-10-13 18:46:10 +00:00
|
|
|
{
|
|
|
|
GstMask *newmask;
|
|
|
|
|
2007-01-23 17:27:39 +00:00
|
|
|
if (smpte->mask) {
|
|
|
|
if (smpte->type == type &&
|
2010-04-15 20:28:58 +00:00
|
|
|
smpte->invert == invert &&
|
2007-01-23 17:27:39 +00:00
|
|
|
smpte->depth == depth &&
|
|
|
|
smpte->width == width && smpte->height == height)
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2010-04-15 20:28:58 +00:00
|
|
|
newmask = gst_mask_factory_new (type, invert, depth, width, height);
|
2002-10-13 18:46:10 +00:00
|
|
|
if (newmask) {
|
|
|
|
if (smpte->mask) {
|
|
|
|
gst_mask_destroy (smpte->mask);
|
|
|
|
}
|
|
|
|
smpte->mask = newmask;
|
|
|
|
smpte->type = type;
|
2010-04-15 20:28:58 +00:00
|
|
|
smpte->invert = invert;
|
2002-10-13 18:46:10 +00:00
|
|
|
smpte->depth = depth;
|
|
|
|
smpte->width = width;
|
|
|
|
smpte->height = height;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
gst_smpte_setcaps (GstPad * pad, GstCaps * caps)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
GstSMPTE *smpte;
|
2003-12-22 01:47:09 +00:00
|
|
|
GstStructure *structure;
|
|
|
|
gboolean ret;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
smpte = GST_SMPTE (GST_PAD_PARENT (pad));
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2003-12-22 01:47:09 +00:00
|
|
|
structure = gst_caps_get_structure (caps, 0);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2003-12-22 01:47:09 +00:00
|
|
|
ret = gst_structure_get_int (structure, "width", &smpte->width);
|
|
|
|
ret &= gst_structure_get_int (structure, "height", &smpte->height);
|
2006-12-07 17:30:03 +00:00
|
|
|
ret &= gst_structure_get_fraction (structure, "framerate",
|
|
|
|
&smpte->fps_num, &smpte->fps_denom);
|
2004-03-14 22:34:33 +00:00
|
|
|
if (!ret)
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
return FALSE;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
/* for backward compat, we store these here */
|
|
|
|
smpte->fps = ((gdouble) smpte->fps_num) / smpte->fps_denom;
|
|
|
|
|
|
|
|
/* figure out the duration in frames */
|
|
|
|
smpte->end_position = gst_util_uint64_scale (smpte->duration,
|
|
|
|
smpte->fps_num, GST_SECOND * smpte->fps_denom);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (smpte, "duration: %d frames", smpte->end_position);
|
|
|
|
|
2010-04-15 20:28:58 +00:00
|
|
|
ret =
|
|
|
|
gst_smpte_update_mask (smpte, smpte->type, smpte->invert, smpte->depth,
|
|
|
|
smpte->width, smpte->height);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
return ret;
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
static void
|
|
|
|
gst_smpte_init (GstSMPTE * smpte)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte->sinkpad1 =
|
2006-03-15 16:17:12 +00:00
|
|
|
gst_pad_new_from_static_template (&gst_smpte_sink1_template, "sink1");
|
2007-01-18 18:37:39 +00:00
|
|
|
gst_pad_set_setcaps_function (smpte->sinkpad1,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_smpte_setcaps));
|
|
|
|
gst_pad_set_getcaps_function (smpte->sinkpad1,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
2002-10-10 21:19:12 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad1);
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte->sinkpad2 =
|
2006-03-15 16:17:12 +00:00
|
|
|
gst_pad_new_from_static_template (&gst_smpte_sink2_template, "sink2");
|
2007-01-18 18:37:39 +00:00
|
|
|
gst_pad_set_setcaps_function (smpte->sinkpad2,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_smpte_setcaps));
|
|
|
|
gst_pad_set_getcaps_function (smpte->sinkpad2,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
2002-10-10 21:19:12 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad2);
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte->srcpad =
|
2006-03-15 16:17:12 +00:00
|
|
|
gst_pad_new_from_static_template (&gst_smpte_src_template, "src");
|
2002-10-10 21:19:12 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (smpte), smpte->srcpad);
|
|
|
|
|
2011-12-14 19:13:21 +00:00
|
|
|
smpte->collect = gst_collect_pads2_new ();
|
|
|
|
gst_collect_pads2_set_function (smpte->collect,
|
|
|
|
(GstCollectPads2Function) GST_DEBUG_FUNCPTR (gst_smpte_collected), smpte);
|
|
|
|
gst_collect_pads2_start (smpte->collect);
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
|
2011-12-14 19:13:21 +00:00
|
|
|
gst_collect_pads2_add_pad (smpte->collect, smpte->sinkpad1,
|
|
|
|
sizeof (GstCollectData2));
|
|
|
|
gst_collect_pads2_add_pad (smpte->collect, smpte->sinkpad2,
|
|
|
|
sizeof (GstCollectData2));
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
smpte->fps = DEFAULT_PROP_FPS;
|
|
|
|
smpte->type = DEFAULT_PROP_TYPE;
|
|
|
|
smpte->border = DEFAULT_PROP_BORDER;
|
|
|
|
smpte->depth = DEFAULT_PROP_DEPTH;
|
|
|
|
smpte->duration = DEFAULT_PROP_DURATION;
|
2010-04-15 20:28:58 +00:00
|
|
|
smpte->invert = DEFAULT_PROP_INVERT;
|
2006-12-07 17:30:03 +00:00
|
|
|
smpte->fps_num = 0;
|
|
|
|
smpte->fps_denom = 1;
|
|
|
|
}
|
|
|
|
|
Fix a bunch of leaks shown by the newly-added states test.
Original commit message from CVS:
* ext/flac/gstflacenc.c: (gst_flac_enc_finalize):
* ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_class_init),
(gst_gconf_audio_sink_dispose), (gst_gconf_audio_sink_finalize):
* ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init),
(gst_gconf_audio_src_class_init), (gst_gconf_audio_src_dispose),
(gst_gconf_audio_src_finalize), (do_toggle_element):
* ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init),
(gst_gconf_video_sink_class_init), (gst_gconf_video_sink_finalize),
(do_toggle_element):
* ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init),
(gst_gconf_video_src_class_init), (gst_gconf_video_src_dispose),
(gst_gconf_video_src_finalize), (do_toggle_element):
* ext/gconf/gstswitchsink.c: (gst_switch_sink_class_init),
(gst_switch_sink_reset), (gst_switch_sink_set_child):
* ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init):
* ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init):
* ext/shout2/gstshout2.c: (gst_shout2send_class_init),
(gst_shout2send_init), (gst_shout2send_finalize):
* gst/debug/testplugin.c: (gst_test_class_init),
(gst_test_finalize):
* gst/flx/gstflxdec.c: (gst_flxdec_class_init),
(gst_flxdec_dispose):
* gst/multipart/multipartmux.c: (gst_multipart_mux_finalize):
* gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize):
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init),
(gst_rtspsrc_finalize):
* gst/rtsp/rtspextwms.c: (rtsp_ext_wms_free_context):
* gst/rtsp/rtspextwms.h:
* gst/smpte/gstsmpte.c: (gst_smpte_class_init),
(gst_smpte_finalize):
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_finalize):
* gst/udp/gstudpsink.c: (gst_udpsink_class_init),
(gst_udpsink_finalize):
* gst/wavparse/gstwavparse.c: (gst_wavparse_dispose),
(gst_wavparse_sink_activate):
* sys/oss/gstosssink.c: (gst_oss_sink_finalise):
* sys/oss/gstosssrc.c: (gst_oss_src_class_init),
(gst_oss_src_finalize):
* sys/v4l2/gstv4l2object.c: (gst_v4l2_object_destroy):
* sys/v4l2/gstv4l2object.h:
* sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init),
(gst_v4l2src_finalize):
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get):
Fix a bunch of leaks shown by the newly-added states test.
2007-03-04 13:52:03 +00:00
|
|
|
static void
|
|
|
|
gst_smpte_finalize (GstSMPTE * smpte)
|
|
|
|
{
|
|
|
|
if (smpte->collect) {
|
|
|
|
gst_object_unref (smpte->collect);
|
|
|
|
}
|
|
|
|
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize ((GObject *) smpte);
|
|
|
|
}
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
static void
|
|
|
|
gst_smpte_reset (GstSMPTE * smpte)
|
|
|
|
{
|
|
|
|
smpte->width = -1;
|
|
|
|
smpte->height = -1;
|
2002-10-10 21:19:12 +00:00
|
|
|
smpte->position = 0;
|
2006-12-07 17:30:03 +00:00
|
|
|
smpte->end_position = 0;
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_blend_i420 (guint8 * in1, guint8 * in2, guint8 * out, GstMask * mask,
|
|
|
|
gint width, gint height, gint border, gint pos)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
2002-10-13 18:46:10 +00:00
|
|
|
guint32 *maskp;
|
|
|
|
gint value;
|
2002-10-17 21:36:20 +00:00
|
|
|
gint i, j;
|
2002-10-13 18:46:10 +00:00
|
|
|
gint min, max;
|
2004-03-14 22:34:33 +00:00
|
|
|
guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv;
|
2002-10-13 18:46:10 +00:00
|
|
|
gint lumsize = width * height;
|
|
|
|
gint chromsize = lumsize >> 2;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
if (border == 0)
|
|
|
|
border++;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
min = pos - border;
|
2002-10-13 18:46:10 +00:00
|
|
|
max = pos;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
in1u = in1 + lumsize;
|
|
|
|
in1v = in1u + chromsize;
|
|
|
|
in2u = in2 + lumsize;
|
|
|
|
in2v = in2u + chromsize;
|
|
|
|
outu = out + lumsize;
|
|
|
|
outv = outu + chromsize;
|
|
|
|
|
2002-10-13 18:46:10 +00:00
|
|
|
maskp = mask->data;
|
|
|
|
|
2002-10-17 21:36:20 +00:00
|
|
|
for (i = 0; i < height; i++) {
|
|
|
|
for (j = 0; j < width; j++) {
|
|
|
|
value = *maskp++;
|
|
|
|
value = ((CLAMP (value, min, max) - min) << 8) / border;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2002-10-17 21:36:20 +00:00
|
|
|
*out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8;
|
|
|
|
if (!(i & 1) && !(j & 1)) {
|
2004-03-15 19:32:27 +00:00
|
|
|
*outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8;
|
|
|
|
*outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8;
|
2002-10-17 21:36:20 +00:00
|
|
|
}
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
static GstFlowReturn
|
2011-12-14 19:13:21 +00:00
|
|
|
gst_smpte_collected (GstCollectPads2 * pads, GstSMPTE * smpte)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
GstBuffer *outbuf;
|
|
|
|
GstClockTime ts;
|
|
|
|
GstBuffer *in1 = NULL, *in2 = NULL;
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
GSList *collected;
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2007-01-19 13:06:07 +00:00
|
|
|
if (G_UNLIKELY (smpte->fps_num == 0))
|
|
|
|
goto not_negotiated;
|
|
|
|
|
|
|
|
if (!GST_PAD_CAPS (smpte->sinkpad1) || !GST_PAD_CAPS (smpte->sinkpad2))
|
2006-12-07 17:30:03 +00:00
|
|
|
goto not_negotiated;
|
|
|
|
|
|
|
|
ts = gst_util_uint64_scale_int (smpte->position * GST_SECOND,
|
|
|
|
smpte->fps_denom, smpte->fps_num);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
for (collected = pads->data; collected; collected = g_slist_next (collected)) {
|
2011-12-14 19:13:21 +00:00
|
|
|
GstCollectData2 *data;
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
|
2011-12-14 19:13:21 +00:00
|
|
|
data = (GstCollectData2 *) collected->data;
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
|
|
|
|
if (data->pad == smpte->sinkpad1)
|
2011-12-14 19:13:21 +00:00
|
|
|
in1 = gst_collect_pads2_pop (pads, data);
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
else if (data->pad == smpte->sinkpad2)
|
2011-12-14 19:13:21 +00:00
|
|
|
in2 = gst_collect_pads2_pop (pads, data);
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
2003-02-25 21:34:10 +00:00
|
|
|
|
|
|
|
if (in1 == NULL) {
|
2006-12-07 17:30:03 +00:00
|
|
|
/* if no input, make picture black */
|
2007-01-19 10:35:13 +00:00
|
|
|
in1 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height));
|
2002-10-10 21:19:12 +00:00
|
|
|
fill_i420 (GST_BUFFER_DATA (in1), smpte->width, smpte->height, 7);
|
|
|
|
}
|
2003-02-25 21:34:10 +00:00
|
|
|
if (in2 == NULL) {
|
2006-12-07 17:30:03 +00:00
|
|
|
/* if no input, make picture white */
|
2007-01-19 10:35:13 +00:00
|
|
|
in2 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height));
|
2002-10-10 21:19:12 +00:00
|
|
|
fill_i420 (GST_BUFFER_DATA (in2), smpte->width, smpte->height, 0);
|
|
|
|
}
|
|
|
|
|
2007-01-19 13:06:07 +00:00
|
|
|
if (GST_BUFFER_SIZE (in1) != GST_BUFFER_SIZE (in2))
|
|
|
|
goto input_formats_do_not_match;
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
if (smpte->position < smpte->end_position) {
|
2007-01-19 10:35:13 +00:00
|
|
|
outbuf = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height));
|
2002-10-10 21:19:12 +00:00
|
|
|
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
/* set caps if not done yet */
|
2002-10-10 21:19:12 +00:00
|
|
|
if (!GST_PAD_CAPS (smpte->srcpad)) {
|
2003-12-22 01:47:09 +00:00
|
|
|
GstCaps *caps;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
|
|
|
caps =
|
2009-01-28 10:29:42 +00:00
|
|
|
gst_caps_copy (gst_static_caps_get
|
|
|
|
(&gst_smpte_src_template.static_caps));
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_caps_set_simple (caps, "width", G_TYPE_INT, smpte->width, "height",
|
2006-12-07 17:30:03 +00:00
|
|
|
G_TYPE_INT, smpte->height, "framerate", GST_TYPE_FRACTION,
|
|
|
|
smpte->fps_num, smpte->fps_denom, NULL);
|
2003-12-22 01:47:09 +00:00
|
|
|
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
gst_pad_set_caps (smpte->srcpad, caps);
|
2006-12-07 17:30:03 +00:00
|
|
|
|
|
|
|
gst_pad_push_event (smpte->srcpad,
|
|
|
|
gst_event_new_new_segment_full (FALSE,
|
|
|
|
1.0, 1.0, GST_FORMAT_TIME, 0, -1, 0));
|
|
|
|
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smpte->srcpad));
|
2002-10-10 21:19:12 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_blend_i420 (GST_BUFFER_DATA (in1),
|
2004-03-15 19:32:27 +00:00
|
|
|
GST_BUFFER_DATA (in2),
|
|
|
|
GST_BUFFER_DATA (outbuf),
|
|
|
|
smpte->mask, smpte->width, smpte->height,
|
|
|
|
smpte->border,
|
|
|
|
((1 << smpte->depth) + smpte->border) *
|
2006-12-07 17:30:03 +00:00
|
|
|
smpte->position / smpte->end_position);
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
} else {
|
2002-10-10 21:19:12 +00:00
|
|
|
outbuf = in2;
|
|
|
|
gst_buffer_ref (in2);
|
|
|
|
}
|
|
|
|
|
|
|
|
smpte->position++;
|
|
|
|
|
|
|
|
if (in1)
|
|
|
|
gst_buffer_unref (in1);
|
|
|
|
if (in2)
|
|
|
|
gst_buffer_unref (in2);
|
|
|
|
|
|
|
|
GST_BUFFER_TIMESTAMP (outbuf) = ts;
|
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it.
Original commit message from CVS:
* configure.ac:
* ext/aalib/Makefile.am:
* ext/aalib/gstaasink.c: (gst_aasink_get_type),
(gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps),
(gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render),
(gst_aasink_set_property), (gst_aasink_get_property),
(gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state):
* ext/aalib/gstaasink.h:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init),
(gst_smpte_collected):
* gst/smpte/gstsmpte.h:
Ported 2 more plugins. usgly hack in the Makefile.am though, I'm
sure someone will fix it.
2005-05-06 19:55:22 +00:00
|
|
|
|
|
|
|
return gst_pad_push (smpte->srcpad, outbuf);
|
2006-12-07 17:30:03 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
not_negotiated:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL),
|
|
|
|
("No input format negotiated"));
|
|
|
|
return GST_FLOW_NOT_NEGOTIATED;
|
|
|
|
}
|
2007-01-19 13:06:07 +00:00
|
|
|
input_formats_do_not_match:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL),
|
|
|
|
("input formats don't match: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT,
|
|
|
|
GST_PAD_CAPS (smpte->sinkpad1), GST_PAD_CAPS (smpte->sinkpad2)));
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
GstSMPTE *smpte;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte = GST_SMPTE (object);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
switch (prop_id) {
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_TYPE:
|
|
|
|
smpte->type = g_value_get_enum (value);
|
2002-10-13 18:46:10 +00:00
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_BORDER:
|
2002-10-13 18:46:10 +00:00
|
|
|
smpte->border = g_value_get_int (value);
|
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_FPS:
|
2003-07-06 20:49:52 +00:00
|
|
|
smpte->fps = g_value_get_float (value);
|
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_DEPTH:
|
|
|
|
smpte->depth = g_value_get_int (value);
|
|
|
|
break;
|
|
|
|
case PROP_DURATION:
|
|
|
|
smpte->duration = g_value_get_uint64 (value);
|
2002-10-10 21:19:12 +00:00
|
|
|
break;
|
2010-04-15 20:28:58 +00:00
|
|
|
case PROP_INVERT:
|
|
|
|
smpte->invert = g_value_get_boolean (value);
|
|
|
|
break;
|
2002-10-10 21:19:12 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:33 +00:00
|
|
|
gst_smpte_get_property (GObject * object, guint prop_id,
|
|
|
|
GValue * value, GParamSpec * pspec)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
|
|
|
GstSMPTE *smpte;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
smpte = GST_SMPTE (object);
|
2002-10-10 21:19:12 +00:00
|
|
|
|
|
|
|
switch (prop_id) {
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_TYPE:
|
|
|
|
g_value_set_enum (value, smpte->type);
|
2002-10-10 21:19:12 +00:00
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_FPS:
|
2003-07-06 20:49:52 +00:00
|
|
|
g_value_set_float (value, smpte->fps);
|
2002-10-13 18:46:10 +00:00
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_BORDER:
|
2002-10-13 18:46:10 +00:00
|
|
|
g_value_set_int (value, smpte->border);
|
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_DEPTH:
|
2002-10-13 18:46:10 +00:00
|
|
|
g_value_set_int (value, smpte->depth);
|
|
|
|
break;
|
2006-12-07 17:30:03 +00:00
|
|
|
case PROP_DURATION:
|
|
|
|
g_value_set_uint64 (value, smpte->duration);
|
|
|
|
break;
|
2010-04-15 20:28:58 +00:00
|
|
|
case PROP_INVERT:
|
|
|
|
g_value_set_boolean (value, smpte->invert);
|
|
|
|
break;
|
2002-10-10 21:19:12 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-07 17:30:03 +00:00
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_smpte_change_state (GstElement * element, GstStateChange transition)
|
|
|
|
{
|
|
|
|
GstStateChangeReturn ret;
|
|
|
|
GstSMPTE *smpte;
|
|
|
|
|
|
|
|
smpte = GST_SMPTE (element);
|
|
|
|
|
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
|
|
|
gst_smpte_reset (smpte);
|
|
|
|
GST_LOG_OBJECT (smpte, "starting collectpads");
|
2011-12-14 19:13:21 +00:00
|
|
|
gst_collect_pads2_start (smpte->collect);
|
2006-12-07 17:30:03 +00:00
|
|
|
break;
|
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
|
|
|
GST_LOG_OBJECT (smpte, "stopping collectpads");
|
2011-12-14 19:13:21 +00:00
|
|
|
gst_collect_pads2_stop (smpte->collect);
|
2006-12-07 17:30:03 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = parent_class->change_state (element, transition);
|
|
|
|
|
|
|
|
switch (transition) {
|
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
|
|
|
gst_smpte_reset (smpte);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
2002-10-10 21:19:12 +00:00
|
|
|
|
gst/smpte/: Add new plugin that adds the SMPTE transition in the alpha channel of
Original commit message from CVS:
* gst/smpte/Makefile.am:
* gst/smpte/gstsmpte.c: (gst_smpte_plugin_init):
* gst/smpte/gstsmpte.h:
* gst/smpte/gstsmptealpha.c:
(gst_smpte_alpha_transition_type_get_type),
(gst_smpte_alpha_get_type), (gst_smpte_alpha_base_init),
(gst_smpte_alpha_class_init), (gst_smpte_alpha_update_mask),
(gst_smpte_alpha_setcaps), (gst_smpte_alpha_get_unit_size),
(gst_smpte_alpha_init), (gst_smpte_alpha_finalize),
(gst_smpte_alpha_do_ayuv), (gst_smpte_alpha_do_i420),
(gst_smpte_alpha_transform), (gst_smpte_alpha_set_property),
(gst_smpte_alpha_get_property), (gst_smpte_alpha_plugin_init):
* gst/smpte/gstsmptealpha.h:
* gst/smpte/plugin.c: (plugin_init):
Add new plugin that adds the SMPTE transition in the alpha channel of
I420 and AYUV frames so that they can be blended with videomixer later
on. Uses all niceties such as using base transform for efficient alloc
and negotiation. It currently requires GstController to control the
position in the transition effect.
2008-05-20 09:29:28 +00:00
|
|
|
gboolean
|
|
|
|
gst_smpte_plugin_init (GstPlugin * plugin)
|
2002-10-10 21:19:12 +00:00
|
|
|
{
|
2006-12-07 17:30:03 +00:00
|
|
|
GST_DEBUG_CATEGORY_INIT (gst_smpte_debug, "smpte", 0,
|
|
|
|
"SMPTE transition effect");
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
return gst_element_register (plugin, "smpte", GST_RANK_NONE, GST_TYPE_SMPTE);
|
2002-10-10 21:19:12 +00:00
|
|
|
}
|