diff --git a/ChangeLog b/ChangeLog index 9bcc87dd84..9ebb44a0fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2005-06-02 Wim Taymans + + * ext/ogg/README: + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet), + (gst_ogg_demux_activate_chain), (gst_ogg_demux_clear_chains): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_buffer_from_page): + * ext/theora/theoradec.c: (theora_dec_src_query), + (theora_handle_data_packet): + * ext/theora/theoraenc.c: (theora_buffer_from_packet), + (theora_enc_chain): + * ext/vorbis/vorbisdec.c: (vorbis_dec_sink_event), + (vorbis_handle_data_packet): + * gst/audioconvert/bufferframesconvert.c: + (buffer_frames_convert_chain): + * gst/ffmpegcolorspace/gstffmpegcolorspace.c: + (gst_ffmpegcsp_getcaps), (gst_ffmpegcsp_configure_context), + (gst_ffmpegcsp_setcaps), (gst_ffmpegcsp_bufferalloc), + (gst_ffmpegcsp_chain): + * gst/videorate/gstvideorate.c: (gst_videorate_transformcaps), + (gst_videorate_getcaps), (gst_videorate_setcaps), + (gst_videorate_event), (gst_videorate_chain): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_activate), + (gst_videotestsrc_src_query), (gst_videotestsrc_loop): + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), + (gst_ximagesink_setcaps), (gst_ximagesink_buffer_alloc): + * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy), + (gst_xvimage_buffer_finalize), (gst_xvimage_buffer_free), + (gst_xvimage_buffer_class_init), (gst_xvimage_buffer_get_type), + (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_show_frame), (gst_xvimagesink_buffer_alloc): + Cleanups and buffer alloc. + 2005-05-31 Wim Taymans * gst-libs/gst/audio/gstringbuffer.c: (gst_ringbuffer_delay): diff --git a/ext/ogg/README b/ext/ogg/README index 1343fa4b2d..7c76b3aaac 100644 --- a/ext/ogg/README +++ b/ext/ogg/README @@ -187,3 +187,31 @@ TODO - use the OFFSET field in the GstBuffer to store/read the granulepos as opposed to the OFFSET_END field. + + +Ogg media mapping +----------------- + +Ogg defines a mapping for each media type that it embeds. + +For Vorbis: + + - 3 header pages, with granulepos 0. + - 1 page with 1 packet header identification + - N pages with 2 packets comments and codebooks + - granulepos is samplenumber of next page + - one packet can contain a variable number of samples + +For Theora + + - 3 header pages, with granulepos 0. + - 1 page with 1 packet header identification + - N pages with 2 packets comments and codebooks + - granulepos is framenumber of last packet in page, where framenumber + is a combination of keyframe number and p frames since keyframe. + - one packet contains 1 frame + + + + + diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index d3d6e4da30..e28da68498 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -625,34 +625,18 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet) if (pad->packetno == 0) { gst_ogg_pad_typefind (pad, packet); } -#if 0 - if (ogg->state != OGG_STATE_STREAMING) { - GST_DEBUG_OBJECT (ogg, "%p collecting headers, state %d", pad, ogg->state); - - buf = gst_buffer_new_and_alloc (packet->bytes); - memcpy (GST_BUFFER_DATA (buf), packet->packet, packet->bytes); - gst_buffer_set_caps (buf, GST_PAD_CAPS (pad)); - GST_BUFFER_OFFSET (buf) = -1; - GST_BUFFER_OFFSET_END (buf) = packet->granulepos; - - /* we are collecting the chain info, just need to queue the buffers */ - pad->headers = g_list_append (pad->headers, buf); - - goto done; - } -#endif /* stream packet to peer plugin */ if (pad->mode == GST_OGG_PAD_MODE_STREAMING) { - buf = + ret = gst_pad_alloc_buffer (GST_PAD (pad), GST_BUFFER_OFFSET_NONE, - packet->bytes, GST_PAD_CAPS (pad)); + packet->bytes, GST_PAD_CAPS (pad), &buf); GST_DEBUG_OBJECT (ogg, "%p streaming to peer serial %08lx, packetno %lld", pad, pad->serialno, pad->packetno); - if (buf) { + if (ret == GST_FLOW_OK) { memcpy (buf->data, packet->packet, packet->bytes); pad->offset = packet->granulepos; @@ -678,11 +662,8 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet) } } else { /* initialize our internal decoder with packets */ - if (!pad->elem_pad) { - GST_WARNING_OBJECT (ogg, - "pad %08lx does not have elem_pad, no decoder ?", pad); - return GST_FLOW_OK; - } + if (!pad->elem_pad) + goto no_decoder; GST_DEBUG_OBJECT (ogg, "%p init decoder serial %08lx, packetno %lld", pad, pad->serialno, @@ -696,13 +677,16 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet) ret = gst_pad_chain (pad->elem_pad, buf); } - -#if 0 -done: -#endif pad->packetno++; return ret; + +no_decoder: + { + GST_WARNING_OBJECT (ogg, + "pad %08lx does not have elem_pad, no decoder ?", pad); + return GST_FLOW_OK; + } } /* submit a page to an oggpad, this function will then submit all diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index 333274892e..e31e3b86cf 100644 --- a/ext/ogg/gstoggmux.c +++ b/ext/ogg/gstoggmux.c @@ -473,8 +473,7 @@ gst_ogg_mux_buffer_from_page (GstOggMux * mux, ogg_page * page, gboolean delta) GstBuffer *buffer; /* allocate space for header and body */ - buffer = gst_pad_alloc_buffer (mux->srcpad, GST_BUFFER_OFFSET_NONE, - page->header_len + page->body_len, NULL); + buffer = gst_buffer_new_and_alloc (page->header_len + page->body_len); memcpy (GST_BUFFER_DATA (buffer), page->header, page->header_len); memcpy (GST_BUFFER_DATA (buffer) + page->header_len, page->body, page->body_len); diff --git a/ext/theora/theoradec.c b/ext/theora/theoradec.c index 63fb58e30d..ffd7266aae 100644 --- a/ext/theora/theoradec.c +++ b/ext/theora/theoradec.c @@ -825,16 +825,16 @@ theora_handle_data_packet (GstTheoraDec * dec, ogg_packet * packet, /* now copy over the area contained in offset_x,offset_y, * frame_width, frame_height */ - out = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, out_size, - GST_PAD_CAPS (dec->srcpad)); - if (out == NULL) + result = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, out_size, + GST_PAD_CAPS (dec->srcpad), &out); + if (result != GST_FLOW_OK) goto no_buffer; /* copy the visible region to the destination. This is actually pretty * complicated and gstreamer doesn't support all the needed caps to do this * correctly. For example, when we have an odd offset, we should only combine * 1 row/column of luma samples with one chroma sample in colorspace conversion. - * We compensate for this by adding a block border around the image when the + * We compensate for this by adding a black border around the image when the * offset or size is odd (see above). */ { diff --git a/ext/theora/theoraenc.c b/ext/theora/theoraenc.c index cc05eca264..7c7a898925 100644 --- a/ext/theora/theoraenc.c +++ b/ext/theora/theoraenc.c @@ -365,9 +365,13 @@ theora_buffer_from_packet (GstTheoraEnc * enc, ogg_packet * packet, GstClockTime timestamp, GstClockTime duration) { GstBuffer *buf; + GstFlowReturn ret; + + ret = gst_pad_alloc_buffer (enc->srcpad, + GST_BUFFER_OFFSET_NONE, packet->bytes, GST_PAD_CAPS (enc->srcpad), &buf); + if (ret != GST_FLOW_OK) + goto no_buffer; - buf = gst_pad_alloc_buffer (enc->srcpad, - GST_BUFFER_OFFSET_NONE, packet->bytes, GST_PAD_CAPS (enc->srcpad)); memcpy (GST_BUFFER_DATA (buf), packet->packet, packet->bytes); GST_BUFFER_OFFSET (buf) = enc->bytes_out; GST_BUFFER_OFFSET_END (buf) = packet->granulepos; @@ -381,10 +385,14 @@ theora_buffer_from_packet (GstTheoraEnc * enc, ogg_packet * packet, } else { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); } - enc->packetno++; return buf; + +no_buffer: + { + return NULL; + } } /* push out the buffer and do internal bookkeeping */ @@ -482,8 +490,6 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer) in_time = GST_BUFFER_TIMESTAMP (buffer); - GST_STREAM_LOCK (pad); - /* no packets written yet, setup headers */ if (enc->packetno == 0) { GstCaps *caps; @@ -576,8 +582,11 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer) dst_y_stride = enc->info_width; dst_uv_stride = enc->info_width / 2; - newbuf = gst_pad_alloc_buffer (enc->srcpad, - GST_BUFFER_OFFSET_NONE, y_size * 3 / 2, GST_PAD_CAPS (enc->srcpad)); + ret = gst_pad_alloc_buffer (enc->srcpad, + GST_BUFFER_OFFSET_NONE, y_size * 3 / 2, GST_PAD_CAPS (enc->srcpad), + &newbuf); + if (ret != GST_FLOW_OK) + goto no_buffer; dest_y = yuv.y = (guint8 *) GST_BUFFER_DATA (newbuf); dest_u = yuv.u = yuv.y + y_size; @@ -681,7 +690,6 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer) } gst_buffer_unref (buffer); } - GST_STREAM_UNLOCK (pad); return ret; @@ -689,13 +697,16 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer) header_push: { gst_buffer_unref (buffer); - GST_STREAM_UNLOCK (pad); + return ret; + } +no_buffer: + { + gst_buffer_unref (buffer); return ret; } data_push: { gst_buffer_unref (buffer); - GST_STREAM_UNLOCK (pad); return ret; } } diff --git a/ext/vorbis/vorbisdec.c b/ext/vorbis/vorbisdec.c index 1d1d9173d1..7406a9bd44 100644 --- a/ext/vorbis/vorbisdec.c +++ b/ext/vorbis/vorbisdec.c @@ -662,11 +662,11 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet) if (sample_count > 0) { GstBuffer *out; - out = gst_pad_alloc_buffer (vd->srcpad, GST_BUFFER_OFFSET_NONE, + result = gst_pad_alloc_buffer (vd->srcpad, GST_BUFFER_OFFSET_NONE, sample_count * vd->vi.channels * sizeof (float), - GST_PAD_CAPS (vd->srcpad)); + GST_PAD_CAPS (vd->srcpad), &out); - if (out != NULL) { + if (result == GST_FLOW_OK) { float *out_data = (float *) GST_BUFFER_DATA (out); copy_samples (out_data, pcm, sample_count, vd->vi.channels); diff --git a/gst/audioconvert/bufferframesconvert.c b/gst/audioconvert/bufferframesconvert.c index e760ee1665..b1ad70534a 100644 --- a/gst/audioconvert/bufferframesconvert.c +++ b/gst/audioconvert/bufferframesconvert.c @@ -299,6 +299,8 @@ buffer_frames_convert_chain (GstPad * pad, GstBuffer * buf) gfloat *data_out; gint i, samples_in, samples_in_remaining, samples_out_remaining, out_buffer_samples; + GstFlowReturn ret; + this = (BufferFramesConvert *) GST_OBJECT_PARENT (pad); @@ -358,9 +360,13 @@ buffer_frames_convert_chain (GstPad * pad, GstBuffer * buf) } else { /* otherwise make a leftover buffer if it's necessary */ if (samples_in_remaining) { - buf_out = + ret = gst_pad_alloc_buffer (this->srcpad, 0, - out_buffer_samples * sizeof (gfloat), GST_PAD_CAPS (this->srcpad)); + out_buffer_samples * sizeof (gfloat), GST_PAD_CAPS (this->srcpad), + &buf_out); + if (ret != GST_FLOW_OK) + goto done; + data_out = (gfloat *) GST_BUFFER_DATA (buf_out); this->buf_out = buf_out; this->samples_out_remaining = out_buffer_samples - samples_in_remaining; @@ -368,8 +374,10 @@ buffer_frames_convert_chain (GstPad * pad, GstBuffer * buf) *(data_out++) = *(data_in++); } } + ret = GST_FLOW_OK; +done: gst_buffer_unref (buf_in); - return GST_FLOW_OK; + return ret; } diff --git a/gst/ffmpegcolorspace/gstffmpegcolorspace.c b/gst/ffmpegcolorspace/gstffmpegcolorspace.c index 3778d87372..c46f2cdab2 100644 --- a/gst/ffmpegcolorspace/gstffmpegcolorspace.c +++ b/gst/ffmpegcolorspace/gstffmpegcolorspace.c @@ -98,8 +98,8 @@ static void gst_ffmpegcsp_set_property (GObject * object, static void gst_ffmpegcsp_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstBuffer *gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, - guint size, GstCaps * caps); +static GstFlowReturn gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf); static GstFlowReturn gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer); static GstElementStateReturn gst_ffmpegcsp_change_state (GstElement * element); @@ -385,22 +385,23 @@ gst_ffmpegcsp_init (GstFFMpegCsp * space) space->palette = NULL; } -static GstBuffer * +static GstFlowReturn gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, guint size, - GstCaps * caps) + GstCaps * caps, GstBuffer ** buf) { - GstBuffer *buf; + GstFlowReturn ret; GstFFMpegCsp *space; space = GST_FFMPEGCSP (GST_PAD_PARENT (pad)); if ((space->from_pixfmt == space->to_pixfmt) && space->from_pixfmt != PIX_FMT_NB) { - buf = gst_pad_alloc_buffer (space->srcpad, offset, size, caps); + ret = gst_pad_alloc_buffer (space->srcpad, offset, size, caps, buf); } else { - buf = NULL; + *buf = NULL; + ret = GST_FLOW_OK; } - return buf; + return ret; } static GstFlowReturn @@ -426,9 +427,9 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer) avpicture_get_size (space->to_pixfmt, space->width, space->height); /* get buffer in prefered format, setcaps will be called when it is different */ - outbuf = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, size, - space->src_prefered); - if (outbuf == NULL) + res = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, size, + space->src_prefered, &outbuf); + if (res != GST_FLOW_OK) goto no_buffer; /* fill from from with source data */ @@ -452,6 +453,8 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer) /* copy timestamps */ GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); + GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buffer); + GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_END (buffer); /* we don't need source anymore */ gst_buffer_unref (buffer); @@ -462,11 +465,6 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer) return res; /* ERRORS */ -no_buffer: - { - gst_buffer_unref (buffer); - return GST_FLOW_ERROR; - } unkown_format: { GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), @@ -474,6 +472,11 @@ unkown_format: gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } +no_buffer: + { + gst_buffer_unref (buffer); + return res; + } } static GstElementStateReturn diff --git a/gst/videorate/gstvideorate.c b/gst/videorate/gstvideorate.c index 9dcebe71c0..7ade9fa277 100644 --- a/gst/videorate/gstvideorate.c +++ b/gst/videorate/gstvideorate.c @@ -414,8 +414,6 @@ gst_videorate_chain (GstPad * pad, GstBuffer * buffer) if (videorate->to_fps == 0) return GST_FLOW_NOT_NEGOTIATED; - GST_STREAM_LOCK (pad); - /* pull in 2 buffers */ if (videorate->prevbuf == NULL) { /* We're sure it's a GstBuffer here */ @@ -514,7 +512,6 @@ gst_videorate_chain (GstPad * pad, GstBuffer * buffer) videorate->prevbuf = buffer; } done: - GST_STREAM_UNLOCK (pad); return res; } diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index 21d8d4e45b..49cb72a6e4 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -318,29 +318,14 @@ gst_videotestsrc_activate (GstPad * pad, GstActivateMode mode) case GST_ACTIVATE_PULL: break; case GST_ACTIVATE_PUSH: - /* if we have a scheduler we can start the task */ - if (GST_ELEMENT_SCHEDULER (videotestsrc)) { - GST_STREAM_LOCK (pad); - GST_RPAD_TASK (pad) = - gst_scheduler_create_task (GST_ELEMENT_SCHEDULER (videotestsrc), - (GstTaskFunction) gst_videotestsrc_loop, pad); - - gst_task_start (GST_RPAD_TASK (pad)); - GST_STREAM_UNLOCK (pad); - result = TRUE; - } + result = gst_pad_start_task (pad, + (GstTaskFunction) gst_videotestsrc_loop, pad); break; case GST_ACTIVATE_NONE: /* step 1, unblock clock sync (if any) */ /* step 2, make sure streaming finishes */ - GST_STREAM_LOCK (pad); - /* step 3, stop the task */ - gst_task_stop (GST_RPAD_TASK (pad)); - gst_object_unref (GST_OBJECT (GST_RPAD_TASK (pad))); - GST_STREAM_UNLOCK (pad); - - result = TRUE; + result = gst_pad_stop_task (pad); break; default: result = FALSE; @@ -602,6 +587,7 @@ gst_videotestsrc_loop (GstPad * pad) GstVideotestsrc *videotestsrc; gulong newsize; GstBuffer *outbuf; + GstFlowReturn res; videotestsrc = GST_VIDEOTESTSRC (GST_PAD_PARENT (pad)); GST_LOG_OBJECT (videotestsrc, "get"); @@ -660,18 +646,11 @@ gst_videotestsrc_loop (GstPad * pad) GST_LOG_OBJECT (videotestsrc, "creating buffer of %ld bytes for %dx%d image", newsize, videotestsrc->width, videotestsrc->height); - outbuf = + res = gst_pad_alloc_buffer (pad, GST_BUFFER_OFFSET_NONE, newsize, - GST_RPAD_CAPS (pad)); - - if (GST_BUFFER_CAPS (outbuf) != GST_PAD_CAPS (pad)) { - if (!gst_pad_set_caps (pad, GST_BUFFER_CAPS (outbuf))) { - GST_ELEMENT_ERROR (videotestsrc, CORE, NEGOTIATION, (NULL), - ("format wasn't accepted")); - gst_pad_push_event (pad, gst_event_new (GST_EVENT_EOS)); - goto need_pause; - } - } + GST_PAD_CAPS (pad), &outbuf); + if (res != GST_FLOW_OK) + goto need_pause; videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (outbuf), videotestsrc->width, videotestsrc->height); @@ -695,7 +674,7 @@ gst_videotestsrc_loop (GstPad * pad) need_pause: { - gst_task_pause (GST_RPAD_TASK (pad)); + gst_task_pause (GST_PAD_TASK (pad)); } } diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index e9eda218ab..bf6babdcff 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -1088,12 +1088,8 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) /* if the caps contain pixel-aspect-ratio, they have to match ours, * otherwise linking should fail */ par = gst_structure_get_value (structure, "pixel-aspect-ratio"); - if (par) { - if (gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL) { - GST_INFO_OBJECT (ximagesink, "pixel aspect ratio does not match"); - return FALSE; - } - } + if (par && gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL) + goto wrong_aspect; /* Creating our window and our image */ g_assert (GST_VIDEOSINK_WIDTH (ximagesink) > 0); @@ -1123,6 +1119,14 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); return TRUE; + + /* ERRORS */ +wrong_aspect: + { + g_mutex_unlock (ximagesink->stream_lock); + GST_INFO_OBJECT (ximagesink, "pixel aspect ratio does not match"); + return FALSE; + } } static GstElementStateReturn @@ -1291,9 +1295,9 @@ gst_ximagesink_buffer_free (GstBuffer * buffer) } #endif -static GstBuffer * +static GstFlowReturn gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, - GstCaps * caps) + GstCaps * caps, GstBuffer ** buf) { GstXImageSink *ximagesink; GstXImageBuffer *ximage = NULL; @@ -1305,7 +1309,7 @@ gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, * we should not just reconfigure ourselves yet */ if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (ximagesink))) { if (!gst_ximagesink_setcaps (bsink, caps)) { - return NULL; + return GST_FLOW_NOT_NEGOTIATED; } } @@ -1342,7 +1346,9 @@ gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink)); } - return GST_BUFFER (ximage); + *buf = GST_BUFFER (ximage); + + return GST_FLOW_OK; } /* Interfaces stuff */ diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 2761b892fa..96d73c5719 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -1562,9 +1562,9 @@ gst_xvimagesink_buffer_free (GstBuffer * buffer) } #endif -static GstBuffer * +static GstFlowReturn gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, - GstCaps * caps) + GstCaps * caps, GstBuffer ** buf) { GstXvImageSink *xvimagesink; GstXvImageBuffer *xvimage = NULL; @@ -1575,7 +1575,7 @@ gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, * we should not just reconfigure ourselves yet */ if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (xvimagesink))) { if (!gst_xvimagesink_setcaps (bsink, caps)) { - return NULL; + return GST_FLOW_NOT_NEGOTIATED; } } @@ -1617,7 +1617,9 @@ gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, if (xvimage) { gst_buffer_set_caps (GST_BUFFER (xvimage), caps); } - return GST_BUFFER (xvimage); + *buf = GST_BUFFER (xvimage); + + return GST_FLOW_OK; } /* Interfaces stuff */