Cleanups and buffer alloc.

Original commit message from CVS:
* 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.
This commit is contained in:
Wim Taymans 2005-06-02 09:46:40 +00:00
parent 6a5293d065
commit 6db639089a
13 changed files with 162 additions and 113 deletions

View file

@ -1,3 +1,35 @@
2005-06-02 Wim Taymans <wim@fluendo.com>
* 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 <wim@fluendo.com> 2005-05-31 Wim Taymans <wim@fluendo.com>
* gst-libs/gst/audio/gstringbuffer.c: (gst_ringbuffer_delay): * gst-libs/gst/audio/gstringbuffer.c: (gst_ringbuffer_delay):

View file

@ -187,3 +187,31 @@ TODO
- use the OFFSET field in the GstBuffer to store/read the granulepos as - use the OFFSET field in the GstBuffer to store/read the granulepos as
opposed to the OFFSET_END field. 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

View file

@ -625,34 +625,18 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet)
if (pad->packetno == 0) { if (pad->packetno == 0) {
gst_ogg_pad_typefind (pad, packet); 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 */ /* stream packet to peer plugin */
if (pad->mode == GST_OGG_PAD_MODE_STREAMING) { if (pad->mode == GST_OGG_PAD_MODE_STREAMING) {
buf = ret =
gst_pad_alloc_buffer (GST_PAD (pad), GST_BUFFER_OFFSET_NONE, 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, GST_DEBUG_OBJECT (ogg,
"%p streaming to peer serial %08lx, packetno %lld", pad, pad->serialno, "%p streaming to peer serial %08lx, packetno %lld", pad, pad->serialno,
pad->packetno); pad->packetno);
if (buf) { if (ret == GST_FLOW_OK) {
memcpy (buf->data, packet->packet, packet->bytes); memcpy (buf->data, packet->packet, packet->bytes);
pad->offset = packet->granulepos; pad->offset = packet->granulepos;
@ -678,11 +662,8 @@ gst_ogg_pad_submit_packet (GstOggPad * pad, ogg_packet * packet)
} }
} else { } else {
/* initialize our internal decoder with packets */ /* initialize our internal decoder with packets */
if (!pad->elem_pad) { if (!pad->elem_pad)
GST_WARNING_OBJECT (ogg, goto no_decoder;
"pad %08lx does not have elem_pad, no decoder ?", pad);
return GST_FLOW_OK;
}
GST_DEBUG_OBJECT (ogg, GST_DEBUG_OBJECT (ogg,
"%p init decoder serial %08lx, packetno %lld", pad, pad->serialno, "%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); ret = gst_pad_chain (pad->elem_pad, buf);
} }
#if 0
done:
#endif
pad->packetno++; pad->packetno++;
return ret; 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 /* submit a page to an oggpad, this function will then submit all

View file

@ -473,8 +473,7 @@ gst_ogg_mux_buffer_from_page (GstOggMux * mux, ogg_page * page, gboolean delta)
GstBuffer *buffer; GstBuffer *buffer;
/* allocate space for header and body */ /* allocate space for header and body */
buffer = gst_pad_alloc_buffer (mux->srcpad, GST_BUFFER_OFFSET_NONE, buffer = gst_buffer_new_and_alloc (page->header_len + page->body_len);
page->header_len + page->body_len, NULL);
memcpy (GST_BUFFER_DATA (buffer), page->header, page->header_len); memcpy (GST_BUFFER_DATA (buffer), page->header, page->header_len);
memcpy (GST_BUFFER_DATA (buffer) + page->header_len, memcpy (GST_BUFFER_DATA (buffer) + page->header_len,
page->body, page->body_len); page->body, page->body_len);

View file

@ -825,16 +825,16 @@ theora_handle_data_packet (GstTheoraDec * dec, ogg_packet * packet,
/* now copy over the area contained in offset_x,offset_y, /* now copy over the area contained in offset_x,offset_y,
* frame_width, frame_height */ * frame_width, frame_height */
out = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, out_size, result = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET_NONE, out_size,
GST_PAD_CAPS (dec->srcpad)); GST_PAD_CAPS (dec->srcpad), &out);
if (out == NULL) if (result != GST_FLOW_OK)
goto no_buffer; goto no_buffer;
/* copy the visible region to the destination. This is actually pretty /* copy the visible region to the destination. This is actually pretty
* complicated and gstreamer doesn't support all the needed caps to do this * 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 * 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. * 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). * offset or size is odd (see above).
*/ */
{ {

View file

@ -365,9 +365,13 @@ theora_buffer_from_packet (GstTheoraEnc * enc, ogg_packet * packet,
GstClockTime timestamp, GstClockTime duration) GstClockTime timestamp, GstClockTime duration)
{ {
GstBuffer *buf; 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); memcpy (GST_BUFFER_DATA (buf), packet->packet, packet->bytes);
GST_BUFFER_OFFSET (buf) = enc->bytes_out; GST_BUFFER_OFFSET (buf) = enc->bytes_out;
GST_BUFFER_OFFSET_END (buf) = packet->granulepos; GST_BUFFER_OFFSET_END (buf) = packet->granulepos;
@ -381,10 +385,14 @@ theora_buffer_from_packet (GstTheoraEnc * enc, ogg_packet * packet,
} else { } else {
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
} }
enc->packetno++; enc->packetno++;
return buf; return buf;
no_buffer:
{
return NULL;
}
} }
/* push out the buffer and do internal bookkeeping */ /* 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); in_time = GST_BUFFER_TIMESTAMP (buffer);
GST_STREAM_LOCK (pad);
/* no packets written yet, setup headers */ /* no packets written yet, setup headers */
if (enc->packetno == 0) { if (enc->packetno == 0) {
GstCaps *caps; GstCaps *caps;
@ -576,8 +582,11 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer)
dst_y_stride = enc->info_width; dst_y_stride = enc->info_width;
dst_uv_stride = enc->info_width / 2; dst_uv_stride = enc->info_width / 2;
newbuf = gst_pad_alloc_buffer (enc->srcpad, ret = gst_pad_alloc_buffer (enc->srcpad,
GST_BUFFER_OFFSET_NONE, y_size * 3 / 2, GST_PAD_CAPS (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_y = yuv.y = (guint8 *) GST_BUFFER_DATA (newbuf);
dest_u = yuv.u = yuv.y + y_size; dest_u = yuv.u = yuv.y + y_size;
@ -681,7 +690,6 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer)
} }
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
} }
GST_STREAM_UNLOCK (pad);
return ret; return ret;
@ -689,13 +697,16 @@ theora_enc_chain (GstPad * pad, GstBuffer * buffer)
header_push: header_push:
{ {
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
GST_STREAM_UNLOCK (pad); return ret;
}
no_buffer:
{
gst_buffer_unref (buffer);
return ret; return ret;
} }
data_push: data_push:
{ {
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
GST_STREAM_UNLOCK (pad);
return ret; return ret;
} }
} }

View file

@ -662,11 +662,11 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
if (sample_count > 0) { if (sample_count > 0) {
GstBuffer *out; 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), 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); float *out_data = (float *) GST_BUFFER_DATA (out);
copy_samples (out_data, pcm, sample_count, vd->vi.channels); copy_samples (out_data, pcm, sample_count, vd->vi.channels);

View file

@ -299,6 +299,8 @@ buffer_frames_convert_chain (GstPad * pad, GstBuffer * buf)
gfloat *data_out; gfloat *data_out;
gint i, samples_in, samples_in_remaining, samples_out_remaining, gint i, samples_in, samples_in_remaining, samples_out_remaining,
out_buffer_samples; out_buffer_samples;
GstFlowReturn ret;
this = (BufferFramesConvert *) GST_OBJECT_PARENT (pad); this = (BufferFramesConvert *) GST_OBJECT_PARENT (pad);
@ -358,9 +360,13 @@ buffer_frames_convert_chain (GstPad * pad, GstBuffer * buf)
} else { } else {
/* otherwise make a leftover buffer if it's necessary */ /* otherwise make a leftover buffer if it's necessary */
if (samples_in_remaining) { if (samples_in_remaining) {
buf_out = ret =
gst_pad_alloc_buffer (this->srcpad, 0, 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); data_out = (gfloat *) GST_BUFFER_DATA (buf_out);
this->buf_out = buf_out; this->buf_out = buf_out;
this->samples_out_remaining = out_buffer_samples - samples_in_remaining; 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++); *(data_out++) = *(data_in++);
} }
} }
ret = GST_FLOW_OK;
done:
gst_buffer_unref (buf_in); gst_buffer_unref (buf_in);
return GST_FLOW_OK; return ret;
} }

View file

@ -98,8 +98,8 @@ static void gst_ffmpegcsp_set_property (GObject * object,
static void gst_ffmpegcsp_get_property (GObject * object, static void gst_ffmpegcsp_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec); guint prop_id, GValue * value, GParamSpec * pspec);
static GstBuffer *gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, static GstFlowReturn gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset,
guint size, GstCaps * caps); guint size, GstCaps * caps, GstBuffer ** buf);
static GstFlowReturn gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer);
static GstElementStateReturn gst_ffmpegcsp_change_state (GstElement * element); static GstElementStateReturn gst_ffmpegcsp_change_state (GstElement * element);
@ -385,22 +385,23 @@ gst_ffmpegcsp_init (GstFFMpegCsp * space)
space->palette = NULL; space->palette = NULL;
} }
static GstBuffer * static GstFlowReturn
gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, guint size, gst_ffmpegcsp_bufferalloc (GstPad * pad, guint64 offset, guint size,
GstCaps * caps) GstCaps * caps, GstBuffer ** buf)
{ {
GstBuffer *buf; GstFlowReturn ret;
GstFFMpegCsp *space; GstFFMpegCsp *space;
space = GST_FFMPEGCSP (GST_PAD_PARENT (pad)); space = GST_FFMPEGCSP (GST_PAD_PARENT (pad));
if ((space->from_pixfmt == space->to_pixfmt) && if ((space->from_pixfmt == space->to_pixfmt) &&
space->from_pixfmt != PIX_FMT_NB) { 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 { } else {
buf = NULL; *buf = NULL;
ret = GST_FLOW_OK;
} }
return buf; return ret;
} }
static GstFlowReturn static GstFlowReturn
@ -426,9 +427,9 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer)
avpicture_get_size (space->to_pixfmt, space->width, space->height); avpicture_get_size (space->to_pixfmt, space->width, space->height);
/* get buffer in prefered format, setcaps will be called when it is different */ /* 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, res = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, size,
space->src_prefered); space->src_prefered, &outbuf);
if (outbuf == NULL) if (res != GST_FLOW_OK)
goto no_buffer; goto no_buffer;
/* fill from from with source data */ /* fill from from with source data */
@ -452,6 +453,8 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer)
/* copy timestamps */ /* copy timestamps */
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer);
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (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 */ /* we don't need source anymore */
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
@ -462,11 +465,6 @@ gst_ffmpegcsp_chain (GstPad * pad, GstBuffer * buffer)
return res; return res;
/* ERRORS */ /* ERRORS */
no_buffer:
{
gst_buffer_unref (buffer);
return GST_FLOW_ERROR;
}
unkown_format: unkown_format:
{ {
GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL),
@ -474,6 +472,11 @@ unkown_format:
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
return GST_FLOW_NOT_NEGOTIATED; return GST_FLOW_NOT_NEGOTIATED;
} }
no_buffer:
{
gst_buffer_unref (buffer);
return res;
}
} }
static GstElementStateReturn static GstElementStateReturn

View file

@ -414,8 +414,6 @@ gst_videorate_chain (GstPad * pad, GstBuffer * buffer)
if (videorate->to_fps == 0) if (videorate->to_fps == 0)
return GST_FLOW_NOT_NEGOTIATED; return GST_FLOW_NOT_NEGOTIATED;
GST_STREAM_LOCK (pad);
/* pull in 2 buffers */ /* pull in 2 buffers */
if (videorate->prevbuf == NULL) { if (videorate->prevbuf == NULL) {
/* We're sure it's a GstBuffer here */ /* We're sure it's a GstBuffer here */
@ -514,7 +512,6 @@ gst_videorate_chain (GstPad * pad, GstBuffer * buffer)
videorate->prevbuf = buffer; videorate->prevbuf = buffer;
} }
done: done:
GST_STREAM_UNLOCK (pad);
return res; return res;
} }

View file

@ -318,29 +318,14 @@ gst_videotestsrc_activate (GstPad * pad, GstActivateMode mode)
case GST_ACTIVATE_PULL: case GST_ACTIVATE_PULL:
break; break;
case GST_ACTIVATE_PUSH: case GST_ACTIVATE_PUSH:
/* if we have a scheduler we can start the task */ result = gst_pad_start_task (pad,
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); (GstTaskFunction) gst_videotestsrc_loop, pad);
gst_task_start (GST_RPAD_TASK (pad));
GST_STREAM_UNLOCK (pad);
result = TRUE;
}
break; break;
case GST_ACTIVATE_NONE: case GST_ACTIVATE_NONE:
/* step 1, unblock clock sync (if any) */ /* step 1, unblock clock sync (if any) */
/* step 2, make sure streaming finishes */ /* step 2, make sure streaming finishes */
GST_STREAM_LOCK (pad); result = gst_pad_stop_task (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;
break; break;
default: default:
result = FALSE; result = FALSE;
@ -602,6 +587,7 @@ gst_videotestsrc_loop (GstPad * pad)
GstVideotestsrc *videotestsrc; GstVideotestsrc *videotestsrc;
gulong newsize; gulong newsize;
GstBuffer *outbuf; GstBuffer *outbuf;
GstFlowReturn res;
videotestsrc = GST_VIDEOTESTSRC (GST_PAD_PARENT (pad)); videotestsrc = GST_VIDEOTESTSRC (GST_PAD_PARENT (pad));
GST_LOG_OBJECT (videotestsrc, "get"); 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", GST_LOG_OBJECT (videotestsrc, "creating buffer of %ld bytes for %dx%d image",
newsize, videotestsrc->width, videotestsrc->height); newsize, videotestsrc->width, videotestsrc->height);
outbuf = res =
gst_pad_alloc_buffer (pad, GST_BUFFER_OFFSET_NONE, newsize, gst_pad_alloc_buffer (pad, GST_BUFFER_OFFSET_NONE, newsize,
GST_RPAD_CAPS (pad)); GST_PAD_CAPS (pad), &outbuf);
if (res != GST_FLOW_OK)
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; goto need_pause;
}
}
videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (outbuf), videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (outbuf),
videotestsrc->width, videotestsrc->height); videotestsrc->width, videotestsrc->height);
@ -695,7 +674,7 @@ gst_videotestsrc_loop (GstPad * pad)
need_pause: need_pause:
{ {
gst_task_pause (GST_RPAD_TASK (pad)); gst_task_pause (GST_PAD_TASK (pad));
} }
} }

View file

@ -1088,12 +1088,8 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
/* if the caps contain pixel-aspect-ratio, they have to match ours, /* if the caps contain pixel-aspect-ratio, they have to match ours,
* otherwise linking should fail */ * otherwise linking should fail */
par = gst_structure_get_value (structure, "pixel-aspect-ratio"); par = gst_structure_get_value (structure, "pixel-aspect-ratio");
if (par) { if (par && gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL)
if (gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL) { goto wrong_aspect;
GST_INFO_OBJECT (ximagesink, "pixel aspect ratio does not match");
return FALSE;
}
}
/* Creating our window and our image */ /* Creating our window and our image */
g_assert (GST_VIDEOSINK_WIDTH (ximagesink) > 0); 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)); GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink));
return TRUE; 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 static GstElementStateReturn
@ -1291,9 +1295,9 @@ gst_ximagesink_buffer_free (GstBuffer * buffer)
} }
#endif #endif
static GstBuffer * static GstFlowReturn
gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
GstCaps * caps) GstCaps * caps, GstBuffer ** buf)
{ {
GstXImageSink *ximagesink; GstXImageSink *ximagesink;
GstXImageBuffer *ximage = NULL; GstXImageBuffer *ximage = NULL;
@ -1305,7 +1309,7 @@ gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
* we should not just reconfigure ourselves yet */ * we should not just reconfigure ourselves yet */
if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (ximagesink))) { if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (ximagesink))) {
if (!gst_ximagesink_setcaps (bsink, caps)) { 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)); GST_VIDEOSINK_WIDTH (ximagesink), GST_VIDEOSINK_HEIGHT (ximagesink));
} }
return GST_BUFFER (ximage); *buf = GST_BUFFER (ximage);
return GST_FLOW_OK;
} }
/* Interfaces stuff */ /* Interfaces stuff */

View file

@ -1562,9 +1562,9 @@ gst_xvimagesink_buffer_free (GstBuffer * buffer)
} }
#endif #endif
static GstBuffer * static GstFlowReturn
gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
GstCaps * caps) GstCaps * caps, GstBuffer ** buf)
{ {
GstXvImageSink *xvimagesink; GstXvImageSink *xvimagesink;
GstXvImageBuffer *xvimage = NULL; GstXvImageBuffer *xvimage = NULL;
@ -1575,7 +1575,7 @@ gst_xvimagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
* we should not just reconfigure ourselves yet */ * we should not just reconfigure ourselves yet */
if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (xvimagesink))) { if (caps && caps != GST_PAD_CAPS (GST_VIDEOSINK_PAD (xvimagesink))) {
if (!gst_xvimagesink_setcaps (bsink, caps)) { 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) { if (xvimage) {
gst_buffer_set_caps (GST_BUFFER (xvimage), caps); gst_buffer_set_caps (GST_BUFFER (xvimage), caps);
} }
return GST_BUFFER (xvimage); *buf = GST_BUFFER (xvimage);
return GST_FLOW_OK;
} }
/* Interfaces stuff */ /* Interfaces stuff */