[Spice-devel] [PATCH spice-server v2 5/6] Compatibility for GStreamer 0.10 for test utility
Frediano Ziglio
fziglio at redhat.com
Fri Oct 21 12:40:39 UTC 2016
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/tests/gst-test.c | 55 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 51 insertions(+), 4 deletions(-)
diff --git a/server/tests/gst-test.c b/server/tests/gst-test.c
index 0a68d7d..38d0f1d 100644
--- a/server/tests/gst-test.c
+++ b/server/tests/gst-test.c
@@ -54,6 +54,37 @@ typedef struct {
SpiceBitmap *bitmap;
} TestFrame;
+#ifdef HAVE_GSTREAMER_0_10
+
+#define VIDEOCONVERT "ffmpegcolorspace"
+#define BGRx_CAPS "caps=video/x-raw-rgb,bpp=32,depth=24,blue_mask=-16777216,green_mask=16711680,red_mask=65280"
+
+typedef GstBuffer GstSample;
+#define gst_sample_get_buffer(s) (s)
+#define gst_sample_get_caps(s) GST_BUFFER_CAPS(s)
+#define gst_sample_unref(s) gst_buffer_unref(s)
+#define gst_app_sink_pull_sample(s) gst_app_sink_pull_buffer(s)
+typedef struct {
+ uint8_t *data;
+} GstMapInfo;
+#define GST_MAP_READ 1
+static inline void
+gst_buffer_unmap(GstBuffer *buffer, GstMapInfo *mapinfo)
+{ }
+
+static inline gboolean
+gst_buffer_map(GstBuffer *buffer, GstMapInfo *mapinfo, int flags)
+{
+ mapinfo->data = GST_BUFFER_DATA(buffer);
+ return mapinfo->data != NULL;
+}
+#else
+#define VIDEOCONVERT "videoconvert"
+#define BGRx_CAPS "caps=video/x-raw,format=BGRx"
+#define gst_bus_set_sync_handler(bus, proc, param) \
+ gst_bus_set_sync_handler(bus, proc, param, NULL)
+#endif
+
typedef void (*SampleProc)(GstSample *sample, void *param);
typedef struct {
@@ -214,7 +245,11 @@ static const EncoderInfo encoder_infos[] = {
{ "gstreamer:vp8", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_VP8,
"caps=video/x-vp8 ! vp8dec" },
{ "gstreamer:h264", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_H264,
+#ifdef HAVE_GSTREAMER_0_10
"! h264parse ! avdec_h264" },
+#else
+ "! h264parse ! ffdec_h264" },
+#endif
{ NULL, NULL }
};
@@ -491,7 +526,7 @@ create_pipeline(const char *desc, SampleProc sample_proc, void *param)
gst_app_sink_set_callbacks(pipeline->appsink, &appsink_cbs, pipeline, NULL);
GstBus *bus = gst_element_get_bus(pipeline->gst_pipeline);
- gst_bus_set_sync_handler(bus, handle_pipeline_message, pipeline, NULL);
+ gst_bus_set_sync_handler(bus, handle_pipeline_message, pipeline);
gst_object_unref(bus);
if (gst_element_set_state(pipeline->gst_pipeline, GST_STATE_PLAYING) ==
@@ -508,7 +543,7 @@ create_output_pipeline(const EncoderInfo *encoder, SampleProc sample_proc, void
{
gchar *desc =
g_strdup_printf("appsrc name=src is-live=true format=time max-bytes=0 block=true "
- "%s ! videoconvert ! appsink name=sink caps=video/x-raw,format=BGRx"
+ "%s ! " VIDEOCONVERT " ! appsink name=sink " BGRx_CAPS
" sync=false drop=false", encoder->caps_dec);
TestPipeline *pipeline = create_pipeline(desc, sample_proc, param);
@@ -525,7 +560,7 @@ static void
create_input_pipeline(const char *input_pipeline_desc, SampleProc sample_proc, void *param)
{
gchar *desc =
- g_strdup_printf("%s ! appsink name=sink caps=video/x-raw,format=BGRx"
+ g_strdup_printf("%s ! appsink name=sink " BGRx_CAPS
" sync=false drop=false", input_pipeline_desc);
TestPipeline *pipeline = create_pipeline(desc, sample_proc, param);
@@ -548,14 +583,26 @@ video_buffer_release(VideoBuffer *video_buffer)
static void
pipeline_send_raw_data(TestPipeline *pipeline, VideoBuffer *video_buffer)
{
- GstBuffer *buffer =
+ GstBuffer *buffer;
+#ifdef HAVE_GSTREAMER_0_10
+ buffer = gst_buffer_new();
+
+ buffer->malloc_data = (void *) video_buffer;
+ GST_BUFFER_FREE_FUNC(buffer) = (void (*)(void *)) video_buffer_release;
+ GST_BUFFER_DATA(buffer) = video_buffer->data;
+ GST_BUFFER_SIZE(buffer) = video_buffer->size;
+#else
+ buffer =
gst_buffer_new_wrapped_full(GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS,
video_buffer->data, video_buffer->size,
0, video_buffer->size,
video_buffer, (void (*)(void*)) video_buffer_release);
+#endif
GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE;
+#ifndef HAVE_GSTREAMER_0_10
GST_BUFFER_DTS(buffer) = GST_CLOCK_TIME_NONE;
+#endif
if (gst_app_src_push_buffer(pipeline->appsrc, buffer) != GST_FLOW_OK) {
g_printerr("GStreamer error: unable to push frame of size %u\n", video_buffer->size);
--
2.7.4
More information about the Spice-devel
mailing list