yading@10: /* yading@10: * Header file for hardcoded motionpixels RGB to YUV table yading@10: * yading@10: * Copyright (c) 2009 Reimar Döffinger yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #ifndef AVCODEC_MOTIONPIXELS_TABLEGEN_H yading@10: #define AVCODEC_MOTIONPIXELS_TABLEGEN_H yading@10: yading@10: #include yading@10: yading@10: typedef struct YuvPixel { yading@10: int8_t y, v, u; yading@10: } YuvPixel; yading@10: yading@10: static int mp_yuv_to_rgb(int y, int v, int u, int clip_rgb) { yading@10: const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; yading@10: int r, g, b; yading@10: yading@10: r = (1000 * y + 701 * v) / 1000; yading@10: g = (1000 * y - 357 * v - 172 * u) / 1000; yading@10: b = (1000 * y + 886 * u) / 1000; yading@10: if (clip_rgb) yading@10: return ((cm[r * 8] & 0xF8) << 7) | ((cm[g * 8] & 0xF8) << 2) | (cm[b * 8] >> 3); yading@10: if ((unsigned)r < 32 && (unsigned)g < 32 && (unsigned)b < 32) yading@10: return (r << 10) | (g << 5) | b; yading@10: return 1 << 15; yading@10: } yading@10: yading@10: #if CONFIG_HARDCODED_TABLES yading@10: #define motionpixels_tableinit() yading@10: #include "libavcodec/motionpixels_tables.h" yading@10: #else yading@10: static YuvPixel mp_rgb_yuv_table[1 << 15]; yading@10: yading@10: static void mp_set_zero_yuv(YuvPixel *p) yading@10: { yading@10: int i, j; yading@10: yading@10: for (i = 0; i < 31; ++i) { yading@10: for (j = 31; j > i; --j) yading@10: if (!(p[j].u | p[j].v | p[j].y)) yading@10: p[j] = p[j - 1]; yading@10: for (j = 0; j < 31 - i; ++j) yading@10: if (!(p[j].u | p[j].v | p[j].y)) yading@10: p[j] = p[j + 1]; yading@10: } yading@10: } yading@10: yading@10: static void mp_build_rgb_yuv_table(YuvPixel *p) yading@10: { yading@10: int y, v, u, i; yading@10: yading@10: for (y = 0; y <= 31; ++y) yading@10: for (v = -31; v <= 31; ++v) yading@10: for (u = -31; u <= 31; ++u) { yading@10: i = mp_yuv_to_rgb(y, v, u, 0); yading@10: if (i < (1 << 15) && !(p[i].u | p[i].v | p[i].y)) { yading@10: p[i].y = y; yading@10: p[i].v = v; yading@10: p[i].u = u; yading@10: } yading@10: } yading@10: for (i = 0; i < 1024; ++i) yading@10: mp_set_zero_yuv(p + i * 32); yading@10: } yading@10: yading@10: static void motionpixels_tableinit(void) yading@10: { yading@10: if (!mp_rgb_yuv_table[0].u) yading@10: mp_build_rgb_yuv_table(mp_rgb_yuv_table); yading@10: } yading@10: #endif /* CONFIG_HARDCODED_TABLES */ yading@10: yading@10: #endif /* AVCODEC_MOTIONPIXELS_TABLEGEN_H */