Integrating the GstVideoSink parent class
Original commit message from CVS: Integrating the GstVideoSink parent class
This commit is contained in:
parent
5919f1e35f
commit
cc8dee7f9d
@ -41,30 +41,9 @@ static GstElementDetails gst_sdlvideosink_details = {
|
|||||||
"(C) 2001",
|
"(C) 2001",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* sdlvideosink signals and args */
|
|
||||||
enum {
|
|
||||||
SIGNAL_FRAME_DISPLAYED,
|
|
||||||
SIGNAL_HAVE_SIZE,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
ARG_0,
|
|
||||||
ARG_WIDTH,
|
|
||||||
ARG_HEIGHT,
|
|
||||||
ARG_XID,
|
|
||||||
ARG_FRAMES_DISPLAYED,
|
|
||||||
ARG_FRAME_TIME,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void gst_sdlvideosink_class_init (GstSDLVideoSinkClass *klass);
|
static void gst_sdlvideosink_class_init (GstSDLVideoSinkClass *klass);
|
||||||
static void gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink);
|
static void gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink);
|
||||||
|
|
||||||
static void gst_sdlvideosink_set_clock (GstElement *element, GstClock *clock);
|
|
||||||
|
|
||||||
static gboolean gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink,
|
static gboolean gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink,
|
||||||
gboolean showlogo);
|
gboolean showlogo);
|
||||||
static GstPadLinkReturn gst_sdlvideosink_sinkconnect (GstPad *pad,
|
static GstPadLinkReturn gst_sdlvideosink_sinkconnect (GstPad *pad,
|
||||||
@ -87,8 +66,6 @@ static GstCaps *capslist = NULL;
|
|||||||
static GstPadTemplate *sink_template;
|
static GstPadTemplate *sink_template;
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
static guint gst_sdlvideosink_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
|
|
||||||
GType
|
GType
|
||||||
gst_sdlvideosink_get_type (void)
|
gst_sdlvideosink_get_type (void)
|
||||||
@ -97,17 +74,18 @@ gst_sdlvideosink_get_type (void)
|
|||||||
|
|
||||||
if (!sdlvideosink_type) {
|
if (!sdlvideosink_type) {
|
||||||
static const GTypeInfo sdlvideosink_info = {
|
static const GTypeInfo sdlvideosink_info = {
|
||||||
sizeof(GstSDLVideoSinkClass), NULL,
|
sizeof (GstSDLVideoSinkClass), NULL,
|
||||||
NULL,
|
NULL,
|
||||||
(GClassInitFunc)gst_sdlvideosink_class_init,
|
(GClassInitFunc) gst_sdlvideosink_class_init,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
sizeof(GstSDLVideoSink),
|
sizeof (GstSDLVideoSink),
|
||||||
0,
|
0,
|
||||||
(GInstanceInitFunc)gst_sdlvideosink_init,
|
(GInstanceInitFunc) gst_sdlvideosink_init,
|
||||||
};
|
};
|
||||||
sdlvideosink_type = g_type_register_static(GST_TYPE_ELEMENT,
|
sdlvideosink_type = g_type_register_static(GST_TYPE_VIDEOSINK,
|
||||||
"GstSDLVideoSink", &sdlvideosink_info, 0);
|
"GstSDLVideoSink",
|
||||||
|
&sdlvideosink_info, 0);
|
||||||
}
|
}
|
||||||
return sdlvideosink_type;
|
return sdlvideosink_type;
|
||||||
}
|
}
|
||||||
@ -118,70 +96,36 @@ gst_sdlvideosink_class_init (GstSDLVideoSinkClass *klass)
|
|||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
|
GstVideoSinkClass *gstvs_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass*)klass;
|
gobject_class = (GObjectClass*) klass;
|
||||||
gstelement_class = (GstElementClass*)klass;
|
gstelement_class = (GstElementClass*) klass;
|
||||||
|
gstvs_class = (GstVideoSinkClass*) klass;
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||||
|
|
||||||
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_WIDTH,
|
|
||||||
g_param_spec_int("width","Width","Width of the video window",
|
|
||||||
G_MININT,G_MAXINT,0,G_PARAM_READWRITE));
|
|
||||||
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HEIGHT,
|
|
||||||
g_param_spec_int("height","Height","Height of the video window",
|
|
||||||
G_MININT,G_MAXINT,0,G_PARAM_READWRITE));
|
|
||||||
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_XID,
|
|
||||||
g_param_spec_int ("xid", "Xid", "The Xid of the window",
|
|
||||||
G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAMES_DISPLAYED,
|
|
||||||
g_param_spec_int ("frames_displayed", "Frames Displayed", "The number of frames displayed so far",
|
|
||||||
G_MININT,G_MAXINT, 0, G_PARAM_READABLE));
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAME_TIME,
|
|
||||||
g_param_spec_int ("frame_time", "Frame time", "The interval between frames",
|
|
||||||
G_MININT, G_MAXINT, 0, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
gobject_class->set_property = gst_sdlvideosink_set_property;
|
gobject_class->set_property = gst_sdlvideosink_set_property;
|
||||||
gobject_class->get_property = gst_sdlvideosink_get_property;
|
gobject_class->get_property = gst_sdlvideosink_get_property;
|
||||||
|
|
||||||
gst_sdlvideosink_signals[SIGNAL_FRAME_DISPLAYED] =
|
|
||||||
g_signal_new ("frame_displayed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstSDLVideoSinkClass, frame_displayed), NULL, NULL,
|
|
||||||
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
|
|
||||||
gst_sdlvideosink_signals[SIGNAL_HAVE_SIZE] =
|
|
||||||
g_signal_new ("have_size", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstSDLVideoSinkClass, have_size), NULL, NULL,
|
|
||||||
gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2,
|
|
||||||
G_TYPE_UINT, G_TYPE_UINT);
|
|
||||||
|
|
||||||
|
|
||||||
gstelement_class->change_state = gst_sdlvideosink_change_state;
|
gstelement_class->change_state = gst_sdlvideosink_change_state;
|
||||||
gstelement_class->set_clock = gst_sdlvideosink_set_clock;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_sdlvideosink_set_clock (GstElement *element, GstClock *clock)
|
|
||||||
{
|
|
||||||
GstSDLVideoSink *sdlvideosink;
|
|
||||||
|
|
||||||
sdlvideosink = GST_SDLVIDEOSINK (element);
|
|
||||||
|
|
||||||
sdlvideosink->clock = clock;
|
/*gstvs_class->set_video_out = gst_sdlvideosink_set_video_out;
|
||||||
|
gstvs_class->push_ui_event = gst_sdlvideosink_push_ui_event;
|
||||||
|
gstvs_class->set_geometry = gst_sdlvideosink_set_geometry;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink)
|
gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink)
|
||||||
{
|
{
|
||||||
sdlvideosink->sinkpad = gst_pad_new_from_template (sink_template, "sink");
|
GST_VIDEOSINK_PAD (sdlvideosink) = gst_pad_new_from_template (sink_template,
|
||||||
gst_element_add_pad (GST_ELEMENT (sdlvideosink), sdlvideosink->sinkpad);
|
"sink");
|
||||||
|
gst_element_add_pad (GST_ELEMENT (sdlvideosink),
|
||||||
|
GST_VIDEOSINK_PAD (sdlvideosink));
|
||||||
|
|
||||||
gst_pad_set_chain_function (sdlvideosink->sinkpad, gst_sdlvideosink_chain);
|
gst_pad_set_chain_function (GST_VIDEOSINK_PAD (sdlvideosink),
|
||||||
gst_pad_set_link_function (sdlvideosink->sinkpad, gst_sdlvideosink_sinkconnect);
|
gst_sdlvideosink_chain);
|
||||||
|
gst_pad_set_link_function (GST_VIDEOSINK_PAD (sdlvideosink),
|
||||||
sdlvideosink->window_width = -1;
|
gst_sdlvideosink_sinkconnect);
|
||||||
sdlvideosink->window_height = -1;
|
|
||||||
|
|
||||||
sdlvideosink->image_width = -1;
|
sdlvideosink->image_width = -1;
|
||||||
sdlvideosink->image_height = -1;
|
sdlvideosink->image_height = -1;
|
||||||
@ -193,8 +137,6 @@ gst_sdlvideosink_init (GstSDLVideoSink *sdlvideosink)
|
|||||||
|
|
||||||
sdlvideosink->capslist = capslist;
|
sdlvideosink->capslist = capslist;
|
||||||
|
|
||||||
sdlvideosink->clock = NULL;
|
|
||||||
|
|
||||||
GST_FLAG_SET(sdlvideosink, GST_ELEMENT_THREAD_SUGGESTED);
|
GST_FLAG_SET(sdlvideosink, GST_ELEMENT_THREAD_SUGGESTED);
|
||||||
GST_FLAG_SET(sdlvideosink, GST_ELEMENT_EVENT_AWARE);
|
GST_FLAG_SET(sdlvideosink, GST_ELEMENT_EVENT_AWARE);
|
||||||
}
|
}
|
||||||
@ -266,42 +208,42 @@ gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink, gboolean showlogo)
|
|||||||
guint8 *sbuffer;
|
guint8 *sbuffer;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
if (sdlvideosink->window_height <= 0)
|
if (GST_VIDEOSINK_HEIGHT (sdlvideosink) <= 0)
|
||||||
sdlvideosink->window_height = sdlvideosink->image_height;
|
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdlvideosink->image_height;
|
||||||
if (sdlvideosink->window_width <= 0)
|
if (GST_VIDEOSINK_WIDTH (sdlvideosink) <= 0)
|
||||||
sdlvideosink->window_width = sdlvideosink->image_width;
|
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdlvideosink->image_width;
|
||||||
|
|
||||||
/* create a SDL window of the size requested by the user */
|
/* create a SDL window of the size requested by the user */
|
||||||
sdlvideosink->screen = SDL_SetVideoMode(sdlvideosink->window_width,
|
sdlvideosink->screen = SDL_SetVideoMode(GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||||
sdlvideosink->window_height, 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
GST_VIDEOSINK_HEIGHT (sdlvideosink), 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
||||||
if (showlogo) /* workaround for SDL bug - do it twice */
|
if (showlogo) /* workaround for SDL bug - do it twice */
|
||||||
sdlvideosink->screen = SDL_SetVideoMode(sdlvideosink->window_width,
|
sdlvideosink->screen = SDL_SetVideoMode(GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||||
sdlvideosink->window_height, 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
GST_VIDEOSINK_HEIGHT (sdlvideosink), 0, SDL_SWSURFACE | SDL_RESIZABLE);
|
||||||
if ( sdlvideosink->screen == NULL)
|
if ( sdlvideosink->screen == NULL)
|
||||||
{
|
{
|
||||||
gst_element_error(GST_ELEMENT(sdlvideosink),
|
gst_element_error(GST_ELEMENT(sdlvideosink),
|
||||||
"SDL: Couldn't set %dx%d: %s", sdlvideosink->window_width,
|
"SDL: Couldn't set %dx%d: %s", GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||||
sdlvideosink->window_height, SDL_GetError());
|
GST_VIDEOSINK_HEIGHT (sdlvideosink), SDL_GetError());
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean possible old YUV overlays (...) and create a new one */
|
/* clean possible old YUV overlays (...) and create a new one */
|
||||||
if (sdlvideosink->yuv_overlay)
|
if (sdlvideosink->yuv_overlay)
|
||||||
SDL_FreeYUVOverlay(sdlvideosink->yuv_overlay);
|
SDL_FreeYUVOverlay(sdlvideosink->yuv_overlay);
|
||||||
sdlvideosink->yuv_overlay = SDL_CreateYUVOverlay(sdlvideosink->image_width,
|
sdlvideosink->yuv_overlay = SDL_CreateYUVOverlay(GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||||
sdlvideosink->image_height, sdlvideosink->format, sdlvideosink->screen);
|
GST_VIDEOSINK_WIDTH (sdlvideosink), sdlvideosink->format, sdlvideosink->screen);
|
||||||
if ( sdlvideosink->yuv_overlay == NULL )
|
if ( sdlvideosink->yuv_overlay == NULL )
|
||||||
{
|
{
|
||||||
gst_element_error(GST_ELEMENT(sdlvideosink),
|
gst_element_error(GST_ELEMENT(sdlvideosink),
|
||||||
"SDL: Couldn't create SDL_yuv_overlay (%dx%d \'" GST_FOURCC_FORMAT "\'): %s",
|
"SDL: Couldn't create SDL_yuv_overlay (%dx%d \'" GST_FOURCC_FORMAT "\'): %s",
|
||||||
sdlvideosink->image_width, sdlvideosink->image_height,
|
GST_VIDEOSINK_WIDTH (sdlvideosink), GST_VIDEOSINK_HEIGHT (sdlvideosink),
|
||||||
GST_FOURCC_ARGS(sdlvideosink->format), SDL_GetError());
|
GST_FOURCC_ARGS(sdlvideosink->format), SDL_GetError());
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_message("Using a %dx%d %dbpp SDL screen with a %dx%d \'" GST_FOURCC_FORMAT "\' YUV overlay\n",
|
g_message("Using a %dx%d %dbpp SDL screen with a %dx%d \'" GST_FOURCC_FORMAT "\' YUV overlay\n",
|
||||||
sdlvideosink->window_width, sdlvideosink->window_height,
|
GST_VIDEOSINK_WIDTH (sdlvideosink), GST_VIDEOSINK_HEIGHT (sdlvideosink),
|
||||||
sdlvideosink->screen->format->BitsPerPixel,
|
sdlvideosink->screen->format->BitsPerPixel,
|
||||||
sdlvideosink->image_width, sdlvideosink->image_height,
|
sdlvideosink->image_width, sdlvideosink->image_height,
|
||||||
GST_FOURCC_ARGS(sdlvideosink->format));
|
GST_FOURCC_ARGS(sdlvideosink->format));
|
||||||
@ -309,8 +251,8 @@ gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink, gboolean showlogo)
|
|||||||
|
|
||||||
sdlvideosink->rect.x = 0;
|
sdlvideosink->rect.x = 0;
|
||||||
sdlvideosink->rect.y = 0;
|
sdlvideosink->rect.y = 0;
|
||||||
sdlvideosink->rect.w = sdlvideosink->window_width;
|
sdlvideosink->rect.w = GST_VIDEOSINK_WIDTH (sdlvideosink);
|
||||||
sdlvideosink->rect.h = sdlvideosink->window_height;
|
sdlvideosink->rect.h = GST_VIDEOSINK_HEIGHT (sdlvideosink);
|
||||||
|
|
||||||
/* make stupid SDL *not* react on SIGINT */
|
/* make stupid SDL *not* react on SIGINT */
|
||||||
signal(SIGINT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
||||||
@ -345,11 +287,10 @@ gst_sdlvideosink_create (GstSDLVideoSink *sdlvideosink, gboolean showlogo)
|
|||||||
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
SDL_DisplayYUVOverlay(sdlvideosink->yuv_overlay, &(sdlvideosink->rect));
|
||||||
|
|
||||||
GST_DEBUG ("sdlvideosink: setting %08lx (" GST_FOURCC_FORMAT ")", sdlvideosink->format, GST_FOURCC_ARGS(sdlvideosink->format));
|
GST_DEBUG ("sdlvideosink: setting %08lx (" GST_FOURCC_FORMAT ")", sdlvideosink->format, GST_FOURCC_ARGS(sdlvideosink->format));
|
||||||
|
|
||||||
/* TODO: is this the width of the input image stream or of the widget? */
|
|
||||||
g_signal_emit (G_OBJECT (sdlvideosink), gst_sdlvideosink_signals[SIGNAL_HAVE_SIZE], 0,
|
|
||||||
sdlvideosink->window_width, sdlvideosink->window_height);
|
|
||||||
|
|
||||||
|
gst_video_sink_got_video_size (GST_VIDEOSINK (sdlvideosink),
|
||||||
|
GST_VIDEOSINK_WIDTH (sdlvideosink),
|
||||||
|
GST_VIDEOSINK_HEIGHT (sdlvideosink));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,8 +357,8 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
|||||||
{
|
{
|
||||||
case SDL_VIDEORESIZE:
|
case SDL_VIDEORESIZE:
|
||||||
/* create a SDL window of the size requested by the user */
|
/* create a SDL window of the size requested by the user */
|
||||||
sdlvideosink->window_width = sdl_event.resize.w;
|
GST_VIDEOSINK_WIDTH (sdlvideosink) = sdl_event.resize.w;
|
||||||
sdlvideosink->window_height = sdl_event.resize.h;
|
GST_VIDEOSINK_HEIGHT (sdlvideosink) = sdl_event.resize.h;
|
||||||
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -442,8 +383,10 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP(buf));
|
GST_DEBUG ("videosink: clock wait: %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP(buf));
|
||||||
if (sdlvideosink->clock) {
|
if (GST_VIDEOSINK_CLOCK (sdlvideosink)) {
|
||||||
GstClockID id = gst_clock_new_single_shot_id (sdlvideosink->clock, GST_BUFFER_TIMESTAMP (buf));
|
GstClockID id = gst_clock_new_single_shot_id (
|
||||||
|
GST_VIDEOSINK_CLOCK (sdlvideosink),
|
||||||
|
GST_BUFFER_TIMESTAMP (buf));
|
||||||
|
|
||||||
gst_element_clock_wait (GST_ELEMENT (sdlvideosink), id, NULL);
|
gst_element_clock_wait (GST_ELEMENT (sdlvideosink), id, NULL);
|
||||||
gst_clock_id_free (id);
|
gst_clock_id_free (id);
|
||||||
@ -478,7 +421,7 @@ gst_sdlvideosink_chain (GstPad *pad, GstBuffer *buf)
|
|||||||
sdlvideosink->rect.x, sdlvideosink->rect.y,
|
sdlvideosink->rect.x, sdlvideosink->rect.y,
|
||||||
sdlvideosink->rect.w, sdlvideosink->rect.h);
|
sdlvideosink->rect.w, sdlvideosink->rect.h);
|
||||||
|
|
||||||
g_signal_emit(G_OBJECT(sdlvideosink),gst_sdlvideosink_signals[SIGNAL_FRAME_DISPLAYED],0);
|
gst_video_sink_frame_displayed (GST_VIDEOSINK (sdlvideosink));
|
||||||
|
|
||||||
gst_buffer_unref(buf);
|
gst_buffer_unref(buf);
|
||||||
}
|
}
|
||||||
@ -495,19 +438,6 @@ gst_sdlvideosink_set_property (GObject *object, guint prop_id, const GValue *val
|
|||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case ARG_WIDTH:
|
|
||||||
sdlvideosink->window_width = g_value_get_int(value);
|
|
||||||
if (sdlvideosink->yuv_overlay)
|
|
||||||
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
|
||||||
break;
|
|
||||||
case ARG_HEIGHT:
|
|
||||||
sdlvideosink->window_height = g_value_get_int(value);
|
|
||||||
if (sdlvideosink->yuv_overlay)
|
|
||||||
gst_sdlvideosink_create(sdlvideosink, FALSE);
|
|
||||||
break;
|
|
||||||
case ARG_XID:
|
|
||||||
sdlvideosink->window_id = g_value_get_int(value);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -525,18 +455,6 @@ gst_sdlvideosink_get_property (GObject *object, guint prop_id, GValue *value, GP
|
|||||||
sdlvideosink = GST_SDLVIDEOSINK(object);
|
sdlvideosink = GST_SDLVIDEOSINK(object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_WIDTH:
|
|
||||||
g_value_set_int(value, sdlvideosink->window_width);
|
|
||||||
break;
|
|
||||||
case ARG_HEIGHT:
|
|
||||||
g_value_set_int(value, sdlvideosink->window_height);
|
|
||||||
break;
|
|
||||||
case ARG_FRAMES_DISPLAYED:
|
|
||||||
g_value_set_int (value, sdlvideosink->frames_displayed);
|
|
||||||
break;
|
|
||||||
case ARG_FRAME_TIME:
|
|
||||||
g_value_set_int (value, sdlvideosink->frame_time/1000000);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -601,6 +519,10 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
|||||||
GST_MAKE_FOURCC('U','Y','V','Y')
|
GST_MAKE_FOURCC('U','Y','V','Y')
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Loading the library containing GstVideoSink, our parent object */
|
||||||
|
if (!gst_library_load ("gstvideo"))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
/* create an elementfactory for the sdlvideosink element */
|
/* create an elementfactory for the sdlvideosink element */
|
||||||
factory = gst_element_factory_new("sdlvideosink",GST_TYPE_SDLVIDEOSINK,
|
factory = gst_element_factory_new("sdlvideosink",GST_TYPE_SDLVIDEOSINK,
|
||||||
&gst_sdlvideosink_details);
|
&gst_sdlvideosink_details);
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#ifndef __GST_SDLVIDEOSINK_H__
|
#ifndef __GST_SDLVIDEOSINK_H__
|
||||||
#define __GST_SDLVIDEOSINK_H__
|
#define __GST_SDLVIDEOSINK_H__
|
||||||
|
|
||||||
#include <gst/gst.h>
|
#include <gst/video/gstvideosink.h>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
@ -51,20 +51,12 @@ typedef struct _GstSDLVideoSink GstSDLVideoSink;
|
|||||||
typedef struct _GstSDLVideoSinkClass GstSDLVideoSinkClass;
|
typedef struct _GstSDLVideoSinkClass GstSDLVideoSinkClass;
|
||||||
|
|
||||||
struct _GstSDLVideoSink {
|
struct _GstSDLVideoSink {
|
||||||
GstElement element;
|
GstVideoSink videosink;
|
||||||
|
|
||||||
GstPad *sinkpad;
|
|
||||||
|
|
||||||
gulong format;
|
gulong format;
|
||||||
gint window_width, window_height; /* the size of the SDL window */
|
|
||||||
gint image_width, image_height; /* the size of the incoming YUV stream */
|
gint image_width, image_height; /* the size of the incoming YUV stream */
|
||||||
gint window_id;
|
gint window_id;
|
||||||
|
|
||||||
gint frames_displayed;
|
|
||||||
guint64 frame_time;
|
|
||||||
|
|
||||||
GstClock *clock;
|
|
||||||
|
|
||||||
GstCaps *capslist;
|
GstCaps *capslist;
|
||||||
|
|
||||||
unsigned char *yuv[3];
|
unsigned char *yuv[3];
|
||||||
@ -74,11 +66,8 @@ struct _GstSDLVideoSink {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct _GstSDLVideoSinkClass {
|
struct _GstSDLVideoSinkClass {
|
||||||
GstElementClass parent_class;
|
GstVideoSinkClass parent_class;
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (*frame_displayed) (GstElement *element);
|
|
||||||
void (*have_size) (GstElement *element, guint width, guint height);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_sdlsink_get_type(void);
|
GType gst_sdlsink_get_type(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user