Removed the old capsnego tests

Original commit message from CVS:
Removed the old capsnego tests
This commit is contained in:
Wim Taymans 2002-01-14 21:45:48 +00:00
parent f064c9f566
commit 5c10feaf48
16 changed files with 4 additions and 2172 deletions

View file

@ -1,5 +1,5 @@
# FIXME : refcounting threads bytestream
SUBDIRS = caps capsnego plugin cleanup
SUBDIRS = caps plugin cleanup
testprogs = test_gst_init
@ -12,4 +12,4 @@ LIBS = $(GST_LIBS)
CFLAGS = $(GST_CFLAGS)
# FIXME : refcounting threadds
DIST_SUBDIRS = caps capsnego plugin bytestream cleanup
DIST_SUBDIRS = caps plugin bytestream cleanup

View file

@ -1,11 +0,0 @@
Makefile
Makefile.in
*.o
*.lo
*.la
.deps
.libs
capsnego
converter
converter2
enum

View file

@ -1,8 +0,0 @@
testprogs = converter compatibility # enum capsnego converter2
TESTS = $(testprogs)
check_PROGRAMS = $(testprogs)
AM_CFLAGS = $(GST_CFLAGS)
LIBS = $(GST_LIBS)

View file

@ -1,182 +0,0 @@
#include <gst/gst.h>
#include <stdlib.h>
GstPad *srcpad, *sinkpad;
GstPad *srcpadtempl, *sinkpadtempl;
static GstPadTemplate*
src_template_factory (void)
{
static GstPadTemplate *templ = NULL;
if (!templ) {
templ = gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL)),
NULL);
}
return templ;
}
static GstPadTemplate*
sink_template_factory (void)
{
static GstPadTemplate *templ = NULL;
if (!templ) {
templ = gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT_RANGE (16, 8192),
NULL)),
NULL);
}
return templ;
}
static GstCaps*
sink_caps_factory (void)
{
static GstCaps *caps = NULL;
if (!caps) {
caps = gst_caps_new (
"sink_caps",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT (3000),
NULL));
}
return caps;
}
static GstCaps*
src_caps_factory (void)
{
static GstCaps *caps = NULL;
if (!caps) {
caps = gst_caps_new (
"src_caps",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT (3000),
NULL));
}
return caps;
}
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (*data == NULL) {
*data = GINT_TO_POINTER (TRUE);
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps)
return GST_PAD_NEGOTIATE_AGREE;
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (*data == NULL) {
*data = GINT_TO_POINTER (TRUE);
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps)
return GST_PAD_NEGOTIATE_AGREE;
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static gboolean
perform_check (void)
{
gboolean result, overall = TRUE;
gint i, j;
g_print ("ABC: A=pad caps, B=pad template, C=negotiate function\n");
for (j=0; j<8; j++) {
GstPad *srctest, *sinktest;
for (i=0; i<8; i++) {
(j & 0x2 ? (sinktest = sinkpadtempl) : (sinktest = sinkpad));
(j & 0x4 ? (gst_pad_set_caps (sinktest, sinkcaps)) : (gst_pad_set_caps (sinktest, NULL)));
(j & 0x1 ? (gst_pad_set_negotiate_function (sinktest, negotiate_sink)) :
gst_pad_set_negotiate_function (sinktest, NULL));
(i & 0x2 ? (srctest = srcpadtempl) : (srctest = srcpad));
(i & 0x4 ? (gst_pad_set_caps (srctest, srccaps)) : (gst_pad_set_caps (srctest, NULL)));
(i & 0x1 ? (gst_pad_set_negotiate_function (srctest, negotiate_src)) :
gst_pad_set_negotiate_function (srctest, NULL));
g_print ("%d%d%d -> %d%d%d ..", (i&4)>>2, (i&2)>>1, i&1, (j&4)>>2, (j&2)>>1, j&1);
result = gst_pad_try_connect (srctest, sinktest);
g_print (".. %s\n", (result? "ok":"fail"));
if (result) gst_pad_disconnect (srctest, sinktest);
overall &= result;
}
}
return overall;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gst_init (&argc, &argv);
srcpad = gst_pad_new ("src", GST_PAD_SRC);
sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
srctempl = src_template_factory ();
sinktempl = sink_template_factory ();
srcpadtempl = gst_pad_new_from_template (src_template_factory (), "src");
sinkpadtempl = gst_pad_new_from_template (sink_template_factory (), "sink");
sinkcaps = sink_caps_factory ();
srccaps = src_caps_factory ();
g_print ("*** compatible caps/templates ***\n");
overall &= perform_check ();
gst_caps_set (srccaps, "height", GST_PROPS_INT (9000));
g_print ("*** incompatible caps ***\n");
overall &= perform_check ();
exit (!overall);
}

View file

@ -1,188 +0,0 @@
#include <gst/gst.h>
static GstCaps*
mpeg2dec_sink_caps (void)
{
return
gst_caps_new (
"mpeg2dec_sink",
"video/mpeg",
gst_props_new (
"mpegtype", GST_PROPS_LIST (
GST_PROPS_INT(1),
GST_PROPS_INT(2)
),
NULL
)
);
}
static GstCaps*
mp1parse_src_caps (void)
{
return
gst_caps_new (
"mp1parse_src",
"video/mpeg",
gst_props_new (
"mpegtype", GST_PROPS_LIST (
GST_PROPS_INT(1)
),
NULL
)
);
}
static GstCaps*
mpeg2dec_src_caps (void)
{
return
gst_caps_new (
"mpeg2dec_src",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2'))
),
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps*
raw_sink_caps (void)
{
return
gst_caps_new (
"raw_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2'))
),
"height", GST_PROPS_INT_RANGE (16, 256),
NULL
)
);
}
static GstCaps*
raw2_sink_caps (void)
{
return
gst_caps_new (
"raw2_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2'))
),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps*
get_testcaps (void)
{
return
gst_caps_new (
"raw2_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','V'))
),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps *sinkcaps = NULL,
*rawcaps = NULL,
*rawcaps2 = NULL,
*rawcaps3 = NULL,
*mp1parsecaps = NULL;
int
main (int argc, char *argv[])
{
gboolean testret;
xmlDocPtr doc;
xmlNodePtr parent;
doc = xmlNewDoc ("1.0");
doc->xmlRootNode = xmlNewDocNode (doc, NULL, "Capabilities", NULL);
gst_init (&argc, &argv);
sinkcaps = mpeg2dec_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities1", NULL);
gst_caps_save_thyself (sinkcaps, parent);
rawcaps = mpeg2dec_src_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities2", NULL);
gst_caps_save_thyself (rawcaps, parent);
rawcaps2 = raw_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities3", NULL);
gst_caps_save_thyself (rawcaps2, parent);
mp1parsecaps = mp1parse_src_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities4", NULL);
gst_caps_save_thyself (mp1parsecaps, parent);
rawcaps3 = raw2_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities5", NULL);
gst_caps_save_thyself (rawcaps3, parent);
xmlDocDump(stdout, doc);
testret = gst_caps_check_compatibility (mp1parsecaps, rawcaps);
g_print ("4 <-> 2 == %d (invalid, wrong major type)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (mp1parsecaps, sinkcaps);
g_print ("4 <-> 1 == %d (valid, subset)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (sinkcaps, mp1parsecaps);
g_print ("1 <-> 4 == %d (invalid, superset)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps2);
g_print ("2 <-> 3 == %d (invalid, ranges)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps3);
g_print ("2 <-> 5 == %d (valid)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (rawcaps3, rawcaps);
g_print ("5 <-> 2 == %d (invalid)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps2, rawcaps3);
g_print ("3 <-> 5 == %d (valid)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (rawcaps2, rawcaps);
g_print ("3 <-> 2 == %d (invalid, property missing in source)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps);
g_print ("2 <-> 2 == %d (valid, same caps)\n", testret);
if (testret != 1) exit (-1);
g_print ("caps test successful\n");
return 0;
}

View file

@ -1,199 +0,0 @@
#include <gst/gst.h>
GstPad *srcpad, *sinkpad;
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcpadtempl, *sinkpadtempl;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
gint converter_in = -1, converter_out = -1;
static GstPadTemplate*
src_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
sink_caps (void)
{
return
gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (6000),
NULL));
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_out = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_in = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
gst_init (&argc, &argv);
srctempl = src_factory ();
sinktempl = sink_factory ();
srcpad = gst_pad_new_from_template (srctempl, "src");
sinkpad = gst_pad_new_from_template (sinktempl, "sink");
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "src");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "sink");
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
sinkcaps = sink_caps ();
srccaps = src_caps ();
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("set caps on src: %d\n", result);
g_print ("initial converter status: %d %d\n", converter_in, converter_out);
result = gst_pad_try_connect (srcpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_try_connect (srcconvpad, sinkpad);
g_print ("pad connect 2: %d\n", result);
overall &= (result == TRUE);
g_print ("after connect, converter status: %d %d\n", converter_in, converter_out);
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("src pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (4000));
result = gst_pad_renegotiate (srcpad);
g_print ("sink pad renegotiate caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (9000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
exit (!overall);
}

View file

@ -1,254 +0,0 @@
#include <gst/gst.h>
GstPad *srcpad, *sinkpad;
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcpadtempl, *sinkpadtempl;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
gint converter_in = -1, converter_out = -1;
gint target_rate = 2000;
static GstPadTemplate*
src_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
sink_caps (void)
{
return
gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (6000),
NULL));
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static GstPadNegotiateReturn
converter_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (*data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_out = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
converter_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (*data == NULL) {
*caps = GST_PAD_CAPS (srcconvpad);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_in = gst_caps_get_int (*caps, "rate");
if (*data == 1) {
converter_out = gst_caps_get_int (*caps, "rate");
return gst_pad_negotiate_proxy (pad, srcconvpad, caps);
}
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
target_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("{");
if (*data == NULL) {
*caps = gst_caps_new (
"target_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (target_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
target_rate = gst_caps_get_int (*caps, "rate");
g_print ("target set %d\n", target_rate);
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
gst_init (&argc, &argv);
srctempl = src_factory ();
sinktempl = sink_factory ();
srcpad = gst_pad_new_from_template (srctempl, "src");
sinkpad = gst_pad_new_from_template (sinktempl, "sink");
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "csrc");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "csink");
gst_pad_set_negotiate_function (srcconvpad, converter_negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, converter_negotiate_sink);
gst_pad_set_negotiate_function (sinkpad, target_negotiate_sink);
sinkcaps = sink_caps ();
srccaps = src_caps ();
g_print ("-------) (-----------) (----- \n");
g_print (" ! ! converter ! ! \n");
g_print (" src -- csink csrc -- sink \n");
g_print ("-------) (-----------) (----- \n\n");
g_print ("The convertor first tries to proxy the caps received\n");
g_print ("on its csink pad to its csrc pad, when that fails, it\n");
g_print ("sets up the conversion.\n\n");
g_print ("sink pad set caps (rate=%d), converter status: %d %d\n", target_rate,
converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("result: %d, converter status: %d %d, target: %d\n\n", result,
converter_in, converter_out, target_rate);
result = gst_pad_try_connect (srcpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_try_connect (srcconvpad, sinkpad);
g_print ("pad connect 2: %d\n", result);
overall &= (result == TRUE);
g_print ("after connect, converter status: %d %d, target %d\n\n", converter_in, converter_out, target_rate);
g_print ("src pad set caps (rate=%d), converter status: %d %d, target %d \n", gst_caps_get_int (srccaps, "rate"),
converter_in, converter_out, target_rate);
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("result %d, converter status: %d %d, target %d\n\n", result,
converter_in, converter_out, target_rate);
g_print ("sink pad set caps (rate=2000), converter status: %d %d, target %d \n",
converter_in, converter_out, target_rate);
target_rate = 2000;
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("result %d, converter status: %d %d, target: %d\n\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (4000));
result = gst_pad_renegotiate (srcpad);
g_print ("sink pad renegotiate caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
target_rate = 9000;
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
exit (!overall);
}

View file

@ -1,242 +0,0 @@
#include <stdlib.h>
#include <gst/gst.h>
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstCaps *srccaps, *sinkcaps;
static gint src_rate = 140;
static gint sink_rate = 100;
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">(%d:%d)", src_rate, (*caps)->refcount);
src_rate++;
if (*data == NULL || caps == NULL) {
g_print ("*");
*caps = gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (src_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
gint in_rate = gst_caps_get_int (*caps, "rate");
g_print ("(%d)", in_rate);
if (in_rate > 140 && in_rate < 300) {
g_print ("A");
return GST_PAD_NEGOTIATE_AGREE;
}
*caps = gst_caps_copy_on_write (*caps);
gst_caps_set (*caps, "rate", GST_PROPS_INT (src_rate));
g_print ("T");
return GST_PAD_NEGOTIATE_TRY;
}
g_print ("F");
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<(%d:%d:%p)", sink_rate, (*caps)->refcount, *caps);
sink_rate++;
if (*data == NULL || *caps == NULL) {
g_print ("*");
*caps = gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (sink_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
gint in_rate = gst_caps_get_int (*caps, "rate");
g_print ("(%d)", in_rate);
if (in_rate >= 100 && in_rate < 140) {
g_print ("A");
return GST_PAD_NEGOTIATE_AGREE;
}
*caps = gst_caps_copy_on_write (*caps);
g_print ("%p", *caps);
gst_caps_set (*caps, "rate", GST_PROPS_INT (sink_rate));
g_print ("T");
return GST_PAD_NEGOTIATE_TRY;
}
g_print ("F");
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
GstElement *queue;
gst_init (&argc, &argv);
g_mem_chunk_info();
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "src");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "sink");
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
srccaps = src_caps ();
sinkcaps = gst_caps_copy (srccaps);
g_print ("The wild goose chase...\n");
result = gst_pad_try_connect (srcconvpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with the src negotiate function disabled...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, NULL);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (120));
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with the sink negotiate function disabled...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, NULL);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (170));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("without negotiate functions...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, NULL);
gst_pad_set_negotiate_function (sinkconvpad, NULL);
sinkcaps = gst_caps_copy (sinkcaps);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (150));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
sinkcaps = gst_caps_copy (sinkcaps);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (160));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with a proxy element in between...\n");
gst_pad_disconnect (srcconvpad, sinkconvpad);
queue = gst_elementfactory_make ("queue", "queue");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
gst_pad_connect (srcconvpad, gst_element_get_pad (queue, "sink"));
gst_pad_connect (gst_element_get_pad (queue, "src"), sinkconvpad);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (50));
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
exit (!overall);
}

View file

@ -1,5 +1,5 @@
# FIXME : refcounting threads bytestream
SUBDIRS = caps capsnego plugin cleanup
SUBDIRS = caps plugin cleanup
testprogs = test_gst_init
@ -12,4 +12,4 @@ LIBS = $(GST_LIBS)
CFLAGS = $(GST_CFLAGS)
# FIXME : refcounting threadds
DIST_SUBDIRS = caps capsnego plugin bytestream cleanup
DIST_SUBDIRS = caps plugin bytestream cleanup

View file

@ -1,11 +0,0 @@
Makefile
Makefile.in
*.o
*.lo
*.la
.deps
.libs
capsnego
converter
converter2
enum

View file

@ -1,8 +0,0 @@
testprogs = converter compatibility # enum capsnego converter2
TESTS = $(testprogs)
check_PROGRAMS = $(testprogs)
AM_CFLAGS = $(GST_CFLAGS)
LIBS = $(GST_LIBS)

View file

@ -1,182 +0,0 @@
#include <gst/gst.h>
#include <stdlib.h>
GstPad *srcpad, *sinkpad;
GstPad *srcpadtempl, *sinkpadtempl;
static GstPadTemplate*
src_template_factory (void)
{
static GstPadTemplate *templ = NULL;
if (!templ) {
templ = gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL)),
NULL);
}
return templ;
}
static GstPadTemplate*
sink_template_factory (void)
{
static GstPadTemplate *templ = NULL;
if (!templ) {
templ = gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT_RANGE (16, 8192),
NULL)),
NULL);
}
return templ;
}
static GstCaps*
sink_caps_factory (void)
{
static GstCaps *caps = NULL;
if (!caps) {
caps = gst_caps_new (
"sink_caps",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT (3000),
NULL));
}
return caps;
}
static GstCaps*
src_caps_factory (void)
{
static GstCaps *caps = NULL;
if (!caps) {
caps = gst_caps_new (
"src_caps",
"video/raw",
gst_props_new (
"height", GST_PROPS_INT (3000),
NULL));
}
return caps;
}
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (*data == NULL) {
*data = GINT_TO_POINTER (TRUE);
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps)
return GST_PAD_NEGOTIATE_AGREE;
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (*data == NULL) {
*data = GINT_TO_POINTER (TRUE);
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps)
return GST_PAD_NEGOTIATE_AGREE;
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static gboolean
perform_check (void)
{
gboolean result, overall = TRUE;
gint i, j;
g_print ("ABC: A=pad caps, B=pad template, C=negotiate function\n");
for (j=0; j<8; j++) {
GstPad *srctest, *sinktest;
for (i=0; i<8; i++) {
(j & 0x2 ? (sinktest = sinkpadtempl) : (sinktest = sinkpad));
(j & 0x4 ? (gst_pad_set_caps (sinktest, sinkcaps)) : (gst_pad_set_caps (sinktest, NULL)));
(j & 0x1 ? (gst_pad_set_negotiate_function (sinktest, negotiate_sink)) :
gst_pad_set_negotiate_function (sinktest, NULL));
(i & 0x2 ? (srctest = srcpadtempl) : (srctest = srcpad));
(i & 0x4 ? (gst_pad_set_caps (srctest, srccaps)) : (gst_pad_set_caps (srctest, NULL)));
(i & 0x1 ? (gst_pad_set_negotiate_function (srctest, negotiate_src)) :
gst_pad_set_negotiate_function (srctest, NULL));
g_print ("%d%d%d -> %d%d%d ..", (i&4)>>2, (i&2)>>1, i&1, (j&4)>>2, (j&2)>>1, j&1);
result = gst_pad_try_connect (srctest, sinktest);
g_print (".. %s\n", (result? "ok":"fail"));
if (result) gst_pad_disconnect (srctest, sinktest);
overall &= result;
}
}
return overall;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gst_init (&argc, &argv);
srcpad = gst_pad_new ("src", GST_PAD_SRC);
sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
srctempl = src_template_factory ();
sinktempl = sink_template_factory ();
srcpadtempl = gst_pad_new_from_template (src_template_factory (), "src");
sinkpadtempl = gst_pad_new_from_template (sink_template_factory (), "sink");
sinkcaps = sink_caps_factory ();
srccaps = src_caps_factory ();
g_print ("*** compatible caps/templates ***\n");
overall &= perform_check ();
gst_caps_set (srccaps, "height", GST_PROPS_INT (9000));
g_print ("*** incompatible caps ***\n");
overall &= perform_check ();
exit (!overall);
}

View file

@ -1,188 +0,0 @@
#include <gst/gst.h>
static GstCaps*
mpeg2dec_sink_caps (void)
{
return
gst_caps_new (
"mpeg2dec_sink",
"video/mpeg",
gst_props_new (
"mpegtype", GST_PROPS_LIST (
GST_PROPS_INT(1),
GST_PROPS_INT(2)
),
NULL
)
);
}
static GstCaps*
mp1parse_src_caps (void)
{
return
gst_caps_new (
"mp1parse_src",
"video/mpeg",
gst_props_new (
"mpegtype", GST_PROPS_LIST (
GST_PROPS_INT(1)
),
NULL
)
);
}
static GstCaps*
mpeg2dec_src_caps (void)
{
return
gst_caps_new (
"mpeg2dec_src",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2'))
),
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps*
raw_sink_caps (void)
{
return
gst_caps_new (
"raw_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2'))
),
"height", GST_PROPS_INT_RANGE (16, 256),
NULL
)
);
}
static GstCaps*
raw2_sink_caps (void)
{
return
gst_caps_new (
"raw2_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2'))
),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps*
get_testcaps (void)
{
return
gst_caps_new (
"raw2_sink_caps",
"video/raw",
gst_props_new (
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','V','1','2')),
GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','V'))
),
"height", GST_PROPS_INT_RANGE (16, 4096),
NULL
)
);
}
static GstCaps *sinkcaps = NULL,
*rawcaps = NULL,
*rawcaps2 = NULL,
*rawcaps3 = NULL,
*mp1parsecaps = NULL;
int
main (int argc, char *argv[])
{
gboolean testret;
xmlDocPtr doc;
xmlNodePtr parent;
doc = xmlNewDoc ("1.0");
doc->xmlRootNode = xmlNewDocNode (doc, NULL, "Capabilities", NULL);
gst_init (&argc, &argv);
sinkcaps = mpeg2dec_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities1", NULL);
gst_caps_save_thyself (sinkcaps, parent);
rawcaps = mpeg2dec_src_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities2", NULL);
gst_caps_save_thyself (rawcaps, parent);
rawcaps2 = raw_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities3", NULL);
gst_caps_save_thyself (rawcaps2, parent);
mp1parsecaps = mp1parse_src_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities4", NULL);
gst_caps_save_thyself (mp1parsecaps, parent);
rawcaps3 = raw2_sink_caps ();
parent = xmlNewChild (doc->xmlRootNode, NULL, "Capabilities5", NULL);
gst_caps_save_thyself (rawcaps3, parent);
xmlDocDump(stdout, doc);
testret = gst_caps_check_compatibility (mp1parsecaps, rawcaps);
g_print ("4 <-> 2 == %d (invalid, wrong major type)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (mp1parsecaps, sinkcaps);
g_print ("4 <-> 1 == %d (valid, subset)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (sinkcaps, mp1parsecaps);
g_print ("1 <-> 4 == %d (invalid, superset)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps2);
g_print ("2 <-> 3 == %d (invalid, ranges)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps3);
g_print ("2 <-> 5 == %d (valid)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (rawcaps3, rawcaps);
g_print ("5 <-> 2 == %d (invalid)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps2, rawcaps3);
g_print ("3 <-> 5 == %d (valid)\n", testret);
if (testret != 1) exit (-1);
testret = gst_caps_check_compatibility (rawcaps2, rawcaps);
g_print ("3 <-> 2 == %d (invalid, property missing in source)\n", testret);
if (testret != 0) exit (-1);
testret = gst_caps_check_compatibility (rawcaps, rawcaps);
g_print ("2 <-> 2 == %d (valid, same caps)\n", testret);
if (testret != 1) exit (-1);
g_print ("caps test successful\n");
return 0;
}

View file

@ -1,199 +0,0 @@
#include <gst/gst.h>
GstPad *srcpad, *sinkpad;
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcpadtempl, *sinkpadtempl;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
gint converter_in = -1, converter_out = -1;
static GstPadTemplate*
src_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
sink_caps (void)
{
return
gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (6000),
NULL));
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_out = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_in = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
gst_init (&argc, &argv);
srctempl = src_factory ();
sinktempl = sink_factory ();
srcpad = gst_pad_new_from_template (srctempl, "src");
sinkpad = gst_pad_new_from_template (sinktempl, "sink");
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "src");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "sink");
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
sinkcaps = sink_caps ();
srccaps = src_caps ();
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("set caps on src: %d\n", result);
g_print ("initial converter status: %d %d\n", converter_in, converter_out);
result = gst_pad_try_connect (srcpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_try_connect (srcconvpad, sinkpad);
g_print ("pad connect 2: %d\n", result);
overall &= (result == TRUE);
g_print ("after connect, converter status: %d %d\n", converter_in, converter_out);
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("src pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (4000));
result = gst_pad_renegotiate (srcpad);
g_print ("sink pad renegotiate caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (9000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d\n", result, converter_in, converter_out);
exit (!overall);
}

View file

@ -1,254 +0,0 @@
#include <gst/gst.h>
GstPad *srcpad, *sinkpad;
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcpadtempl, *sinkpadtempl;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
gint converter_in = -1, converter_out = -1;
gint target_rate = 2000;
static GstPadTemplate*
src_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_sink",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
sink_caps (void)
{
return
gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (6000),
NULL));
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstPadTemplate *srctempl, *sinktempl;
static GstCaps *srccaps, *sinkcaps;
static GstPadNegotiateReturn
converter_negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">");
if (*data == NULL) {
*caps = NULL;
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_out = gst_caps_get_int (*caps, "rate");
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
converter_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<");
if (*data == NULL) {
*caps = GST_PAD_CAPS (srcconvpad);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
converter_in = gst_caps_get_int (*caps, "rate");
if (*data == 1) {
converter_out = gst_caps_get_int (*caps, "rate");
return gst_pad_negotiate_proxy (pad, srcconvpad, caps);
}
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
target_negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("{");
if (*data == NULL) {
*caps = gst_caps_new (
"target_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (target_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
target_rate = gst_caps_get_int (*caps, "rate");
g_print ("target set %d\n", target_rate);
return GST_PAD_NEGOTIATE_AGREE;
}
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
gst_init (&argc, &argv);
srctempl = src_factory ();
sinktempl = sink_factory ();
srcpad = gst_pad_new_from_template (srctempl, "src");
sinkpad = gst_pad_new_from_template (sinktempl, "sink");
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "csrc");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "csink");
gst_pad_set_negotiate_function (srcconvpad, converter_negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, converter_negotiate_sink);
gst_pad_set_negotiate_function (sinkpad, target_negotiate_sink);
sinkcaps = sink_caps ();
srccaps = src_caps ();
g_print ("-------) (-----------) (----- \n");
g_print (" ! ! converter ! ! \n");
g_print (" src -- csink csrc -- sink \n");
g_print ("-------) (-----------) (----- \n\n");
g_print ("The convertor first tries to proxy the caps received\n");
g_print ("on its csink pad to its csrc pad, when that fails, it\n");
g_print ("sets up the conversion.\n\n");
g_print ("sink pad set caps (rate=%d), converter status: %d %d\n", target_rate,
converter_in, converter_out);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("result: %d, converter status: %d %d, target: %d\n\n", result,
converter_in, converter_out, target_rate);
result = gst_pad_try_connect (srcpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_try_connect (srcconvpad, sinkpad);
g_print ("pad connect 2: %d\n", result);
overall &= (result == TRUE);
g_print ("after connect, converter status: %d %d, target %d\n\n", converter_in, converter_out, target_rate);
g_print ("src pad set caps (rate=%d), converter status: %d %d, target %d \n", gst_caps_get_int (srccaps, "rate"),
converter_in, converter_out, target_rate);
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("result %d, converter status: %d %d, target %d\n\n", result,
converter_in, converter_out, target_rate);
g_print ("sink pad set caps (rate=2000), converter status: %d %d, target %d \n",
converter_in, converter_out, target_rate);
target_rate = 2000;
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("result %d, converter status: %d %d, target: %d\n\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (4000));
result = gst_pad_renegotiate (srcpad);
g_print ("sink pad renegotiate caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (srcpad, srccaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (40000));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
target_rate = 9000;
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
result = gst_pad_set_caps (sinkpad, sinkcaps);
g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
converter_in, converter_out, target_rate);
exit (!overall);
}

View file

@ -1,242 +0,0 @@
#include <stdlib.h>
#include <gst/gst.h>
GstPad *srcconvpad, *sinkconvpad;
GstPadTemplate *srcconvtempl, *sinkconvtempl;
static GstPadTemplate*
src_conv_factory (void)
{
return
gst_padtemplate_new (
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstPadTemplate*
sink_conv_factory (void)
{
return
gst_padtemplate_new (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT_RANGE (16, 20000),
NULL)),
NULL);
}
static GstCaps*
src_caps (void)
{
return
gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (3000),
NULL));
}
static GstCaps *srccaps, *sinkcaps;
static gint src_rate = 140;
static gint sink_rate = 100;
static GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print (">(%d:%d)", src_rate, (*caps)->refcount);
src_rate++;
if (*data == NULL || caps == NULL) {
g_print ("*");
*caps = gst_caps_new (
"src_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (src_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
gint in_rate = gst_caps_get_int (*caps, "rate");
g_print ("(%d)", in_rate);
if (in_rate > 140 && in_rate < 300) {
g_print ("A");
return GST_PAD_NEGOTIATE_AGREE;
}
*caps = gst_caps_copy_on_write (*caps);
gst_caps_set (*caps, "rate", GST_PROPS_INT (src_rate));
g_print ("T");
return GST_PAD_NEGOTIATE_TRY;
}
g_print ("F");
return GST_PAD_NEGOTIATE_FAIL;
}
static GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
g_print ("<(%d:%d:%p)", sink_rate, (*caps)->refcount, *caps);
sink_rate++;
if (*data == NULL || *caps == NULL) {
g_print ("*");
*caps = gst_caps_new (
"sink_caps",
"audio/raw",
gst_props_new (
"rate", GST_PROPS_INT (sink_rate),
NULL)
);
return GST_PAD_NEGOTIATE_TRY;
}
if (*caps) {
gint in_rate = gst_caps_get_int (*caps, "rate");
g_print ("(%d)", in_rate);
if (in_rate >= 100 && in_rate < 140) {
g_print ("A");
return GST_PAD_NEGOTIATE_AGREE;
}
*caps = gst_caps_copy_on_write (*caps);
g_print ("%p", *caps);
gst_caps_set (*caps, "rate", GST_PROPS_INT (sink_rate));
g_print ("T");
return GST_PAD_NEGOTIATE_TRY;
}
g_print ("F");
return GST_PAD_NEGOTIATE_FAIL;
}
int
main (int argc, char *argv[])
{
gboolean overall = TRUE;
gboolean result;
GstElement *queue;
gst_init (&argc, &argv);
g_mem_chunk_info();
srcconvtempl = src_conv_factory ();
sinkconvtempl = sink_conv_factory ();
srcconvpad = gst_pad_new_from_template (srcconvtempl, "src");
sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "sink");
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
srccaps = src_caps ();
sinkcaps = gst_caps_copy (srccaps);
g_print ("The wild goose chase...\n");
result = gst_pad_try_connect (srcconvpad, sinkconvpad);
g_print ("pad connect 1: %d\n", result);
overall &= (result == TRUE);
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with the src negotiate function disabled...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, NULL);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (120));
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with the sink negotiate function disabled...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, NULL);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (170));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("without negotiate functions...\n");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, NULL);
gst_pad_set_negotiate_function (sinkconvpad, NULL);
sinkcaps = gst_caps_copy (sinkcaps);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (150));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
sinkcaps = gst_caps_copy (sinkcaps);
gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (160));
result = gst_pad_set_caps (sinkconvpad, sinkcaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
g_print ("with a proxy element in between...\n");
gst_pad_disconnect (srcconvpad, sinkconvpad);
queue = gst_elementfactory_make ("queue", "queue");
GST_PAD_CAPS (srcconvpad) = NULL;
GST_PAD_CAPS (sinkconvpad) = NULL;
src_rate = 140;
sink_rate = 100;
gst_pad_set_negotiate_function (srcconvpad, negotiate_src);
gst_pad_set_negotiate_function (sinkconvpad, negotiate_sink);
gst_pad_connect (srcconvpad, gst_element_get_pad (queue, "sink"));
gst_pad_connect (gst_element_get_pad (queue, "src"), sinkconvpad);
gst_caps_set (srccaps, "rate", GST_PROPS_INT (50));
result = gst_pad_set_caps (srcconvpad, srccaps);
g_print ("\nset caps on src: %d, final rate: %d\n", result,
gst_caps_get_int (gst_pad_get_caps (srcconvpad), "rate"));
exit (!overall);
}