summaryrefslogtreecommitdiffstats
path: root/ext/xvid
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-07-06 20:49:52 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-07-06 20:49:52 +0000
commit95011fd7e8eb3a2ec3a87ff9dad523d18005db42 (patch)
tree6e75f9139c6520126f9344e15e1dea2a49f70f9c /ext/xvid
parent85a8dd7ecb04d043be8192e27e3c89ef8ccebe55 (diff)
downloadgst-plugins-bad-95011fd7e8eb3a2ec3a87ff9dad523d18005db42.tar.gz
gst-plugins-bad-95011fd7e8eb3a2ec3a87ff9dad523d18005db42.tar.bz2
gst-plugins-bad-95011fd7e8eb3a2ec3a87ff9dad523d18005db42.zip
New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri...
Original commit message from CVS: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs
Diffstat (limited to 'ext/xvid')
-rw-r--r--ext/xvid/gstxviddec.c125
-rw-r--r--ext/xvid/gstxviddec.h1
-rw-r--r--ext/xvid/gstxvidenc.c94
-rw-r--r--ext/xvid/gstxvidenc.h1
4 files changed, 138 insertions, 83 deletions
diff --git a/ext/xvid/gstxviddec.c b/ext/xvid/gstxviddec.c
index cd4ce3f5..fcde219b 100644
--- a/ext/xvid/gstxviddec.c
+++ b/ext/xvid/gstxviddec.c
@@ -44,28 +44,39 @@ GST_PAD_TEMPLATE_FACTORY(sink_template,
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_CAPS_NEW("xviddec_sink",
- "video/xvid",
- NULL)
+ "video/x-xvid",
+ "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT))
)
GST_PAD_TEMPLATE_FACTORY(src_template,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW("xviddec_src",
- "video/raw",
- "format", GST_PROPS_LIST(
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('R','G','B',' ')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','Y','U','V')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','Y','U')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
- ),
- "width", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE(0, G_MAXINT),
- NULL)
+ gst_caps_new(
+ "xviddec_sink",
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS (
+ GST_PROPS_LIST(
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','Y','U')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
+ )
+ )
+ ),
+ gst_caps_new(
+ "xviddec_sink_rgb24_32",
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32
+ ),
+ gst_caps_new(
+ "xviddec_sink_rgb15_16",
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16
+ )
)
@@ -88,6 +99,7 @@ static void gst_xviddec_chain (GstPad *pad,
GstBuffer *buf);
static GstPadLinkReturn gst_xviddec_connect (GstPad *pad,
GstCaps *vscapslist);
+static GstPadLinkReturn gst_xviddec_negotiate (GstXvidDec *xviddec);
static GstElementClass *parent_class = NULL;
/* static guint gst_xviddec_signals[LAST_SIGNAL] = { 0 }; */
@@ -216,10 +228,12 @@ gst_xviddec_chain (GstPad *pad,
xviddec = GST_XVIDDEC(GST_OBJECT_PARENT(pad));
if (!xviddec->handle) {
- gst_element_error(GST_ELEMENT(xviddec),
- "No format set - aborting");
- gst_buffer_unref(buf);
- return;
+ if (!gst_xviddec_negotiate(xviddec)) {
+ gst_element_error(GST_ELEMENT(xviddec),
+ "No format set - aborting");
+ gst_buffer_unref(buf);
+ return;
+ }
}
outbuf = gst_buffer_new_and_alloc(xviddec->width *
@@ -252,10 +266,9 @@ gst_xviddec_chain (GstPad *pad,
static GstPadLinkReturn
-gst_xviddec_connect (GstPad *pad,
- GstCaps *vscaps)
+gst_xviddec_negotiate (GstXvidDec *xviddec)
{
- GstXvidDec *xviddec;
+ GstPadLinkReturn ret;
GstCaps *caps;
struct {
guint32 fourcc;
@@ -266,7 +279,6 @@ gst_xviddec_connect (GstPad *pad,
{ GST_MAKE_FOURCC('U','Y','V','Y'), 16, 16, XVID_CSP_UYVY },
{ GST_MAKE_FOURCC('Y','V','Y','U'), 16, 16, XVID_CSP_YVYU },
{ GST_MAKE_FOURCC('I','4','2','0'), 12, 12, XVID_CSP_I420 },
- { GST_MAKE_FOURCC('I','Y','U','V'), 12, 12, XVID_CSP_I420 },
{ GST_MAKE_FOURCC('Y','V','1','2'), 12, 12, XVID_CSP_YV12 },
{ GST_MAKE_FOURCC('R','G','B',' '), 32, 32, XVID_CSP_RGB32 },
{ GST_MAKE_FOURCC('R','G','B',' '), 24, 24, XVID_CSP_RGB24 },
@@ -276,68 +288,60 @@ gst_xviddec_connect (GstPad *pad,
};
gint i;
- xviddec = GST_XVIDDEC(gst_pad_get_parent (pad));
-
- /* if there's something old around, remove it */
- if (xviddec->handle) {
- gst_xviddec_unset(xviddec);
- }
-
- /* we are not going to act on variable caps */
- if (!GST_CAPS_IS_FIXED(vscaps))
- return GST_PAD_LINK_DELAYED;
-
- /* if we get here, we know the input is xvid. we
- * only need to bother with the output colorspace */
- gst_caps_get_int(vscaps, "width", &xviddec->width);
- gst_caps_get_int(vscaps, "height", &xviddec->height);
-
for (i = 0; fmt_list[i].fourcc != 0; i++) {
xviddec->csp = fmt_list[i].csp;
/* try making a caps to set on the other side */
if (fmt_list[i].fourcc == GST_MAKE_FOURCC('R','G','B',' ')) {
guint32 r_mask = 0, b_mask = 0, g_mask = 0;
+ gint endianness = 0;
switch (fmt_list[i].depth) {
case 15:
+ endianness = G_BYTE_ORDER;
r_mask = 0xf800; g_mask = 0x07c0; b_mask = 0x003e;
break;
case 16:
+ endianness = G_BYTE_ORDER;
r_mask = 0xf800; g_mask = 0x07e0; b_mask = 0x001f;
break;
case 24:
- r_mask = 0xff0000; g_mask = 0x00ff00; b_mask = 0x0000ff;
+ endianness = G_BIG_ENDIAN;
+ r_mask = R_MASK_24; g_mask = G_MASK_24; b_mask = B_MASK_24;
break;
case 32:
- r_mask = 0xff000000; g_mask = 0x00ff0000; b_mask = 0x0000ff00;
+ endianness = G_BIG_ENDIAN;
+ r_mask = R_MASK_32; g_mask = G_MASK_32; b_mask = B_MASK_32;
break;
}
caps = GST_CAPS_NEW("xviddec_src_pad_rgb",
- "video/raw",
+ "video/x-raw-rgb",
"width", GST_PROPS_INT(xviddec->width),
"height", GST_PROPS_INT(xviddec->height),
- "format", GST_PROPS_FOURCC(fmt_list[i].fourcc),
"depth", GST_PROPS_INT(fmt_list[i].depth),
"bpp", GST_PROPS_INT(fmt_list[i].bpp),
- "endianness", GST_PROPS_INT(G_BYTE_ORDER),
+ "endianness", GST_PROPS_INT(endianness),
"red_mask", GST_PROPS_INT(r_mask),
"green_mask", GST_PROPS_INT(g_mask),
"blue_mask", GST_PROPS_INT(b_mask),
+ "framerate", GST_PROPS_FLOAT(xviddec->fps),
NULL);
} else {
caps = GST_CAPS_NEW("xviddec_src_pad_yuv",
- "video/raw",
+ "video/x-raw-yuv",
"width", GST_PROPS_INT(xviddec->width),
"height", GST_PROPS_INT(xviddec->height),
"format", GST_PROPS_FOURCC(fmt_list[i].fourcc),
+ "framerate", GST_PROPS_FLOAT(xviddec->fps),
NULL);
}
- if (gst_pad_try_set_caps(xviddec->srcpad, caps) > 0) {
+ if ((ret = gst_pad_try_set_caps(xviddec->srcpad, caps)) > 0) {
xviddec->csp = fmt_list[i].csp;
xviddec->bpp = fmt_list[i].bpp;
if (gst_xviddec_setup(xviddec))
return GST_PAD_LINK_OK;
+ } else if (ret == GST_PAD_LINK_DELAYED) {
+ return ret; /* don't try further (yet) */
}
}
@@ -346,6 +350,33 @@ gst_xviddec_connect (GstPad *pad,
}
+static GstPadLinkReturn
+gst_xviddec_connect (GstPad *pad,
+ GstCaps *vscaps)
+{
+ GstXvidDec *xviddec;
+
+ xviddec = GST_XVIDDEC(gst_pad_get_parent (pad));
+
+ /* if there's something old around, remove it */
+ if (xviddec->handle) {
+ gst_xviddec_unset(xviddec);
+ }
+
+ /* we are not going to act on variable caps */
+ if (!GST_CAPS_IS_FIXED(vscaps))
+ return GST_PAD_LINK_DELAYED;
+
+ /* if we get here, we know the input is xvid. we
+ * only need to bother with the output colorspace */
+ gst_caps_get_int(vscaps, "width", &xviddec->width);
+ gst_caps_get_int(vscaps, "height", &xviddec->height);
+ gst_caps_get_float(vscaps, "framerate", &xviddec->fps);
+
+ return gst_xviddec_negotiate(xviddec);
+}
+
+
gboolean
gst_xviddec_plugin_init (GModule *module,
GstPlugin *plugin)
diff --git a/ext/xvid/gstxviddec.h b/ext/xvid/gstxviddec.h
index cdee5540..6a08b2be 100644
--- a/ext/xvid/gstxviddec.h
+++ b/ext/xvid/gstxviddec.h
@@ -54,6 +54,7 @@ struct _GstXvidDec {
/* video (output) settings */
int csp, bpp;
int width, height;
+ float fps;
};
struct _GstXvidDecClass {
diff --git a/ext/xvid/gstxvidenc.c b/ext/xvid/gstxvidenc.c
index 7b3d62dd..5a4156ce 100644
--- a/ext/xvid/gstxvidenc.c
+++ b/ext/xvid/gstxvidenc.c
@@ -44,20 +44,29 @@ GST_PAD_TEMPLATE_FACTORY(sink_template,
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW("xvidenc_sink",
- "video/raw",
- "format", GST_PROPS_LIST(
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('R','G','B',' ')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','Y','U','V')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','Y','U')),
- GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
- ),
- "width", GST_PROPS_INT_RANGE(0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE(0, G_MAXINT),
- NULL)
+ gst_caps_new(
+ "xvidenc_sink",
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS (
+ GST_PROPS_LIST(
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('I','4','2','0')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','Y','2')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','1','2')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','V','Y','U')),
+ GST_PROPS_FOURCC(GST_MAKE_FOURCC('U','Y','V','Y'))
+ )
+ )
+ ),
+ gst_caps_new(
+ "xvidenc_sink_rgb24_32",
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32
+ ),
+ gst_caps_new(
+ "xvidenc_sink_rgb15_16",
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16
+ )
)
GST_PAD_TEMPLATE_FACTORY(src_template,
@@ -65,8 +74,10 @@ GST_PAD_TEMPLATE_FACTORY(src_template,
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_CAPS_NEW("xvidenc_src",
- "video/xvid",
- NULL)
+ "video/x-xvid",
+ "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT))
)
@@ -202,17 +213,14 @@ static gboolean
gst_xvidenc_setup (GstXvidEnc *xvidenc)
{
XVID_ENC_PARAM xenc;
- gdouble fps;
int ret;
- fps = gst_video_frame_rate(GST_PAD_PEER(xvidenc->sinkpad));
-
/* set up xvid codec parameters - grab docs from
* xvid.org for more info */
memset(&xenc, 0, sizeof(XVID_ENC_PARAM));
xenc.width = xvidenc->width;
xenc.height = xvidenc->height;
- xenc.fincr = (int)(fps * 1000);
+ xenc.fincr = (int)(xvidenc->fps * 1000);
xenc.fbase = 1000;
xenc.rc_bitrate = xvidenc->bitrate;
xenc.rc_reaction_delay_factor = -1;
@@ -254,13 +262,6 @@ gst_xvidenc_chain (GstPad *pad,
xvidenc = GST_XVIDENC(GST_OBJECT_PARENT(pad));
- if (!xvidenc->handle) {
- if (!gst_xvidenc_setup(xvidenc)) {
- gst_buffer_unref(buf);
- return;
- }
- }
-
outbuf = gst_buffer_new_and_alloc(xvidenc->buffer_size);
GST_BUFFER_TIMESTAMP(outbuf) = GST_BUFFER_TIMESTAMP(buf);
@@ -326,11 +327,17 @@ gst_xvidenc_connect (GstPad *pad,
for (caps = vscaps; caps != NULL; caps = caps->next)
{
int w,h,d;
+ float fps;
guint32 fourcc;
gint xvid_cs;
+
gst_caps_get_int(caps, "width", &w);
gst_caps_get_int(caps, "height", &h);
- gst_caps_get_fourcc_int(caps, "format", &fourcc);
+ gst_caps_get_float(caps, "framerate", &fps);
+ if (gst_caps_has_property(caps, "format"))
+ gst_caps_get_fourcc_int(caps, "format", &fourcc);
+ else
+ fourcc = GST_MAKE_FOURCC('R','G','B',' ');
switch (fourcc)
{
@@ -373,17 +380,32 @@ gst_xvidenc_connect (GstPad *pad,
goto trynext;
}
- /* grmbl, we only know the peer pad *after*
- * linking, so we accept here, get the fps on
- * the first cycle and set it all up then */
xvidenc->csp = xvid_cs;
xvidenc->width = w;
xvidenc->height = h;
- return gst_pad_try_set_caps(xvidenc->srcpad,
- GST_CAPS_NEW("xvidenc_src_caps",
- "video/xvid",
- "width", GST_PROPS_INT(w),
- "height", GST_PROPS_INT(h)));
+ xvidenc->fps = fps;
+
+ if (gst_xvidenc_setup(xvidenc)) {
+ GstPadLinkReturn ret;
+ GstCaps *new_caps;
+
+ new_caps = GST_CAPS_NEW("xvidenc_src_caps",
+ "video/x-xvid",
+ "width", GST_PROPS_INT(w),
+ "height", GST_PROPS_INT(h),
+ "framerate", GST_PROPS_FLOAT (fps));
+
+ ret = gst_pad_try_set_caps(xvidenc->srcpad, new_caps);
+
+ if (ret <= 0) {
+ if (xvidenc->handle) {
+ xvid_encore(xvidenc->handle, XVID_ENC_DESTROY, NULL, NULL);
+ xvidenc->handle = NULL;
+ }
+ }
+
+ return ret;
+ }
trynext:
continue;
diff --git a/ext/xvid/gstxvidenc.h b/ext/xvid/gstxvidenc.h
index e14b4133..224487dc 100644
--- a/ext/xvid/gstxvidenc.h
+++ b/ext/xvid/gstxvidenc.h
@@ -60,6 +60,7 @@ struct _GstXvidEnc {
void *handle;
int csp;
int width, height;
+ float fps;
};
struct _GstXvidEncClass {