From: <tp...@fr...> - 2005-10-28 15:11:39
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: tpm Date: Fri Oct 28 2005 08:11:30 PDT Log message: * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init), (gst_sdlvideosink_class_init), (gst_sdlvideosink_get_sdl_from_fourcc), (gst_sdlvideosink_setcaps), (gst_sdlvideosink_show_frame): * ext/sdl/sdlvideosink.h: Fix I420 output on some machines (not very nice, but should work). Add an 'sdlvideosink' debug category. Disable formats that do not work. Fix some vararg function issues. Modified files: . : ChangeLog ext/sdl : sdlvideosink.c sdlvideosink.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.1865&r2=1.1866 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ext/sdl/sdlvideosink.c.diff?r1=1.57&r2=1.58 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ext/sdl/sdlvideosink.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.1865 retrieving revision 1.1866 diff -u -d -r1.1865 -r1.1866 --- ChangeLog 27 Oct 2005 20:16:40 -0000 1.1865 +++ ChangeLog 28 Oct 2005 15:11:17 -0000 1.1866 @@ -1,3 +1,14 @@ +2005-10-28 Tim-Philipp Müller <tim at centricular dot net> + + * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init), + (gst_sdlvideosink_class_init), + (gst_sdlvideosink_get_sdl_from_fourcc), (gst_sdlvideosink_setcaps), + (gst_sdlvideosink_show_frame): + * ext/sdl/sdlvideosink.h: + Fix I420 output on some machines (not very nice, but should work). + Add an 'sdlvideosink' debug category. Disable formats that do + not work. Fix some vararg function issues. 2005-10-27 Wim Taymans <wi...@fl...> * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), Index: sdlvideosink.c RCS file: /cvs/gstreamer/gst-plugins-bad/ext/sdl/sdlvideosink.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- sdlvideosink.c 27 Oct 2005 20:16:40 -0000 1.57 +++ sdlvideosink.c 28 Oct 2005 15:11:18 -0000 1.58 @@ -32,6 +32,21 @@ #include "sdlvideosink.h" +GST_DEBUG_CATEGORY_STATIC (sdlvideosink_debug); +#define GST_CAT_DEFAULT sdlvideosink_debug +/* These macros are adapted from videotestsrc.c + * and/or gst-plugins/gst/games/gstvideoimage.c */ +#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)) /* elementfactory information */ static GstElementDetails gst_sdlvideosink_details = { "Video sink", @@ -124,22 +139,26 @@ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstCaps *capslist; gint i; - gulong format[6] = { GST_MAKE_FOURCC ('I', '4', '2', '0'), + guint32 formats[] = { + GST_MAKE_FOURCC ('I', '4', '2', '0'), GST_MAKE_FOURCC ('Y', 'V', '1', '2'), - GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), + GST_MAKE_FOURCC ('Y', 'U', 'Y', '2') +/* GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'), GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y') +*/ }; /* make a list of all available caps */ capslist = gst_caps_new_empty (); - for (i = 0; i < 5; i++) { + for (i = 0; i < G_N_ELEMENTS (formats); i++) { gst_caps_append_structure (capslist, gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, format[i], + "format", GST_TYPE_FOURCC, formats[i], "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, - "framerate", GST_TYPE_DOUBLE_RANGE, 1.0, 100.0, NULL)); + "framerate", GST_TYPE_DOUBLE_RANGE, (gdouble) 1.0, + (gdouble) 100.0, NULL)); } sink_template = gst_pad_template_new ("sink", @@ -147,6 +166,9 @@ gst_element_class_add_pad_template (element_class, sink_template); gst_element_class_set_details (element_class, &gst_sdlvideosink_details); + GST_DEBUG_CATEGORY_INIT (sdlvideosink_debug, "sdlvideosink", 0, + "SDL video sink element"); } static void @@ -189,7 +211,7 @@ gstelement_class = (GstElementClass *) klass; gstvs_class = (GstBaseSinkClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_BASE_SINK); + parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_sdlvideosink_set_property; gobject_class->get_property = gst_sdlvideosink_get_property; @@ -337,8 +359,9 @@ guint32 code) { switch (code) { + /* Note: SDL_IYUV_OVERLAY does not always work for I420 */ case GST_MAKE_FOURCC ('I', '4', '2', '0'): - return SDL_IYUV_OVERLAY; + return SDL_YV12_OVERLAY; case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): return SDL_YV12_OVERLAY; case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): @@ -544,9 +567,9 @@ sdlvideosink = GST_SDLVIDEOSINK (bsink); structure = gst_caps_get_structure (vscapslist, 0); - gst_structure_get_fourcc (structure, "format", &format); + gst_structure_get_fourcc (structure, "format", &sdlvideosink->fourcc); sdlvideosink->format = - gst_sdlvideosink_get_sdl_from_fourcc (sdlvideosink, format); + gst_sdlvideosink_get_sdl_from_fourcc (sdlvideosink, sdlvideosink->fourcc); gst_structure_get_int (structure, "width", &sdlvideosink->width); gst_structure_get_int (structure, "height", &sdlvideosink->height); gst_structure_get_double (structure, "framerate", &sdlvideosink->framerate); @@ -574,21 +597,36 @@ !sdlvideosink->overlay || !sdlvideosink->overlay->pixels) goto not_init; - if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) { + /* if (GST_BUFFER_DATA (buf) != sdlvideosink->overlay->pixels[0]) */ + if (TRUE) { if (!gst_sdlvideosink_lock (sdlvideosink)) goto cannot_lock; /* buf->yuv - FIXME: bufferpool! */ - if (sdlvideosink->format == SDL_IYUV_OVERLAY || - sdlvideosink->format == SDL_YV12_OVERLAY) { - memcpy (sdlvideosink->overlay->pixels[0], GST_BUFFER_DATA (buf), + if (sdlvideosink->format == SDL_YV12_OVERLAY) { + guint8 *y, *u, *v; + switch (sdlvideosink->fourcc) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + y = GST_BUFFER_DATA (buf); + /* I420 is YV12 with switched colour planes and different offsets */ + v = y + I420_U_OFFSET (sdlvideosink->width, sdlvideosink->height); + u = y + I420_V_OFFSET (sdlvideosink->width, sdlvideosink->height); + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + u = y + sdlvideosink->width * sdlvideosink->height; + v = y + sdlvideosink->width * sdlvideosink->height * 5 / 4; + default: + g_assert_not_reached (); + } + memcpy (sdlvideosink->overlay->pixels[0], y, sdlvideosink->width * sdlvideosink->height); - memcpy (sdlvideosink->overlay->pixels[1], - GST_BUFFER_DATA (buf) + sdlvideosink->width * sdlvideosink->height, + memcpy (sdlvideosink->overlay->pixels[1], u, sdlvideosink->width * sdlvideosink->height / 4); - memcpy (sdlvideosink->overlay->pixels[2], - GST_BUFFER_DATA (buf) + - sdlvideosink->width * sdlvideosink->height * 5 / 4, + memcpy (sdlvideosink->overlay->pixels[2], v, } else { memcpy (sdlvideosink->overlay->pixels[0], GST_BUFFER_DATA (buf), Index: sdlvideosink.h RCS file: /cvs/gstreamer/gst-plugins-bad/ext/sdl/sdlvideosink.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- sdlvideosink.h 27 Oct 2005 19:36:18 -0000 1.12 +++ sdlvideosink.h 28 Oct 2005 15:11:18 -0000 1.13 @@ -49,7 +49,9 @@ struct _GstSDLVideoSink { GstVideoSink videosink; - guint32 format; + guint32 format; /* the SDL format */ + guint32 fourcc; /* our fourcc from the caps */ gint width, height; /* the size of the incoming YUV stream */ unsigned long xwindow_id; |
From: <tp...@ke...> - 2006-05-05 15:50:29
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: tpm Date: Fri May 05 2006 15:50:22 UTC Log message: * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_prepare): Use (NULL) instead of just NULL in GST_ELEMENT_ERROR macro. Modified files: . : ChangeLog ext/sdl : sdlaudiosink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.2104&r2=1.2105 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ext/sdl/sdlaudiosink.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.2104 retrieving revision 1.2105 diff -u -d -r1.2104 -r1.2105 --- ChangeLog 4 May 2006 15:32:10 -0000 1.2104 +++ ChangeLog 5 May 2006 15:50:10 -0000 1.2105 @@ -1,3 +1,8 @@ +2006-05-05 Tim-Philipp Müller <tim at centricular dot net> + + * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_prepare): + Use (NULL) instead of just NULL in GST_ELEMENT_ERROR macro. 2006-05-04 Jan Schmidt <th...@ma...> * configure.ac: Index: sdlaudiosink.c RCS file: /cvs/gstreamer/gst-plugins-bad/ext/sdl/sdlaudiosink.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- sdlaudiosink.c 25 Apr 2006 21:56:31 -0000 1.5 +++ sdlaudiosink.c 5 May 2006 15:50:10 -0000 1.6 @@ -389,19 +389,19 @@ unable_open: { GST_ELEMENT_ERROR (sdlaudio, RESOURCE, OPEN_READ, - ("Unable to open audio: %s", SDL_GetError ()), NULL); + ("Unable to open audio: %s", SDL_GetError ()), (NULL)); return FALSE; } wrong_format: - ("Unable to get format %d", spec->format), NULL); + ("Unable to get format %d", spec->format), (NULL)); dodgy_width: - ("unexpected width %d", spec->width), NULL); + ("unexpected width %d", spec->width), (NULL)); } |