diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 094cceda50..b5c2d2f30b 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -718,4 +718,5 @@ $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF) ifdef CONFIG_HARDCODED_TABLES $(SUBDIR)mpegaudiodec.o: $(SUBDIR)mpegaudio_tables.h +$(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h endif diff --git a/libavcodec/motionpixels.c b/libavcodec/motionpixels.c index a0f0d1a455..ac9c6ecf81 100644 --- a/libavcodec/motionpixels.c +++ b/libavcodec/motionpixels.c @@ -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 @@ typedef struct MotionPixelsContext { 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); diff --git a/libavcodec/motionpixels_tablegen.c b/libavcodec/motionpixels_tablegen.c new file mode 100644 index 0000000000..188384b5a3 --- /dev/null +++ b/libavcodec/motionpixels_tablegen.c @@ -0,0 +1,44 @@ +/* + * Generate a header file for hardcoded motionpixels RGB to YUV table + * + * Copyright (c) 2009 Reimar Döffinger + * + * 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 +#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 } +}; diff --git a/libavcodec/motionpixels_tablegen.h b/libavcodec/motionpixels_tablegen.h new file mode 100644 index 0000000000..5d6df52af1 --- /dev/null +++ b/libavcodec/motionpixels_tablegen.h @@ -0,0 +1,91 @@ +/* + * Header file for hardcoded motionpixels RGB to YUV table + * + * Copyright (c) 2009 Reimar Döffinger + * + * 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 + +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 */ diff --git a/libavcodec/tableprint.c b/libavcodec/tableprint.c index 87387a86a9..4f94c6a53f 100644 --- a/libavcodec/tableprint.c +++ b/libavcodec/tableprint.c @@ -52,6 +52,7 @@ void write_##name##_2d_array(const void *arg, int len, int len2)\ }\ } +WRITE_2D_FUNC(int8, int8_t) WRITE_2D_FUNC(uint32, uint32_t) int main(int argc, char *argv[]) diff --git a/libavcodec/tableprint.h b/libavcodec/tableprint.h index c925c32b54..e73a9e20b3 100644 --- a/libavcodec/tableprint.h +++ b/libavcodec/tableprint.h @@ -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