pixmap.h
来自「VLC媒体播放程序」· C头文件 代码 · 共 165 行
H
165 行
/***************************************************************************** * Common pixel/chroma manipulation routines. ***************************************************************************** * Copyright (C) 2003, 2004 VideoLAN * $Id: pixmap.h,v 1.6 2004/01/31 23:33:02 rocky Exp $ * * Author: Rocky Bernstein * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/#ifndef PIXMAP_H#define PIXMAP_H /** Color and transparency of a pixel or a palette (CLUT) entry */typedef union { uint8_t plane[4]; struct { uint8_t y; uint8_t v; uint8_t u; uint8_t t; } s;} ogt_yuvt_t;/** An undefined or invalid colormap index. */#define INVALID_CMAP_ENTRY -1/** Type of a palette/colormap index*/typedef int16_t cmap_t;/** Number of entries in RGB palette/colormap*/#define CMAP_RGB2_SIZE 256/** Force v in the range 0..255. In video_chroma/i420_rgb.c, this is macro is called CLIP. FIXME: Combine with that.*/#define clip_8_bit(v) \ ((v < 0) ? 0 : (v > 255) ? 255 : v)/** Color conversion from http://www.inforamp.net/~poynton/notes/colour_and_gamma/ColorFAQ.html#RTFToC30 http://people.ee.ethz.ch/~buc/brechbuehler/mirror/color/ColorFAQ.html Thanks to Billy Biggs <vektor@dumbterm.net> for the pointer and the following conversion. R' = [ 1.1644 0 1.5960 ] ([ Y' ] [ 16 ]) G' = [ 1.1644 -0.3918 -0.8130 ] * ([ Cb ] - [ 128 ]) B' = [ 1.1644 2.0172 0 ] ([ Cr ] [ 128 ]) See also vlc/modules/video_chroma/i420_rgb.h and vlc/modules/video_chroma/i420_rgb_c.h for a way to do this in a way more optimized for integer arithmetic. Would be nice to merge the two routines. *//** Convert a YUV pixel into an RGB pixel. */static inline voidyuv2rgb(const ogt_yuvt_t *p_yuv, uint8_t *p_rgb_out ){ int i_Y = p_yuv->s.y - 16; int i_Cb = p_yuv->s.v - 128; int i_Cr = p_yuv->s.u - 128; int i_red = (1.1644 * i_Y) + (1.5960 * i_Cr); int i_green = (1.1644 * i_Y) - (0.3918 * i_Cb) - (0.8130 * i_Cr); int i_blue = (1.1644 * i_Y) + (2.0172 * i_Cb); i_red = clip_8_bit( i_red ); i_green = clip_8_bit( i_green ); i_blue = clip_8_bit( i_blue ); #ifdef WORDS_BIGENDIAN *p_rgb_out++ = i_red; *p_rgb_out++ = i_green; *p_rgb_out++ = i_blue;#else *p_rgb_out++ = i_blue; *p_rgb_out++ = i_green; *p_rgb_out++ = i_red;#endif }/* The byte storage of an RGB pixel. */ #define RGB_SIZE 3#define GREEN_PIXEL 1#ifdef WORDS_BIGENDIAN#define RED_PIXEL 0#define BLUE_PIXEL 2#else#define RED_PIXEL 2#define BLUE_PIXEL 0#endif/** Store an RGB pixel into the location of p_pixel, taking into account the "Endian"-ness of the underlying machine. (N.B. Not sure if I've got this right or this is the right thing to do.) */static inline voidput_rgb24_pixel(const uint8_t *rgb, /*out*/ uint8_t *p_pixel){#ifdef WORDS_BIGENDIAN *p_pixel++;#endif *p_pixel++ = rgb[RED_PIXEL]; *p_pixel++ = rgb[GREEN_PIXEL]; *p_pixel++ = rgb[BLUE_PIXEL];}/** Find the nearest colormap entry in p_vout (assumed to have RGB2 chroma, i.e. 256 RGB 8bpp entries) that is closest in color to p_rgb. Set out_rgb to the color found and return the colormap index. INVALID_CMAP_ENTRY is returned if there is some error.*/cmap_tfind_cmap_rgb8_nearest(const vout_thread_t *p_vout, const uint8_t *p_rgb, /*out*/ uint8_t *out_rgb);/** Get the the rgb value for a given colormap entry for p_vout (which is' assumed to have RGB2 chroma). VLC_FALSE is returned if there was some error.*/vlc_bool_tquery_color(const vout_thread_t *p_vout, cmap_t i_cmap, /*out*/ uint8_t *rgb);#endif /* PIXMAP_H *//* * Local variables: * c-file-style: "gnu" * tab-width: 8 * indent-tabs-mode: nil * End: */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?