check/: Add extra tests for basetransform based components.

Original commit message from CVS:
* check/Makefile.am:
* check/pipelines/simple_launch_lines.c: (setup_pipeline),
(run_pipeline), (GST_START_TEST), (simple_launch_lines_suite):
Add extra tests for basetransform based components.
Comment out the test_element_negotiation test until we decide
if it's testing correct behaviour.
* ext/libvisual/visual.c: (gst_visual_init), (get_buffer),
(gst_visual_chain), (gst_visual_change_state):
Slightly more correct but still bogus timestamping.
Fix state change function.
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init):
* gst/audioresample/gstaudioresample.c:
* gst/ffmpegcolorspace/gstffmpegcolorspace.c:
(gst_ffmpegcsp_class_init):
* gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init),
(gst_videoscale_prepare_size), (gst_videoscale_set_caps),
(gst_videoscale_prepare_image):
* gst/volume/gstvolume.c: (gst_volume_class_init),
(volume_transform_ip):
Basetransform updates. Enable passthrough modes.
* sys/ximage/ximagesink.c: (gst_ximage_buffer_init),
(gst_ximagesink_renegotiate_size), (gst_ximagesink_xcontext_get),
(gst_ximagesink_setcaps), (gst_ximagesink_buffer_alloc):
Negotiation fix that allows the window to return to the original
size and renegotiate passthrough upstream. Extra debug output.
This commit is contained in:
Jan Schmidt 2005-09-09 17:53:47 +00:00
parent 09c75de7cc
commit 0f4fa24d8e
12 changed files with 206 additions and 60 deletions

View file

@ -1,3 +1,32 @@
2005-09-09 Jan Schmidt <thaytan@mad.scientist.com>
* check/Makefile.am:
* check/pipelines/simple_launch_lines.c: (setup_pipeline),
(run_pipeline), (GST_START_TEST), (simple_launch_lines_suite):
Add extra tests for basetransform based components.
Comment out the test_element_negotiation test until we decide
if it's testing correct behaviour.
* ext/libvisual/visual.c: (gst_visual_init), (get_buffer),
(gst_visual_chain), (gst_visual_change_state):
Slightly more correct but still bogus timestamping.
Fix state change function.
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init):
* gst/audioresample/gstaudioresample.c:
* gst/ffmpegcolorspace/gstffmpegcolorspace.c:
(gst_ffmpegcsp_class_init):
* gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init),
(gst_videoscale_prepare_size), (gst_videoscale_set_caps),
(gst_videoscale_prepare_image):
* gst/volume/gstvolume.c: (gst_volume_class_init),
(volume_transform_ip):
Basetransform updates. Enable passthrough modes.
* sys/ximage/ximagesink.c: (gst_ximage_buffer_init),
(gst_ximagesink_renegotiate_size), (gst_ximagesink_xcontext_get),
(gst_ximagesink_setcaps), (gst_ximagesink_buffer_alloc):
Negotiation fix that allows the window to return to the original
size and renegotiate passthrough upstream. Extra debug output.
2005-09-09 Thomas Vander Stichele <thomas at apestaart dot org> 2005-09-09 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/sine/gstsinesrc.c: * gst/sine/gstsinesrc.c:

View file

@ -33,13 +33,12 @@ check_PROGRAMS = \
elements/audioconvert \ elements/audioconvert \
elements/audioresample \ elements/audioresample \
elements/volume \ elements/volume \
pipelines/simple_launch_lines \
$(check_vorbis) $(check_vorbis)
# these tests don't even pass # these tests don't even pass
# generic/states: elements need state fixin' before this can be added # generic/states: elements need state fixin' before this can be added
# pipelines/simple_launch_lines: needs negotioation fixing
noinst_PROGRAMS = \ noinst_PROGRAMS = \
pipelines/simple_launch_lines \
generic/states generic/states
AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS)

View file

@ -24,7 +24,7 @@
static GstElement * static GstElement *
setup_pipeline (gchar * pipe_descr) setup_pipeline (const gchar * pipe_descr)
{ {
GstElement *pipeline; GstElement *pipeline;
@ -43,7 +43,7 @@ setup_pipeline (gchar * pipe_descr)
* the poll call will time out after half a second. * the poll call will time out after half a second.
*/ */
static void static void
run_pipeline (GstElement * pipe, gchar * descr, run_pipeline (GstElement * pipe, const gchar * descr,
GstMessageType events, GstMessageType tevent) GstMessageType events, GstMessageType tevent)
{ {
GstBus *bus; GstBus *bus;
@ -100,8 +100,44 @@ GST_START_TEST (test_element_negotiation)
GST_MESSAGE_UNKNOWN); GST_MESSAGE_UNKNOWN);
#endif #endif
} }
GST_END_TEST Suite *
simple_launch_lines_suite (void) GST_END_TEST
GST_START_TEST (test_basetransform_based)
{
/* Each of these tests is to check whether various basetransform based elements can
* select output caps when not allowed to do passthrough and going to a generic sink
* such as fakesink or filesink */
const gchar *s;
/* Check that videoscale can pick a height given only a width */
s = "videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "videoscale ! video/x-raw-yuv,width=640 ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Test that ffmpegcolorspace can pick an output format that isn't passthrough without
* completely specified output caps */
s = "videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "ffmpegcolorspace ! video/x-raw-rgb ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Check that audioresample can pick a samplerate to use from a
* range that doesn't include the input */
s = "sinesrc ! audio/x-raw-int,width=16,depth=16,rate=8000 ! audioresample ! "
"audio/x-raw-int,rate=[16000,48000] ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Check that audioconvert can pick a depth to use, given a width */
s = "sinesrc ! audio/x-raw-int,width=16,depth=16 ! audioconvert ! "
"audio/x-raw-int,width=32 ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
}
GST_END_TEST Suite * simple_launch_lines_suite (void)
{ {
Suite *s = suite_create ("Pipelines"); Suite *s = suite_create ("Pipelines");
TCase *tc_chain = tcase_create ("linear"); TCase *tc_chain = tcase_create ("linear");
@ -110,7 +146,8 @@ simple_launch_lines_suite (void)
tcase_set_timeout (tc_chain, 20); tcase_set_timeout (tc_chain, 20);
suite_add_tcase (s, tc_chain); suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_element_negotiation); // tcase_add_test (tc_chain, test_element_negotiation);
tcase_add_test (tc_chain, test_basetransform_based);
return s; return s;
} }

View file

@ -47,6 +47,7 @@ struct _GstVisual
/* pads */ /* pads */
GstPad *sinkpad; GstPad *sinkpad;
GstPad *srcpad; GstPad *srcpad;
GstClockTime next_ts;
/* libvisual stuff */ /* libvisual stuff */
VisAudio audio; VisAudio audio;
@ -210,6 +211,7 @@ gst_visual_init (GstVisual * visual)
gst_pad_set_getcaps_function (visual->srcpad, gst_visual_getcaps); gst_pad_set_getcaps_function (visual->srcpad, gst_visual_getcaps);
gst_element_add_pad (GST_ELEMENT (visual), visual->srcpad); gst_element_add_pad (GST_ELEMENT (visual), visual->srcpad);
visual->next_ts = 0;
visual->adapter = gst_adapter_new (); visual->adapter = gst_adapter_new ();
} }
@ -369,6 +371,9 @@ get_buffer (GstVisual * visual, GstBuffer ** outbuf)
visual->video->bpp, GST_PAD_CAPS (visual->srcpad), outbuf); visual->video->bpp, GST_PAD_CAPS (visual->srcpad), outbuf);
} }
if (*outbuf == NULL)
return GST_FLOW_ERROR;
return GST_FLOW_OK; return GST_FLOW_OK;
} }
@ -391,6 +396,9 @@ gst_visual_chain (GstPad * pad, GstBuffer * buffer)
} }
} }
if (GST_BUFFER_TIMESTAMP (buffer) != GST_CLOCK_TIME_NONE)
visual->next_ts = GST_BUFFER_TIMESTAMP (buffer);
/* spf = samples per frame */ /* spf = samples per frame */
spf = visual->rate / visual->fps; spf = visual->rate / visual->fps;
gst_adapter_push (visual->adapter, buffer); gst_adapter_push (visual->adapter, buffer);
@ -419,9 +427,9 @@ gst_visual_chain (GstPad * pad, GstBuffer * buffer)
visual_actor_run (visual->actor, &visual->audio); visual_actor_run (visual->actor, &visual->audio);
/* FIXME: Match timestamps from the incoming audio */ /* FIXME: Match timestamps from the incoming audio */
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (outbuf) = visual->next_ts;
GST_SECOND * visual->count++ / visual->fps;
GST_BUFFER_DURATION (outbuf) = GST_SECOND / visual->fps; GST_BUFFER_DURATION (outbuf) = GST_SECOND / visual->fps;
visual->next_ts += GST_BUFFER_DURATION (outbuf);
ret = gst_pad_push (visual->srcpad, outbuf); ret = gst_pad_push (visual->srcpad, outbuf);
outbuf = NULL; outbuf = NULL;
} }
@ -449,6 +457,7 @@ static GstStateChangeReturn
gst_visual_change_state (GstElement * element, GstStateChange transition) gst_visual_change_state (GstElement * element, GstStateChange transition)
{ {
GstVisual *visual = GST_VISUAL (element); GstVisual *visual = GST_VISUAL (element);
GstStateChangeReturn ret;
switch (transition) { switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_NULL_TO_READY:
@ -469,13 +478,20 @@ gst_visual_change_state (GstElement * element, GstStateChange transition)
break; break;
case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_adapter_clear (visual->adapter); gst_adapter_clear (visual->adapter);
visual->count = 0;
break; break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING: case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
break; break;
default:
break;
}
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
switch (transition) {
case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
break; break;
case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_PAUSED_TO_READY:
visual->next_ts = 0;
break; break;
case GST_STATE_CHANGE_READY_TO_NULL: case GST_STATE_CHANGE_READY_TO_NULL:
if (visual->actor) if (visual->actor)
@ -489,10 +505,7 @@ gst_visual_change_state (GstElement * element, GstStateChange transition)
break; break;
} }
if (GST_ELEMENT_CLASS (parent_class)->change_state) return ret;
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
return GST_STATE_CHANGE_SUCCESS;
} }
static void static void

View file

@ -191,6 +191,8 @@ gst_audio_convert_class_init (GstAudioConvertClass * klass)
GST_DEBUG_FUNCPTR (gst_audio_convert_transform_ip); GST_DEBUG_FUNCPTR (gst_audio_convert_transform_ip);
GST_BASE_TRANSFORM_CLASS (klass)->transform = GST_BASE_TRANSFORM_CLASS (klass)->transform =
GST_DEBUG_FUNCPTR (gst_audio_convert_transform); GST_DEBUG_FUNCPTR (gst_audio_convert_transform);
GST_BASE_TRANSFORM_CLASS (klass)->passthrough_on_same_caps = TRUE;
} }
static void static void

View file

@ -145,6 +145,8 @@ static void gst_audioresample_class_init (GstAudioresampleClass * klass)
GST_DEBUG_FUNCPTR (audioresample_set_caps); GST_DEBUG_FUNCPTR (audioresample_set_caps);
GST_BASE_TRANSFORM_CLASS (klass)->transform = GST_BASE_TRANSFORM_CLASS (klass)->transform =
GST_DEBUG_FUNCPTR (audioresample_transform); GST_DEBUG_FUNCPTR (audioresample_transform);
GST_BASE_TRANSFORM_CLASS (klass)->passthrough_on_same_caps = TRUE;
} }
static void gst_audioresample_init (GstAudioresample * audioresample, static void gst_audioresample_init (GstAudioresample * audioresample,

View file

@ -95,8 +95,10 @@ static gboolean gst_ffmpegcsp_get_unit_size (GstBaseTransform * btrans,
GstCaps * caps, guint * size); GstCaps * caps, guint * size);
static GstFlowReturn gst_ffmpegcsp_transform (GstBaseTransform * btrans, static GstFlowReturn gst_ffmpegcsp_transform (GstBaseTransform * btrans,
GstBuffer * inbuf, GstBuffer * outbuf); GstBuffer * inbuf, GstBuffer * outbuf);
#if 0
static GstFlowReturn gst_ffmpegcsp_transform_ip (GstBaseTransform * btrans, static GstFlowReturn gst_ffmpegcsp_transform_ip (GstBaseTransform * btrans,
GstBuffer * inbuf); GstBuffer * inbuf);
#endif
static GstPadTemplate *sinktempl, *srctempl; static GstPadTemplate *sinktempl, *srctempl;
static GstElementClass *parent_class = NULL; static GstElementClass *parent_class = NULL;
@ -301,8 +303,12 @@ gst_ffmpegcsp_class_init (GstFFMpegCspClass * klass)
GST_DEBUG_FUNCPTR (gst_ffmpegcsp_get_unit_size); GST_DEBUG_FUNCPTR (gst_ffmpegcsp_get_unit_size);
gstbasetransform_class->transform = gstbasetransform_class->transform =
GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform); GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform);
#if 0
gstbasetransform_class->transform_ip = gstbasetransform_class->transform_ip =
GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform_ip); GST_DEBUG_FUNCPTR (gst_ffmpegcsp_transform_ip);
#endif
gstbasetransform_class->passthrough_on_same_caps = TRUE;
GST_DEBUG_CATEGORY_INIT (ffmpegcolorspace_debug, "ffmpegcolorspace", 0, GST_DEBUG_CATEGORY_INIT (ffmpegcolorspace_debug, "ffmpegcolorspace", 0,
"FFMPEG-based colorspace converter"); "FFMPEG-based colorspace converter");
@ -334,12 +340,15 @@ gst_ffmpegcsp_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
return TRUE; return TRUE;
} }
#if 0
/* FIXME: Could use transform_ip to implement endianness swap type operations */
static GstFlowReturn static GstFlowReturn
gst_ffmpegcsp_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf) gst_ffmpegcsp_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf)
{ {
/* do nothing */ /* do nothing */
return GST_FLOW_OK; return GST_FLOW_OK;
} }
#endif
static GstFlowReturn static GstFlowReturn
gst_ffmpegcsp_transform (GstBaseTransform * btrans, GstBuffer * inbuf, gst_ffmpegcsp_transform (GstBaseTransform * btrans, GstBuffer * inbuf,

View file

@ -151,8 +151,6 @@ static gboolean gst_videoscale_set_caps (GstBaseTransform * trans,
GstCaps * in, GstCaps * out); GstCaps * in, GstCaps * out);
static gboolean gst_videoscale_get_unit_size (GstBaseTransform * trans, static gboolean gst_videoscale_get_unit_size (GstBaseTransform * trans,
GstCaps * caps, guint * size); GstCaps * caps, guint * size);
static GstFlowReturn gst_videoscale_transform_ip (GstBaseTransform * trans,
GstBuffer * in);
static GstFlowReturn gst_videoscale_transform (GstBaseTransform * trans, static GstFlowReturn gst_videoscale_transform (GstBaseTransform * trans,
GstBuffer * in, GstBuffer * out); GstBuffer * in, GstBuffer * out);
@ -221,9 +219,10 @@ gst_videoscale_class_init (GstVideoscaleClass * klass)
trans_class->transform_caps = gst_videoscale_transform_caps; trans_class->transform_caps = gst_videoscale_transform_caps;
trans_class->set_caps = gst_videoscale_set_caps; trans_class->set_caps = gst_videoscale_set_caps;
trans_class->get_unit_size = gst_videoscale_get_unit_size; trans_class->get_unit_size = gst_videoscale_get_unit_size;
trans_class->transform_ip = gst_videoscale_transform_ip;
trans_class->transform = gst_videoscale_transform; trans_class->transform = gst_videoscale_transform;
trans_class->passthrough_on_same_caps = TRUE;
parent_class = g_type_class_peek_parent (klass); parent_class = g_type_class_peek_parent (klass);
} }
@ -317,10 +316,6 @@ gst_videoscale_get_format (GstCaps * caps)
return -1; return -1;
} }
#define ROUND_UP_2(x) (((x)+1)&~1)
#define ROUND_UP_4(x) (((x)+3)&~3)
#define ROUND_UP_8(x) (((x)+7)&~7)
/* calculate the size of a buffer */ /* calculate the size of a buffer */
static gboolean static gboolean
gst_videoscale_prepare_size (gint format, gst_videoscale_prepare_size (gint format,
@ -342,17 +337,17 @@ gst_videoscale_prepare_size (gint format,
break; break;
case GST_VIDEOSCALE_RGB: case GST_VIDEOSCALE_RGB:
case GST_VIDEOSCALE_BGR: case GST_VIDEOSCALE_BGR:
img->stride = ROUND_UP_4 (img->width * 3); img->stride = GST_ROUND_UP_4 (img->width * 3);
*size = img->stride * img->height; *size = img->stride * img->height;
break; break;
case GST_VIDEOSCALE_YUY2: case GST_VIDEOSCALE_YUY2:
case GST_VIDEOSCALE_YVYU: case GST_VIDEOSCALE_YVYU:
case GST_VIDEOSCALE_UYVY: case GST_VIDEOSCALE_UYVY:
img->stride = ROUND_UP_4 (img->width * 2); img->stride = GST_ROUND_UP_4 (img->width * 2);
*size = img->stride * img->height; *size = img->stride * img->height;
break; break;
case GST_VIDEOSCALE_Y: case GST_VIDEOSCALE_Y:
img->stride = ROUND_UP_4 (img->width); img->stride = GST_ROUND_UP_4 (img->width);
*size = img->stride * img->height; *size = img->stride * img->height;
break; break;
case GST_VIDEOSCALE_I420: case GST_VIDEOSCALE_I420:
@ -360,21 +355,21 @@ gst_videoscale_prepare_size (gint format,
{ {
gulong img_u_stride, img_u_height; gulong img_u_stride, img_u_height;
img->stride = ROUND_UP_4 (img->width); img->stride = GST_ROUND_UP_4 (img->width);
img_u_height = ROUND_UP_2 (img->height) / 2; img_u_height = GST_ROUND_UP_2 (img->height) / 2;
img_u_stride = ROUND_UP_4 (img->stride / 2); img_u_stride = GST_ROUND_UP_4 (img->stride / 2);
*size = img->stride * ROUND_UP_2 (img->height) + *size = img->stride * GST_ROUND_UP_2 (img->height) +
2 * img_u_stride * img_u_height; 2 * img_u_stride * img_u_height;
break; break;
} }
case GST_VIDEOSCALE_RGB565: case GST_VIDEOSCALE_RGB565:
img->stride = ROUND_UP_4 (img->width * 2); img->stride = GST_ROUND_UP_4 (img->width * 2);
*size = img->stride * img->height; *size = img->stride * img->height;
break; break;
case GST_VIDEOSCALE_RGB555: case GST_VIDEOSCALE_RGB555:
img->stride = ROUND_UP_4 (img->width * 2); img->stride = GST_ROUND_UP_4 (img->width * 2);
*size = img->stride * img->height; *size = img->stride * img->height;
break; break;
default: default:
@ -436,6 +431,7 @@ gst_videoscale_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
GST_DEBUG_OBJECT (videoscale, "from=%dx%d, size %d -> to=%dx%d, size %d", GST_DEBUG_OBJECT (videoscale, "from=%dx%d, size %d -> to=%dx%d, size %d",
videoscale->from_width, videoscale->from_height, videoscale->src_size, videoscale->from_width, videoscale->from_height, videoscale->src_size,
videoscale->to_width, videoscale->to_height, videoscale->dest_size); videoscale->to_width, videoscale->to_height, videoscale->dest_size);
done: done:
return ret; return ret;
} }
@ -472,10 +468,10 @@ gst_videoscale_prepare_image (gint format, GstBuffer * buf,
switch (format) { switch (format) {
case GST_VIDEOSCALE_I420: case GST_VIDEOSCALE_I420:
case GST_VIDEOSCALE_YV12: case GST_VIDEOSCALE_YV12:
img_u->pixels = img->pixels + ROUND_UP_2 (img->height) * img->stride; img_u->pixels = img->pixels + GST_ROUND_UP_2 (img->height) * img->stride;
img_u->height = ROUND_UP_2 (img->height) / 2; img_u->height = GST_ROUND_UP_2 (img->height) / 2;
img_u->width = ROUND_UP_2 (img->width) / 2; img_u->width = GST_ROUND_UP_2 (img->width) / 2;
img_u->stride = ROUND_UP_4 (img->stride / 2); img_u->stride = GST_ROUND_UP_4 (img->stride / 2);
memcpy (img_v, img_u, sizeof (*img_v)); memcpy (img_v, img_u, sizeof (*img_v));
img_v->pixels = img_u->pixels + img_u->height * img_u->stride; img_v->pixels = img_u->pixels + img_u->height * img_u->stride;
break; break;
@ -485,13 +481,6 @@ gst_videoscale_prepare_image (gint format, GstBuffer * buf,
return res; return res;
} }
static GstFlowReturn
gst_videoscale_transform_ip (GstBaseTransform * trans, GstBuffer * in)
{
/* nothing to be done in passthrough */
return GST_FLOW_OK;
}
static GstFlowReturn static GstFlowReturn
gst_videoscale_transform (GstBaseTransform * trans, GstBuffer * in, gst_videoscale_transform (GstBaseTransform * trans, GstBuffer * in,
GstBuffer * out) GstBuffer * out)

View file

@ -134,8 +134,8 @@ static void volume_get_property (GObject * object, guint prop_id,
static void volume_update_volume (const GValue * value, gpointer data); static void volume_update_volume (const GValue * value, gpointer data);
static void volume_update_mute (const GValue * value, gpointer data); static void volume_update_mute (const GValue * value, gpointer data);
static GstFlowReturn volume_transform (GstBaseTransform * base, static GstFlowReturn volume_transform_ip (GstBaseTransform * base,
GstBuffer * inbuf, GstBuffer * outbuf); GstBuffer * outbuf);
static gboolean volume_set_caps (GstBaseTransform * base, GstCaps * incaps, static gboolean volume_set_caps (GstBaseTransform * base, GstCaps * incaps,
GstCaps * outcaps); GstCaps * outcaps);
@ -276,8 +276,8 @@ gst_volume_class_init (GstVolumeClass * klass)
0.0, VOLUME_MAX_DOUBLE, 1.0, 0.0, VOLUME_MAX_DOUBLE, 1.0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
GST_BASE_TRANSFORM_CLASS (klass)->transform = GST_BASE_TRANSFORM_CLASS (klass)->transform_ip =
GST_DEBUG_FUNCPTR (volume_transform); GST_DEBUG_FUNCPTR (volume_transform_ip);
GST_BASE_TRANSFORM_CLASS (klass)->set_caps = GST_BASE_TRANSFORM_CLASS (klass)->set_caps =
GST_DEBUG_FUNCPTR (volume_set_caps); GST_DEBUG_FUNCPTR (volume_set_caps);
} }
@ -390,8 +390,7 @@ volume_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps)
* a class-global method * a class-global method
*/ */
static GstFlowReturn static GstFlowReturn
volume_transform (GstBaseTransform * base, GstBuffer * inbuf, volume_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
GstBuffer * outbuf)
{ {
GstVolume *this = GST_VOLUME (base); GstVolume *this = GST_VOLUME (base);

View file

@ -635,6 +635,11 @@ gst_ximagesink_renegotiate_size (GstXImageSink * ximagesink)
GST_VIDEO_SINK_HEIGHT (ximagesink) != ximagesink->xwindow->height) { GST_VIDEO_SINK_HEIGHT (ximagesink) != ximagesink->xwindow->height) {
GstCaps *caps; GstCaps *caps;
GST_DEBUG_OBJECT (ximagesink,
"Window changed size to %dx%d from %dx%d. Setting desired caps",
ximagesink->xwindow->width, ximagesink->xwindow->height,
GST_VIDEO_SINK_WIDTH (ximagesink), GST_VIDEO_SINK_HEIGHT (ximagesink));
caps = gst_caps_new_simple ("video/x-raw-rgb", caps = gst_caps_new_simple ("video/x-raw-rgb",
"bpp", G_TYPE_INT, ximagesink->xcontext->bpp, "bpp", G_TYPE_INT, ximagesink->xcontext->bpp,
"depth", G_TYPE_INT, ximagesink->xcontext->depth, "depth", G_TYPE_INT, ximagesink->xcontext->depth,
@ -1049,6 +1054,7 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
gboolean ret = TRUE; gboolean ret = TRUE;
GstStructure *structure; GstStructure *structure;
const GValue *par; const GValue *par;
gint new_width, new_height;
ximagesink = GST_XIMAGESINK (bsink); ximagesink = GST_XIMAGESINK (bsink);
@ -1060,12 +1066,25 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
GST_PTR_FORMAT, ximagesink->xcontext->caps, caps); GST_PTR_FORMAT, ximagesink->xcontext->caps, caps);
structure = gst_caps_get_structure (caps, 0); structure = gst_caps_get_structure (caps, 0);
/* We used to only get the new width and height if we don't
* yet have one, which means GST_VIDEO_SINK_WIDTH/HEIGHT never change
* after the first buffer, which seems totally bogus. I don't understand
* why it might have been this way...
*/
#if 0
if (GST_VIDEO_SINK_WIDTH (ximagesink) == 0) { if (GST_VIDEO_SINK_WIDTH (ximagesink) == 0) {
ret &= gst_structure_get_int (structure, "width", ret &= gst_structure_get_int (structure, "width", &new_width);
&(GST_VIDEO_SINK_WIDTH (ximagesink))); ret &= gst_structure_get_int (structure, "height", &new_height);
ret &= gst_structure_get_int (structure, "height", } else {
&(GST_VIDEO_SINK_HEIGHT (ximagesink))); new_width = GST_VIDEO_SINK_WIDTH (ximagesink);
new_height = GST_VIDEO_SINK_HEIGHT (ximagesink);
} }
#else
ret &= gst_structure_get_int (structure, "width", &new_width);
ret &= gst_structure_get_int (structure, "height", &new_height);
#endif
ret &= gst_structure_get_double (structure, ret &= gst_structure_get_double (structure,
"framerate", &ximagesink->framerate); "framerate", &ximagesink->framerate);
if (!ret) if (!ret)
@ -1079,6 +1098,16 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
if (par && gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL) if (par && gst_value_compare (par, ximagesink->par) != GST_VALUE_EQUAL)
goto wrong_aspect; goto wrong_aspect;
if (GST_VIDEO_SINK_WIDTH (ximagesink) != new_width ||
GST_VIDEO_SINK_HEIGHT (ximagesink) != new_height) {
GST_DEBUG_OBJECT (ximagesink, "Input caps changed size %dx%d -> %dx%d",
GST_VIDEO_SINK_WIDTH (ximagesink), GST_VIDEO_SINK_HEIGHT (ximagesink),
new_width, new_height);
}
GST_VIDEO_SINK_WIDTH (ximagesink) = new_width;
GST_VIDEO_SINK_HEIGHT (ximagesink) = new_height;
/* Creating our window and our image */ /* Creating our window and our image */
g_assert (GST_VIDEO_SINK_WIDTH (ximagesink) > 0); g_assert (GST_VIDEO_SINK_WIDTH (ximagesink) > 0);
g_assert (GST_VIDEO_SINK_HEIGHT (ximagesink) > 0); g_assert (GST_VIDEO_SINK_HEIGHT (ximagesink) > 0);
@ -1349,9 +1378,11 @@ gst_ximagesink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
GST_DEBUG_OBJECT (ximagesink, "no usable image in pool, creating ximage"); GST_DEBUG_OBJECT (ximagesink, "no usable image in pool, creating ximage");
ximage = gst_ximagesink_ximage_new (ximagesink, width, height); ximage = gst_ximagesink_ximage_new (ximagesink, width, height);
if (ximagesink->desired_caps) if (ximagesink->desired_caps) {
GST_DEBUG_OBJECT (ximagesink, "Returning buffer with my desired caps %"
GST_PTR_FORMAT, ximagesink->desired_caps);
gst_buffer_set_caps (GST_BUFFER (ximage), ximagesink->desired_caps); gst_buffer_set_caps (GST_BUFFER (ximage), ximagesink->desired_caps);
else } else
/* fixme we have no guarantee that the ximage is actually of these caps, /* fixme we have no guarantee that the ximage is actually of these caps,
do we? */ do we? */
gst_buffer_set_caps (GST_BUFFER (ximage), caps); gst_buffer_set_caps (GST_BUFFER (ximage), caps);

View file

@ -33,13 +33,12 @@ check_PROGRAMS = \
elements/audioconvert \ elements/audioconvert \
elements/audioresample \ elements/audioresample \
elements/volume \ elements/volume \
pipelines/simple_launch_lines \
$(check_vorbis) $(check_vorbis)
# these tests don't even pass # these tests don't even pass
# generic/states: elements need state fixin' before this can be added # generic/states: elements need state fixin' before this can be added
# pipelines/simple_launch_lines: needs negotioation fixing
noinst_PROGRAMS = \ noinst_PROGRAMS = \
pipelines/simple_launch_lines \
generic/states generic/states
AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS)

View file

@ -24,7 +24,7 @@
static GstElement * static GstElement *
setup_pipeline (gchar * pipe_descr) setup_pipeline (const gchar * pipe_descr)
{ {
GstElement *pipeline; GstElement *pipeline;
@ -43,7 +43,7 @@ setup_pipeline (gchar * pipe_descr)
* the poll call will time out after half a second. * the poll call will time out after half a second.
*/ */
static void static void
run_pipeline (GstElement * pipe, gchar * descr, run_pipeline (GstElement * pipe, const gchar * descr,
GstMessageType events, GstMessageType tevent) GstMessageType events, GstMessageType tevent)
{ {
GstBus *bus; GstBus *bus;
@ -100,8 +100,44 @@ GST_START_TEST (test_element_negotiation)
GST_MESSAGE_UNKNOWN); GST_MESSAGE_UNKNOWN);
#endif #endif
} }
GST_END_TEST Suite *
simple_launch_lines_suite (void) GST_END_TEST
GST_START_TEST (test_basetransform_based)
{
/* Each of these tests is to check whether various basetransform based elements can
* select output caps when not allowed to do passthrough and going to a generic sink
* such as fakesink or filesink */
const gchar *s;
/* Check that videoscale can pick a height given only a width */
s = "videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "videoscale ! video/x-raw-yuv,width=640 ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Test that ffmpegcolorspace can pick an output format that isn't passthrough without
* completely specified output caps */
s = "videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "ffmpegcolorspace ! video/x-raw-rgb ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Check that audioresample can pick a samplerate to use from a
* range that doesn't include the input */
s = "sinesrc ! audio/x-raw-int,width=16,depth=16,rate=8000 ! audioresample ! "
"audio/x-raw-int,rate=[16000,48000] ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
/* Check that audioconvert can pick a depth to use, given a width */
s = "sinesrc ! audio/x-raw-int,width=16,depth=16 ! audioconvert ! "
"audio/x-raw-int,width=32 ! fakesink";
run_pipeline (setup_pipeline (s), s,
GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING),
GST_MESSAGE_UNKNOWN);
}
GST_END_TEST Suite * simple_launch_lines_suite (void)
{ {
Suite *s = suite_create ("Pipelines"); Suite *s = suite_create ("Pipelines");
TCase *tc_chain = tcase_create ("linear"); TCase *tc_chain = tcase_create ("linear");
@ -110,7 +146,8 @@ simple_launch_lines_suite (void)
tcase_set_timeout (tc_chain, 20); tcase_set_timeout (tc_chain, 20);
suite_add_tcase (s, tc_chain); suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_element_negotiation); // tcase_add_test (tc_chain, test_element_negotiation);
tcase_add_test (tc_chain, test_basetransform_based);
return s; return s;
} }