summaryrefslogtreecommitdiff
path: root/sys/xvimage
diff options
context:
space:
mode:
Diffstat (limited to 'sys/xvimage')
-rw-r--r--sys/xvimage/xvimagesink.c67
-rw-r--r--sys/xvimage/xvimagesink.h2
2 files changed, 31 insertions, 38 deletions
diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c
index 22e6688c03..d6648c6a25 100644
--- a/sys/xvimage/xvimagesink.c
+++ b/sys/xvimage/xvimagesink.c
@@ -178,6 +178,7 @@ gst_xvimagesink_xvimage_new (GstXvImageSink * xvimagesink,
xvimage->width = width;
xvimage->height = height;
+ xvimage->im_format = xvimagesink->xcontext->im_format;
xvimage->xvimagesink = xvimagesink;
g_mutex_lock (xvimagesink->x_lock);
@@ -189,8 +190,8 @@ gst_xvimagesink_xvimage_new (GstXvImageSink * xvimagesink,
if (xvimagesink->xcontext->use_xshm) {
xvimage->xvimage = XvShmCreateImage (xvimagesink->xcontext->disp,
xvimagesink->xcontext->xv_port_id,
- xvimagesink->xcontext->im_format,
- NULL, xvimage->width, xvimage->height, &xvimage->SHMInfo);
+ xvimage->im_format, NULL,
+ xvimage->width, xvimage->height, &xvimage->SHMInfo);
xvimage->SHMInfo.shmid = shmget (IPC_PRIVATE, xvimage->size,
IPC_CREAT | 0777);
@@ -212,8 +213,7 @@ gst_xvimagesink_xvimage_new (GstXvImageSink * xvimagesink,
/* We use image's internal data pointer */
xvimage->xvimage = XvCreateImage (xvimagesink->xcontext->disp,
xvimagesink->xcontext->xv_port_id,
- xvimagesink->xcontext->im_format,
- NULL, xvimage->width, xvimage->height);
+ xvimage->im_format, NULL, xvimage->width, xvimage->height);
/* Allocating memory for image's data */
xvimage->xvimage->data = g_malloc (xvimage->xvimage->data_size);
@@ -332,13 +332,12 @@ gst_xvimagesink_xwindow_decorate (GstXvImageSink * xvimagesink,
g_mutex_lock (xvimagesink->x_lock);
hints_atom = XInternAtom (xvimagesink->xcontext->disp, "_MOTIF_WM_HINTS", 1);
-
- hints = g_malloc0 (sizeof (MotifWmHints));
-
- if (!hints) {
+ if (hints_atom == None) {
return FALSE;
}
+ hints = g_malloc0 (sizeof (MotifWmHints));
+
hints->flags |= MWM_HINTS_DECORATIONS;
hints->decorations = 1 << 0;
@@ -1124,7 +1123,7 @@ gst_xvimagesink_sink_link (GstPad * pad, const GstCaps * caps)
/* We renew our xvimage only if size or format changed */
if ((xvimagesink->xvimage) &&
- ((xvimagesink->xcontext->im_format != im_format) ||
+ ((im_format != xvimagesink->xvimage->im_format) ||
(GST_VIDEOSINK_WIDTH (xvimagesink) != xvimagesink->xvimage->width) ||
(GST_VIDEOSINK_HEIGHT (xvimagesink) !=
xvimagesink->xvimage->height))) {
@@ -1134,17 +1133,11 @@ gst_xvimagesink_sink_link (GstPad * pad, const GstCaps * caps)
GST_FOURCC_ARGS (im_format));
GST_DEBUG_OBJECT (xvimagesink, "renewing xvimage");
gst_xvimagesink_xvimage_destroy (xvimagesink, xvimagesink->xvimage);
-
- xvimagesink->xcontext->im_format = im_format;
- xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
- GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
- } else if (!xvimagesink->xvimage) {
- /* If no xvimage, creating one */
- xvimagesink->xcontext->im_format = im_format;
- xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
- GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
+ xvimagesink->xvimage = NULL;
}
+ xvimagesink->xcontext->im_format = im_format;
+
gst_x_overlay_got_desired_size (GST_X_OVERLAY (xvimagesink),
GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
@@ -1246,18 +1239,23 @@ gst_xvimagesink_chain (GstPad * pad, GstData * data)
} else {
/* Else we have to copy the data into our private image, */
/* if we have one... */
- if (xvimagesink->xvimage) {
- memcpy (xvimagesink->xvimage->xvimage->data,
- GST_BUFFER_DATA (buf),
- MIN (GST_BUFFER_SIZE (buf), xvimagesink->xvimage->size));
- gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage);
- } else {
- /* No image available. Something went wrong during capsnego ! */
- gst_buffer_unref (buf);
- GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL),
- ("no format defined before chain function"));
- return;
+ if (!xvimagesink->xvimage) {
+ xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
+ GST_VIDEOSINK_WIDTH (xvimagesink),
+ GST_VIDEOSINK_HEIGHT (xvimagesink));
+ if (!xvimagesink->xvimage) {
+ /* No image available. That's very bad ! */
+ gst_buffer_unref (buf);
+ GST_ELEMENT_ERROR (xvimagesink, CORE, NEGOTIATION, (NULL),
+ ("Failed creating an XvImage in xvimagesink chain function."));
+ return;
+ }
}
+
+ memcpy (xvimagesink->xvimage->xvimage->data,
+ GST_BUFFER_DATA (buf),
+ MIN (GST_BUFFER_SIZE (buf), xvimagesink->xvimage->size));
+ gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage);
}
/* set correct time for next buffer */
@@ -1318,8 +1316,10 @@ gst_xvimagesink_buffer_alloc (GstPad * pad, guint64 offset, guint size)
xvimagesink->image_pool = g_slist_delete_link (xvimagesink->image_pool,
xvimagesink->image_pool);
+ /* We check for geometry or image format changes */
if ((xvimage->width != GST_VIDEOSINK_WIDTH (xvimagesink)) ||
- (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink))) {
+ (xvimage->height != GST_VIDEOSINK_HEIGHT (xvimagesink)) ||
+ (xvimage->im_format != xvimagesink->xcontext->im_format)) {
/* This image is unusable. Destroying... */
gst_xvimagesink_xvimage_destroy (xvimagesink, xvimage);
xvimage = NULL;
@@ -1467,13 +1467,6 @@ gst_xvimagesink_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id)
g_mutex_unlock (xvimagesink->x_lock);
}
- /* Recreating our xvimage */
- if (!xvimagesink->xvimage &&
- GST_VIDEOSINK_WIDTH (xvimagesink) && GST_VIDEOSINK_HEIGHT (xvimagesink)) {
- xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
- GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
- }
-
if (xwindow)
xvimagesink->xwindow = xwindow;
}
diff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h
index 0935762ffa..b043367fd5 100644
--- a/sys/xvimage/xvimagesink.h
+++ b/sys/xvimage/xvimagesink.h
@@ -115,7 +115,7 @@ struct _GstXvImage {
XShmSegmentInfo SHMInfo;
#endif /* HAVE_XSHM */
- gint width, height, size;
+ gint width, height, size, im_format;
};
struct _GstXvImageSink {