summaryrefslogtreecommitdiffstats
path: root/ext/xvid/gstxvid.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-01-03 19:38:40 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-01-03 19:38:40 +0000
commit47d4010afba7ad750b7cc3a3e36c342e704e462b (patch)
tree2f5fc8636b1c2e72b52c76394cc2e1002109cee8 /ext/xvid/gstxvid.c
parentb52042f6dbb75f2d43179e859358f79995671fa7 (diff)
downloadgst-plugins-bad-47d4010afba7ad750b7cc3a3e36c342e704e462b.tar.gz
gst-plugins-bad-47d4010afba7ad750b7cc3a3e36c342e704e462b.tar.bz2
gst-plugins-bad-47d4010afba7ad750b7cc3a3e36c342e704e462b.zip
Update xvid plugin to latest xvid (1.0.0-beta3) API.
Original commit message from CVS: 2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> reviewed by: <delete if not using a buddy> * configure.ac: * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_error), (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): * ext/xvid/gstxvid.h: * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), (gst_xviddec_init), (gst_xviddec_setup), (gst_xviddec_chain), (gst_xviddec_src_link), (gst_xviddec_sink_link), (gst_xviddec_change_state): * ext/xvid/gstxviddec.h: * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), (gst_xvidenc_base_init), (gst_xvidenc_class_init), (gst_xvidenc_init), (gst_xvidenc_setup), (gst_xvidenc_chain), (gst_xvidenc_link), (gst_xvidenc_set_property), (gst_xvidenc_get_property), (gst_xvidenc_change_state): * ext/xvid/gstxvidenc.h: Update xvid plugin to latest xvid (1.0.0-beta3) API.
Diffstat (limited to 'ext/xvid/gstxvid.c')
-rw-r--r--ext/xvid/gstxvid.c225
1 files changed, 208 insertions, 17 deletions
diff --git a/ext/xvid/gstxvid.c b/ext/xvid/gstxvid.c
index 4ed5733c..64ab2f56 100644
--- a/ext/xvid/gstxvid.c
+++ b/ext/xvid/gstxvid.c
@@ -1,4 +1,4 @@
-/* GStreamer xvid decoder plugin
+/* GStreamer xvid encoder/decoder plugin
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
*
* This library is free software; you can redistribute it and/or
@@ -22,14 +22,16 @@
#endif
#include <string.h>
+#include <xvid.h>
+#include <gst/video/video.h>
#include "gstxviddec.h"
#include "gstxvidenc.h"
gboolean
gst_xvid_init (void)
{
- XVID_INIT_PARAM xinit;
+ xvid_gbl_init_t xinit;
gint ret;
static gboolean is_init = FALSE;
@@ -39,20 +41,18 @@ gst_xvid_init (void)
}
/* set up xvid initially (function pointers, CPU flags) */
- memset(&xinit, 0, sizeof(XVID_INIT_PARAM));
- xinit.cpu_flags = 0;
- if ((ret = xvid_init(NULL, 0, &xinit, NULL)) != XVID_ERR_OK) {
+ gst_xvid_init_struct (xinit);
+ if ((ret = xvid_global(NULL, XVID_GBL_INIT, &xinit, NULL)) < 0) {
g_warning("Failed to initialize XviD: %s (%d)",
gst_xvid_error(ret), ret);
return FALSE;
}
-
- if (xinit.api_version != API_VERSION) {
- g_warning("Xvid API version mismatch! %d.%d (that's us) != %d.%d (lib)",
- (API_VERSION >> 8) & 0xff, API_VERSION & 0xff,
- (xinit.api_version >> 8) & 0xff, xinit.api_version & 0xff);
- return FALSE;
- }
+
+ GST_LOG ("Initted XviD version %d.%d.%d (API %d.%d)",
+ XVID_VERSION_MAJOR (XVID_VERSION),
+ XVID_VERSION_MINOR (XVID_VERSION),
+ XVID_VERSION_PATCH (XVID_VERSION),
+ XVID_API_MAJOR (XVID_API), XVID_API_MINOR (XVID_API));
is_init = TRUE;
return TRUE;
@@ -67,14 +67,17 @@ gst_xvid_error (int errorcode)
case XVID_ERR_FAIL:
error = "Operation failed";
break;
- case XVID_ERR_OK:
+ case 0:
error = "No error";
break;
case XVID_ERR_MEMORY:
- error = "Memory error";
+ error = "Memory allocation error";
break;
case XVID_ERR_FORMAT:
- error = "Invalid format";
+ error = "File format not supported";
+ break;
+ case XVID_ERR_VERSION:
+ error = "Structure version not supported";
break;
default:
error = "Unknown error";
@@ -84,6 +87,193 @@ gst_xvid_error (int errorcode)
return error;
}
+gint
+gst_xvid_structure_to_csp (GstStructure *structure,
+ gint w, gint *_stride, gint *_bpp)
+{
+ const gchar *mime = gst_structure_get_name (structure);
+ gint xvid_cs = -1, stride = -1, bpp = -1;
+
+ if (!strcmp (mime, "video/x-raw-yuv")) {
+ guint32 fourcc;
+
+ gst_structure_get_fourcc (structure, "format", &fourcc);
+ switch (fourcc) {
+ case GST_MAKE_FOURCC('I','4','2','0'):
+ xvid_cs = XVID_CSP_I420;
+ stride = w;
+ bpp = 12;
+ break;
+ case GST_MAKE_FOURCC('Y','U','Y','2'):
+ xvid_cs = XVID_CSP_YUY2;
+ stride = w * 2;
+ bpp = 16;
+ break;
+ case GST_MAKE_FOURCC('Y','V','1','2'):
+ xvid_cs = XVID_CSP_YV12;
+ stride = w;
+ bpp = 12;
+ break;
+ case GST_MAKE_FOURCC('U','Y','V','Y'):
+ xvid_cs = XVID_CSP_UYVY;
+ stride = w * 2;
+ bpp = 16;
+ break;
+ case GST_MAKE_FOURCC('Y','V','Y','U'):
+ xvid_cs = XVID_CSP_YVYU;
+ stride = w * 2;
+ bpp = 16;
+ break;
+ }
+ } else {
+ gint depth, r_mask;
+
+ gst_structure_get_int(structure, "depth", &depth);
+ gst_structure_get_int(structure, "bpp", &bpp);
+ gst_structure_get_int(structure, "red_mask", &r_mask);
+
+ switch (depth) {
+ case 15:
+ xvid_cs = XVID_CSP_RGB555;
+ break;
+ case 16:
+ xvid_cs = XVID_CSP_RGB565;
+ break;
+ case 24:
+ if (bpp == 24) {
+ xvid_cs = XVID_CSP_BGR;
+ } else {
+ switch (r_mask) {
+ case 0xff000000:
+ xvid_cs = XVID_CSP_RGBA;
+ break;
+ case 0x00ff0000:
+ xvid_cs = XVID_CSP_ARGB;
+ break;
+ case 0x0000ff00:
+ xvid_cs = XVID_CSP_BGRA;
+ break;
+ case 0x000000ff:
+ xvid_cs = XVID_CSP_ABGR;
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ stride = w * bpp / 8;
+ }
+
+ if (_stride)
+ *_stride = stride;
+ if (_bpp)
+ *_bpp = bpp;
+
+ return xvid_cs;
+}
+
+GstCaps *
+gst_xvid_csp_to_caps (gint csp, gint w, gint h, gdouble fps)
+{
+ GstCaps *caps = NULL;
+
+ switch (csp) {
+ case XVID_CSP_RGB555:
+ case XVID_CSP_RGB565:
+ case XVID_CSP_BGR:
+ case XVID_CSP_ABGR:
+ case XVID_CSP_BGRA:
+ case XVID_CSP_ARGB:
+ case XVID_CSP_RGBA: {
+ gint r_mask = 0, b_mask = 0, g_mask = 0,
+ endianness = 0, bpp = 0, depth = 0;
+
+ switch (csp) {
+ case XVID_CSP_RGB555:
+ r_mask = R_MASK_15_INT; g_mask = G_MASK_15_INT; b_mask = B_MASK_15_INT;
+ endianness = G_BYTE_ORDER; depth = 15; bpp = 16;
+ break;
+ case XVID_CSP_RGB565:
+ r_mask = R_MASK_16_INT; g_mask = G_MASK_16_INT; b_mask = B_MASK_16_INT;
+ endianness = G_BYTE_ORDER; depth = 16; bpp = 16;
+ break;
+ case XVID_CSP_BGR:
+ r_mask = 0x0000ff; g_mask = 0x00ff00; b_mask = 0xff0000;
+ endianness = G_BIG_ENDIAN; depth = 24; bpp = 24;
+ break;
+ case XVID_CSP_ABGR:
+ r_mask = 0x000000ff; g_mask = 0x0000ff00; b_mask = 0x00ff0000;
+ endianness = G_BIG_ENDIAN; depth = 24; bpp = 32;
+ break;
+ case XVID_CSP_BGRA:
+ r_mask = 0x0000ff00; g_mask = 0x00ff0000; b_mask = 0xff000000;
+ endianness = G_BIG_ENDIAN; depth = 24; bpp = 32;
+ break;
+ case XVID_CSP_ARGB:
+ r_mask = 0x00ff0000; g_mask = 0x0000ff00; b_mask = 0x000000ff;
+ endianness = G_BIG_ENDIAN; depth = 24; bpp = 32;
+ break;
+ case XVID_CSP_RGBA:
+ r_mask = 0xff000000; g_mask = 0x00ff0000; b_mask = 0x0000ff00;
+ endianness = G_BIG_ENDIAN; depth = 24; bpp = 32;
+ break;
+ }
+
+ caps = gst_caps_new_simple ("video/x-raw-rgb",
+ "width", G_TYPE_INT, w,
+ "height", G_TYPE_INT, h,
+ "depth", G_TYPE_INT, depth,
+ "bpp", G_TYPE_INT, bpp,
+ "endianness", G_TYPE_INT, endianness,
+ "red_mask", G_TYPE_INT, r_mask,
+ "green_mask", G_TYPE_INT, g_mask,
+ "blue_mask", G_TYPE_INT, b_mask,
+ "framerate", G_TYPE_DOUBLE, fps,
+ NULL);
+ break;
+ }
+
+ case XVID_CSP_YUY2:
+ case XVID_CSP_YVYU:
+ case XVID_CSP_UYVY:
+ case XVID_CSP_I420:
+ case XVID_CSP_YV12: {
+ guint32 fourcc = 0;
+
+ switch (csp) {
+ case XVID_CSP_YUY2:
+ fourcc = GST_MAKE_FOURCC ('Y','U','Y','2');
+ break;
+ case XVID_CSP_YVYU:
+ fourcc = GST_MAKE_FOURCC ('Y','V','Y','U');
+ break;
+ case XVID_CSP_UYVY:
+ fourcc = GST_MAKE_FOURCC ('U','Y','V','Y');
+ break;
+ case XVID_CSP_I420:
+ fourcc = GST_MAKE_FOURCC ('I','4','2','0');
+ break;
+ case XVID_CSP_YV12:
+ fourcc = GST_MAKE_FOURCC ('Y','V','1','2');
+ break;
+ }
+
+ caps = gst_caps_new_simple ("video/x-raw-yuv",
+ "width", G_TYPE_INT, w,
+ "height", G_TYPE_INT, h,
+ "format", GST_TYPE_FOURCC, fourcc,
+ "framerate", G_TYPE_DOUBLE, fps,
+ NULL);
+ break;
+ }
+ }
+
+ return caps;
+}
+
+
static gboolean
plugin_init (GstPlugin *plugin)
{
@@ -97,9 +287,10 @@ GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"xvid",
- "XVid plugin library",
+ "XviD plugin library",
plugin_init,
VERSION,
"GPL",
GST_PACKAGE,
- GST_ORIGIN)
+ GST_ORIGIN
+)