Mercurial > libavcodec.hg
changeset 10581:2980d9efc542 libavcodec
Add support for hardcoding the motionpixels rgb to yuv table.
author | reimar |
---|---|
date | Thu, 26 Nov 2009 21:20:28 +0000 |
parents | 2e01212efb32 |
children | 2c581477f8d6 |
files | Makefile motionpixels.c motionpixels_tablegen.c motionpixels_tablegen.h tableprint.c tableprint.h |
diffstat | 6 files changed, 140 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Thu Nov 26 21:15:06 2009 +0000 +++ b/Makefile Thu Nov 26 21:20:28 2009 +0000 @@ -718,4 +718,5 @@ ifdef CONFIG_HARDCODED_TABLES $(SUBDIR)mpegaudiodec.o: $(SUBDIR)mpegaudio_tables.h +$(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h endif
--- a/motionpixels.c Thu Nov 26 21:15:06 2009 +0000 +++ b/motionpixels.c Thu Nov 26 21:20:28 2009 +0000 @@ -25,9 +25,7 @@ #define MAX_HUFF_CODES 16 -typedef struct YuvPixel { - int8_t y, v, u; -} YuvPixel; +#include "motionpixels_tablegen.h" typedef struct HuffCode { int code; @@ -51,61 +49,11 @@ int bswapbuf_size; } MotionPixelsContext; -static YuvPixel mp_rgb_yuv_table[1 << 15]; - -static int mp_yuv_to_rgb(int y, int v, int u, int clip_rgb) { - static const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; - int r, g, b; - - r = (1000 * y + 701 * v) / 1000; - g = (1000 * y - 357 * v - 172 * u) / 1000; - b = (1000 * y + 886 * u) / 1000; - if (clip_rgb) - return ((cm[r * 8] & 0xF8) << 7) | ((cm[g * 8] & 0xF8) << 2) | (cm[b * 8] >> 3); - if ((unsigned)r < 32 && (unsigned)g < 32 && (unsigned)b < 32) - return (r << 10) | (g << 5) | b; - return 1 << 15; -} - -static void mp_set_zero_yuv(YuvPixel *p) -{ - int i, j; - - for (i = 0; i < 31; ++i) { - for (j = 31; j > i; --j) - if (!(p[j].u | p[j].v | p[j].y)) - p[j] = p[j - 1]; - for (j = 0; j < 31 - i; ++j) - if (!(p[j].u | p[j].v | p[j].y)) - p[j] = p[j + 1]; - } -} - -static void mp_build_rgb_yuv_table(YuvPixel *p) -{ - int y, v, u, i; - - for (y = 0; y <= 31; ++y) - for (v = -31; v <= 31; ++v) - for (u = -31; u <= 31; ++u) { - i = mp_yuv_to_rgb(y, v, u, 0); - if (i < (1 << 15) && !(p[i].u | p[i].v | p[i].y)) { - p[i].y = y; - p[i].v = v; - p[i].u = u; - } - } - for (i = 0; i < 1024; ++i) - mp_set_zero_yuv(p + i * 32); -} - static av_cold int mp_decode_init(AVCodecContext *avctx) { MotionPixelsContext *mp = avctx->priv_data; - if (!mp_rgb_yuv_table[0].u) { - mp_build_rgb_yuv_table(mp_rgb_yuv_table); - } + motionpixels_tableinit(); mp->avctx = avctx; dsputil_init(&mp->dsp, avctx); mp->changes_map = av_mallocz(avctx->width * avctx->height);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motionpixels_tablegen.c Thu Nov 26 21:20:28 2009 +0000 @@ -0,0 +1,44 @@ +/* + * Generate a header file for hardcoded motionpixels RGB to YUV table + * + * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdlib.h> +#define CONFIG_HARDCODED_TABLES 0 +#define MAX_NEG_CROP 0 +#define ff_cropTbl ((uint8_t *)NULL) +#include "motionpixels_tablegen.h" +#include "tableprint.h" + +void tableinit(void) +{ + motionpixels_tableinit(); +} + +const struct tabledef tables[] = { + { + "static const YuvPixel mp_rgb_yuv_table[1 << 15]", + write_int8_2d_array, + mp_rgb_yuv_table, + 1 << 15, + 3 + }, + { NULL } +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motionpixels_tablegen.h Thu Nov 26 21:20:28 2009 +0000 @@ -0,0 +1,91 @@ +/* + * Header file for hardcoded motionpixels RGB to YUV table + * + * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef MOTIONPIXELS_TABLEGEN_H +#define MOTIONPIXELS_TABLEGEN_H + +#include <stdint.h> + +typedef struct YuvPixel { + int8_t y, v, u; +} YuvPixel; + +static int mp_yuv_to_rgb(int y, int v, int u, int clip_rgb) { + static const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; + int r, g, b; + + r = (1000 * y + 701 * v) / 1000; + g = (1000 * y - 357 * v - 172 * u) / 1000; + b = (1000 * y + 886 * u) / 1000; + if (clip_rgb) + return ((cm[r * 8] & 0xF8) << 7) | ((cm[g * 8] & 0xF8) << 2) | (cm[b * 8] >> 3); + if ((unsigned)r < 32 && (unsigned)g < 32 && (unsigned)b < 32) + return (r << 10) | (g << 5) | b; + return 1 << 15; +} + +#if CONFIG_HARDCODED_TABLES +#define motionpixels_tableinit() +#include "libavcodec/motionpixels_tables.h" +#else +static YuvPixel mp_rgb_yuv_table[1 << 15]; + +static void mp_set_zero_yuv(YuvPixel *p) +{ + int i, j; + + for (i = 0; i < 31; ++i) { + for (j = 31; j > i; --j) + if (!(p[j].u | p[j].v | p[j].y)) + p[j] = p[j - 1]; + for (j = 0; j < 31 - i; ++j) + if (!(p[j].u | p[j].v | p[j].y)) + p[j] = p[j + 1]; + } +} + +static void mp_build_rgb_yuv_table(YuvPixel *p) +{ + int y, v, u, i; + + for (y = 0; y <= 31; ++y) + for (v = -31; v <= 31; ++v) + for (u = -31; u <= 31; ++u) { + i = mp_yuv_to_rgb(y, v, u, 0); + if (i < (1 << 15) && !(p[i].u | p[i].v | p[i].y)) { + p[i].y = y; + p[i].v = v; + p[i].u = u; + } + } + for (i = 0; i < 1024; ++i) + mp_set_zero_yuv(p + i * 32); +} + +static void motionpixels_tableinit(void) +{ + if (!mp_rgb_yuv_table[0].u) + mp_build_rgb_yuv_table(mp_rgb_yuv_table); +} +#endif /* CONFIG_HARDCODED_TABLES */ + +#endif /* MOTIONPIXELS_TABLEGEN_H */
--- a/tableprint.c Thu Nov 26 21:15:06 2009 +0000 +++ b/tableprint.c Thu Nov 26 21:20:28 2009 +0000 @@ -52,6 +52,7 @@ }\ } +WRITE_2D_FUNC(int8, int8_t) WRITE_2D_FUNC(uint32, uint32_t) int main(int argc, char *argv[])
--- a/tableprint.h Thu Nov 26 21:15:06 2009 +0000 +++ b/tableprint.h Thu Nov 26 21:20:28 2009 +0000 @@ -32,6 +32,7 @@ */ void write_int8_array (const void *, int, int); void write_uint32_array (const void *, int, int); +void write_int8_2d_array (const void *, int, int); void write_uint32_2d_array(const void *, int, int); /** \} */ // end of printfuncs group