summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/aclib/imgconvert.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/aclib/imgconvert.c')
-rw-r--r--debian/transcode/transcode-1.1.7/aclib/imgconvert.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/aclib/imgconvert.c b/debian/transcode/transcode-1.1.7/aclib/imgconvert.c
new file mode 100644
index 00000000..cc502977
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/aclib/imgconvert.c
@@ -0,0 +1,119 @@
+/*
+ * imgconvert.c - image format conversion routines
+ * Written by Andrew Church <achurch@achurch.org>
+ *
+ * This file is part of transcode, a video stream processing tool.
+ * transcode is free software, distributable under the terms of the GNU
+ * General Public License (version 2 or later). See the file COPYING
+ * for details.
+ */
+
+#include "ac.h"
+#include "imgconvert.h"
+#include "img_internal.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/*************************************************************************/
+
+static struct {
+ ImageFormat srcfmt, destfmt;
+ ConversionFunc func;
+} *conversions;
+static int n_conversions = 0;
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Image conversion routine. src and dest are arrays of pointers to planes
+ * (for packed formats with only one plane, just use `&data'); srcfmt and
+ * destfmt specify the source and destination image formats (IMG_*).
+ * width and height are in pixels. Returns 1 on success, 0 on failure. */
+
+int ac_imgconvert(uint8_t **src, ImageFormat srcfmt,
+ uint8_t **dest, ImageFormat destfmt,
+ int width, int height)
+{
+ int i;
+
+ /* Hack to handle YV12 easily, because conversion routines don't get
+ * format tags */
+ uint8_t *newsrc[3], *newdest[3];
+ if (srcfmt == IMG_YV12) {
+ srcfmt = IMG_YUV420P;
+ newsrc[0] = src[0];
+ newsrc[1] = src[2];
+ newsrc[2] = src[1];
+ src = newsrc;
+ }
+ if (destfmt == IMG_YV12) {
+ destfmt = IMG_YUV420P;
+ newdest[0] = dest[0];
+ newdest[1] = dest[2];
+ newdest[2] = dest[1];
+ dest = newdest;
+ }
+
+ for (i = 0; i < n_conversions; i++) {
+ if (conversions[i].srcfmt==srcfmt && conversions[i].destfmt==destfmt)
+ return (*conversions[i].func)(src, dest, width, height);
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Internal use only! */
+
+int ac_imgconvert_init(int accel)
+{
+ if (!ac_imgconvert_init_yuv_planar(accel)
+ || !ac_imgconvert_init_yuv_packed(accel)
+ || !ac_imgconvert_init_yuv_mixed(accel)
+ || !ac_imgconvert_init_yuv_rgb(accel)
+ || !ac_imgconvert_init_rgb_packed(accel)
+ ) {
+ fprintf(stderr, "ac_imgconvert_init() failed");
+ return 0;
+ }
+ return 1;
+}
+
+int register_conversion(ImageFormat srcfmt, ImageFormat destfmt,
+ ConversionFunc function)
+{
+ int i;
+
+ for (i = 0; i < n_conversions; i++) {
+ if (conversions[i].srcfmt==srcfmt && conversions[i].destfmt==destfmt) {
+ conversions[i].func = function;
+ return 1;
+ }
+ }
+
+ if (!(conversions = realloc(conversions,
+ (n_conversions+1) * sizeof(*conversions)))) {
+ fprintf(stderr, "register_conversion(): out of memory\n");
+ return 0;
+ }
+ conversions[n_conversions].srcfmt = srcfmt;
+ conversions[n_conversions].destfmt = destfmt;
+ conversions[n_conversions].func = function;
+ n_conversions++;
+ return 1;
+}
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */