From: David S. <dsc...@us...> - 2003-07-20 19:55:48
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Sun Jul 20 2003 12:55:47 PDT Log message: Checkpoint for series of changes I'm making to xvideosink. Adds GstImageFormat structure for the extra information needed for RGB for XVideo. non-XV is currently broken. Modified files: sys/xvideo : gstimage.h gstximage.c gstximage.h gstxvimage.c gstxvimage.h gstxwindow.c gstxwindow.h xvideosink.c xvideosink.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstimage.h.diff?r1=1.3&r2=1.4 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstximage.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstximage.h.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstxvimage.c.diff?r1=1.20&r2=1.21 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstxvimage.h.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstxwindow.c.diff?r1=1.9&r2=1.10 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/gstxwindow.h.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/xvideosink.c.diff?r1=1.44&r2=1.45 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/xvideosink.h.diff?r1=1.11&r2=1.12 ====Begin Diffs==== Index: gstimage.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstimage.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstimage.h 9 Apr 2003 21:12:31 -0000 1.3 +++ gstimage.h 20 Jul 2003 19:55:35 -0000 1.4 @@ -20,6 +20,8 @@ #ifndef __GST_IMAGE_H__ #define __GST_IMAGE_H__ +#include <gst/gst.h> + G_BEGIN_DECLS #define GST_IMAGE(img) ((GstImage *)(img)) @@ -31,6 +33,7 @@ #define GST_IMAGE_PUTFUNC(img) (GST_IMAGE (img)->putfunc) typedef struct _GstImage GstImage; +typedef struct _GstImageFormat GstImageFormat; typedef enum { GST_TYPE_XIMAGE, @@ -39,6 +42,14 @@ typedef void (*GstImageDestroyFunc) (GstImage *image); typedef void (*GstImagePutFunc) (GstXWindow *window, GstImage *image); + +struct _GstImageFormat { + GstImageType type; + int im_adaptor; + int im_port; + int im_format; + GstCaps *caps; +}; struct _GstImage { GstImageType type; Index: gstximage.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstximage.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstximage.c 10 Apr 2003 18:10:42 -0000 1.10 +++ gstximage.c 20 Jul 2003 19:55:35 -0000 1.11 @@ -192,3 +192,37 @@ } XSync(window->disp, False); } + +void +_gst_ximage_add_formats (GstXWindow *window) +{ + GstImageFormat *image_format; + GstXImage *ximage; + + g_return_if_fail(window); + + image_format = g_new0(GstImageFormat, 1); + + ximage = _gst_ximage_new (window, 100, 100); + if(!ximage){ + g_warning("Could not create X image\n"); + return; + } + + image_format->type = GST_TYPE_XIMAGE; + image_format->caps = GST_CAPS_NEW("xvideosink_ximage_caps", "video/x-raw-rgb", + "bpp", GST_PROPS_INT (GST_XIMAGE_BPP (ximage)), + "depth", GST_PROPS_INT (GST_XIMAGE_DEPTH (ximage)), + "endianness", GST_PROPS_INT (GST_XIMAGE_ENDIANNESS (ximage)), + "red_mask", GST_PROPS_INT (GST_XIMAGE_RED_MASK (ximage)), + "green_mask", GST_PROPS_INT (GST_XIMAGE_GREEN_MASK (ximage)), + "blue_mask", GST_PROPS_INT (GST_XIMAGE_BLUE_MASK (ximage)), + "width", GST_PROPS_INT_RANGE (0, G_MAXINT), + "height", GST_PROPS_INT_RANGE (0, G_MAXINT), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); + + _gst_image_destroy (GST_IMAGE (ximage)); + + g_ptr_array_add(window->image_formats, image_format); +} + Index: gstximage.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstximage.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstximage.h 9 Apr 2003 21:12:33 -0000 1.7 +++ gstximage.h 20 Jul 2003 19:55:35 -0000 1.8 @@ -44,7 +44,8 @@ gulong endianness; }; -GstXImage* _gst_ximage_new (GstXWindow *window, gint width, gint height); +GstXImage* _gst_ximage_new (GstXWindow *window, gint width, gint height); +void _gst_ximage_add_formats (GstXWindow *window); G_END_DECLS Index: gstxvimage.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstxvimage.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstxvimage.c 6 Jul 2003 20:49:52 -0000 1.20 +++ gstxvimage.c 20 Jul 2003 19:55:35 -0000 1.21 @@ -398,3 +398,130 @@ #endif /* USE_SHM */ #endif /* HAVE_XVIDEO */ } + +void +_gst_xvimage_add_formats(GstXWindow *window) +{ + int i; + int j; + int im_adaptor; + int im_port; + int adaptors; + XvAdaptorInfo *ai; + XvImageFormatValues *fo; + + g_return_if_fail(window); + + if (!_gst_xvimage_check_xvideo(window->disp)) { + //g_warning("Xv: Server has no Xvideo extention support\n"); + return; + } + + g_static_mutex_lock (&omg); + im_adaptor = im_port = -1; + if (Success != XvQueryAdaptors(window->disp,DefaultRootWindow(window->disp), + &adaptors,&ai)) { + g_warning ("Xv: XvQueryAdaptors failed"); + g_static_mutex_unlock (&omg); + return; + } + g_print ( "Xv: %d adaptors available.\n",adaptors); + + for (i = 0; i < adaptors; i++) { + g_print ( "Xv: %s:%s%s%s%s%s, ports %ld-%ld\n", + ai[i].name, + (ai[i].type & XvInputMask) ? " input" : "", + (ai[i].type & XvOutputMask) ? " output" : "", + (ai[i].type & XvVideoMask) ? " video" : "", + (ai[i].type & XvStillMask) ? " still" : "", + (ai[i].type & XvImageMask) ? " image" : "", + ai[i].base_id, + ai[i].base_id+ai[i].num_ports-1); + + if (!((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask))) + continue; + + if (im_port != -1) + continue; + + im_port = ai[i].base_id; + im_adaptor = i; + + { + int count; + const XvAttribute * const attr = XvQueryPortAttributes(window->disp, + im_port, &count); + + for (j = 0; j < count; ++j) { + if (strcmp(attr[j].name, "XV_AUTOPAINT_COLORKEY") == 0) { + const Atom atom = XInternAtom(window->disp, "XV_AUTOPAINT_COLORKEY", + False); + XvSetPortAttribute(window->disp, im_port, atom, 1); + break; + } + } + } + + /* *** image scaler port *** */ + fo = XvListImageFormats(window->disp, im_port, &formats); + + g_print (" image format list for port %d\n",im_port); + for(j = 0; j < formats; j++) { + GstImageFormat *image_format; + + image_format = g_new0(GstImageFormat, 1); + + image_format->type = GST_TYPE_XVIMAGE; + image_format->im_adaptor = im_adaptor; + image_format->im_port = im_port; + image_format->im_format = fo[j].id; + + if(fo[j].type == XvRGB){ + g_print ( " RGB 0x%x (" GST_FOURCC_FORMAT ") %s (%08x,%08x,%08x)\n", + fo[j].id, + GST_FOURCC_ARGS(fo[j].id), + (fo[j].format == XvPacked) ? "packed" : "planar", + fo[j].red_mask, + fo[j].green_mask, + fo[j].blue_mask); + image_format->caps = GST_CAPS_NEW ( "xvideosink_caps", + "video/x-raw-rgb", + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "depth", GST_PROPS_INT (fo[j].depth), + "bpp", GST_PROPS_INT (fo[j].bits_per_pixel), + "blue_mask", GST_PROPS_INT (fo[j].red_mask), + "green_mask", GST_PROPS_INT (fo[j].green_mask), + "red_mask", GST_PROPS_INT (fo[j].blue_mask), + "width", GST_PROPS_INT_RANGE (0, G_MAXINT), + "height", GST_PROPS_INT_RANGE (0, G_MAXINT), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); + }else{ + g_print ( " YUV 0x%x (" GST_FOURCC_FORMAT ") %s %.32s (%d:%d;%d,%d:%d:%d,%d:%d:%d)\n", + fo[j].id, + GST_FOURCC_ARGS(fo[j].id), + (fo[j].format == XvPacked) ? "packed" : "planar", + fo[j].component_order, + fo[j].y_sample_bits, + fo[j].u_sample_bits, + fo[j].v_sample_bits, + fo[j].horz_y_period, + fo[j].horz_u_period, + fo[j].horz_v_period, + fo[j].vert_y_period, + fo[j].vert_u_period, + fo[j].vert_v_period); + + image_format->caps = GST_CAPS_NEW ( "xvideosink_caps", + "video/x-raw-yuv", + "format", GST_PROPS_FOURCC (fo[j].id), + "width", GST_PROPS_INT_RANGE (0, G_MAXINT), + "height", GST_PROPS_INT_RANGE (0, G_MAXINT), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)); + } + + g_ptr_array_add(window->image_formats, image_format); + } + } + g_static_mutex_unlock (&omg); +} + Index: gstxvimage.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstxvimage.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstxvimage.h 6 Jul 2003 20:49:52 -0000 1.11 +++ gstxvimage.h 20 Jul 2003 19:55:35 -0000 1.12 @@ -46,6 +46,7 @@ GstXWindow *window, gint width, gint height); +void _gst_xvimage_add_formats (GstXWindow *window); G_END_DECLS Index: gstxwindow.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstxwindow.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstxwindow.c 10 Apr 2003 18:10:42 -0000 1.9 +++ gstxwindow.c 20 Jul 2003 19:55:35 -0000 1.10 @@ -24,12 +24,15 @@ #include <X11/Shell.h> #include "gstxwindow.h" +#include "gstximage.h" +#include "gstxvimage.h" GstXWindow * _gst_xwindow_new (gint width, gint height, gboolean toplevel) { XGCValues values; GstXWindow *new; + int i; new = g_new0 (GstXWindow, 1); @@ -71,8 +74,23 @@ XMapRaised (new->disp, new->win); } + new->image_formats = g_ptr_array_new(); + + _gst_xvimage_add_formats(new); + _gst_ximage_add_formats(new); + + for(i=0;i<new->image_formats->len;i++){ + GstImageFormat *image_format; + + image_format = g_ptr_array_index(new->image_formats,i); + + g_print("%d: %d %s\n",i,image_format->type, + gst_caps_to_string(image_format->caps)); + } + return new; } + static inline void gst_xwindow_real_destroy (GstXWindow * window) { @@ -82,6 +100,7 @@ g_free (window); } } + void _gst_xwindow_destroy (GstXWindow * window) { @@ -89,11 +108,13 @@ XDestroyWindow (window->disp, window->win); gst_xwindow_real_destroy (window); } + void _gst_xwindow_ref (GstXWindow * window) { window->imagecount++; } + void _gst_xwindow_unref (GstXWindow * window) { Index: gstxwindow.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/gstxwindow.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstxwindow.h 10 Apr 2003 18:10:42 -0000 1.5 +++ gstxwindow.h 20 Jul 2003 19:55:35 -0000 1.6 @@ -23,6 +23,11 @@ gboolean die; gboolean imagecount; + + gboolean have_xvideo; + gboolean have_shm; + + GPtrArray *image_formats; }; Index: xvideosink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/xvideosink.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- xvideosink.c 6 Jul 2003 20:49:52 -0000 1.44 +++ xvideosink.c 20 Jul 2003 19:55:35 -0000 1.45 @@ -60,7 +60,6 @@ ARG_AUTOSIZE, ARG_NEED_NEW_WINDOW, }; -#define FORMAT_IS_RGB(format) ((format) == GST_MAKE_FOURCC ('R','G','B',' ')) static void gst_xvideosink_class_init (GstXVideoSinkClass *klass); static void gst_xvideosink_init (GstXVideoSink *xvideosink); @@ -94,16 +93,14 @@ "sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "videosink_rgbsink", - "video/x-raw-rgb", - NULL - ), - GST_CAPS_NEW ( - "videosink_yuvsink", - "video/x-raw-yuv", - NULL - ) + GST_CAPS_NEW ( "videosink_rgbsink", "video/x-raw-rgb", + "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT), + "width", GST_PROPS_INT_RANGE(0, G_MAXINT), + "height", GST_PROPS_INT_RANGE(0, G_MAXINT)), + GST_CAPS_NEW ( "videosink_yuvsink", "video/x-raw-yuv", + "framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT), + "width", GST_PROPS_INT_RANGE(0, G_MAXINT), + "height", GST_PROPS_INT_RANGE(0, G_MAXINT)) ) static GstElementClass *parent_class = NULL; @@ -142,7 +139,7 @@ parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_XID, - g_param_spec_int ("xid", "Xid", "The Xid of the window", + g_param_spec_int ("xid", "XID", "The Xid of the window", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); 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", @@ -230,15 +227,16 @@ /* we have to lock the X connection */ g_mutex_lock (xvideosink->lock); - if (FORMAT_IS_RGB (xvideosink->format)) { + if (xvideosink->image_format->type == GST_TYPE_XIMAGE) { + g_print("creating ximage\n"); image = GST_IMAGE (_gst_ximage_new ( xvideosink->window, xvideosink->width, xvideosink->height)); - } - else { + } else { + g_print("creating xvimage %08x\n", xvideosink->image_format->im_format); image = GST_IMAGE (_gst_xvimage_new ( - xvideosink->format, + xvideosink->image_format->im_format, xvideosink->window, xvideosink->width, xvideosink->height)); @@ -318,12 +316,8 @@ xvideosink = GST_XVIDEOSINK (gst_pad_get_parent (pad)); if (!xvideosink->bufferpool) { - if (FORMAT_IS_RGB (xvideosink->format)) { - GST_DEBUG ("xvideosink: creating RGB XImage bufferpool"); - } - else { - GST_DEBUG ("xvideosink: creating YUV XvImage bufferpool"); - } + GST_DEBUG ("xvideosink: creating %s bufferpool", + (xvideosink->image_format->type == GST_TYPE_XIMAGE) ? "XImage" : "XvImage"); xvideosink->bufferpool = gst_buffer_pool_new ( NULL, /* free */ @@ -366,7 +360,9 @@ gst_xvideosink_sinkconnect (GstPad *pad, GstCaps *caps) { GstXVideoSink *xvideosink; - gulong print_format; + GstCaps *icaps; + int i; + GstImageFormat *image_format; xvideosink = GST_XVIDEOSINK (gst_pad_get_parent (pad)); @@ -374,70 +370,78 @@ if (!GST_CAPS_IS_FIXED (caps)) return GST_PAD_LINK_DELAYED; - for ( ; caps != NULL; caps = caps->next) { - if (!strcmp (gst_caps_get_mime (caps), "video/x-raw-yuv")) { - gst_caps_get (caps, - "format", &xvideosink->format, - "width", &xvideosink->width, - "height", &xvideosink->height, - NULL); - } else { - xvideosink->format = GST_MAKE_FOURCC ('R','G','B',' '); - gst_caps_get (caps, - "width", &xvideosink->width, - "height", &xvideosink->height, - NULL); + if (GST_CAPS_IS_CHAINED (caps)) + return GST_PAD_LINK_DELAYED; + + g_print("sinkconnect %s\n", gst_caps_to_string(caps)); + + image_format = NULL; + icaps = NULL; + for(i=0;i<xvideosink->window->image_formats->len;i++){ + image_format = g_ptr_array_index(xvideosink->window->image_formats, i); + + icaps = gst_caps_intersect (caps, image_format->caps); + + if(icaps != NULL){ + break; } + } - if (gst_caps_has_fixed_property (caps, "pixel_width")) - gst_caps_get_int (caps, "pixel_width", &xvideosink->pixel_width); - else - xvideosink->pixel_width = 1; + if(icaps == NULL){ + g_print("no format found\n"); + return GST_PAD_LINK_REFUSED; + } - if (gst_caps_has_fixed_property (caps, "pixel_height")) - gst_caps_get_int (caps, "pixel_height", &xvideosink->pixel_height); - else - xvideosink->pixel_height = 1; + gst_caps_unref(icaps); - print_format = GULONG_FROM_LE (xvideosink->format); + g_print("using format %d\n",i); + xvideosink->image_format = image_format; - GST_DEBUG ("xvideosink: setting %08x (%4.4s) %dx%d\n", - xvideosink->format, (gchar*)&print_format, - xvideosink->width, xvideosink->height); + gst_caps_get_int (caps, "width", &xvideosink->width); + gst_caps_get_int (caps, "height", &xvideosink->height); - g_mutex_lock (xvideosink->lock); - if (!gst_xvideosink_image_new (xvideosink)) { - g_mutex_unlock (xvideosink->lock); - xvideosink->format = 0; - continue; - } + if (gst_caps_has_fixed_property (caps, "pixel_width")) { + gst_caps_get_int (caps, "pixel_width", &xvideosink->pixel_width); + } else { + xvideosink->pixel_width = 1; + } - if (xvideosink->image == NULL) { - /* FIXME: need better error handling? */ - g_mutex_unlock (xvideosink->lock); - gst_element_error (GST_ELEMENT (xvideosink), "image creation failed"); - xvideosink->format = 0; - continue; - } + if (gst_caps_has_fixed_property (caps, "pixel_height")) { + gst_caps_get_int (caps, "pixel_height", &xvideosink->pixel_height); + } else { + xvideosink->pixel_height = 1; + } + g_mutex_lock (xvideosink->lock); + if (!gst_xvideosink_image_new (xvideosink)) { g_mutex_unlock (xvideosink->lock); + xvideosink->image_format = NULL; + return GST_PAD_LINK_REFUSED; + } - do { - gint real_x, real_y; + if (xvideosink->image == NULL) { + /* FIXME: need better error handling? */ + g_mutex_unlock (xvideosink->lock); + gst_element_error (GST_ELEMENT (xvideosink), "image creation failed"); + xvideosink->image_format = NULL; + return GST_PAD_LINK_REFUSED; + } - gst_xvideosink_get_real_size (xvideosink, &real_x, &real_y); - - if (xvideosink->auto_size) { - _gst_xwindow_resize (xvideosink->window, real_x, real_y); - } - g_signal_emit (G_OBJECT (xvideosink), gst_xvideosink_signals[SIGNAL_HAVE_SIZE], 0, - real_x, real_y); - } while (0); + g_mutex_unlock (xvideosink->lock); - return GST_PAD_LINK_OK; + { + gint real_x, real_y; + + gst_xvideosink_get_real_size (xvideosink, &real_x, &real_y); + + if (xvideosink->auto_size) { + _gst_xwindow_resize (xvideosink->window, real_x, real_y); + } + g_signal_emit (G_OBJECT (xvideosink), gst_xvideosink_signals[SIGNAL_HAVE_SIZE], 0, + real_x, real_y); } - return GST_PAD_LINK_REFUSED; + return GST_PAD_LINK_OK; } static GstCaps * @@ -469,7 +473,7 @@ /* one-time initialization */ xvideosink->window = NULL; xvideosink->toplevel = TRUE; - xvideosink->format = 0; + xvideosink->image_format = NULL; xvideosink->formats = NULL; xvideosink->lock = g_mutex_new (); @@ -823,12 +827,13 @@ xvideosink->send_xid = TRUE; xvideosink->need_new_window = FALSE; - if (!xvideosink->format) { + if (!xvideosink->image_format) { return TRUE; } else { return gst_xvideosink_image_new (xvideosink); } } + static void gst_xvideosink_xwindow_free (GstXVideoSink *xvideosink) { @@ -843,17 +848,18 @@ xvideosink->window = NULL; } } + static gboolean gst_xvideosink_image_new (GstXVideoSink *xvideosink) { - if (!xvideosink->format) + if (!xvideosink->image_format) return FALSE; if (xvideosink->image) gst_xvideosink_image_free (xvideosink); /* create a new image to draw onto */ - if (FORMAT_IS_RGB (xvideosink->format)) { + if (xvideosink->image_format->type == GST_TYPE_XIMAGE) { xvideosink->image = GST_IMAGE (_gst_ximage_new ( xvideosink->window, xvideosink->width, xvideosink->height)); @@ -861,7 +867,7 @@ return FALSE; } else { xvideosink->image = GST_IMAGE (_gst_xvimage_new ( - xvideosink->format, + xvideosink->image_format->im_format, xvideosink->window, xvideosink->width, xvideosink->height)); } Index: xvideosink.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/xvideosink.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- xvideosink.h 27 Dec 2002 23:02:40 -0000 1.11 +++ xvideosink.h 20 Jul 2003 19:55:35 -0000 1.12 @@ -52,7 +52,9 @@ GstXWindow *window; GstImage *image; - guint32 format; + GstImageFormat *image_format; + //int image_type; + //guint32 format; gint width, height; gint pixel_width, pixel_height; gint64 correction; |