cmodel_permutation.h
来自「这个库实现了录象功能」· C头文件 代码 · 共 1,907 行 · 第 1/4 页
H
1,907 行
/******************************************************************************* cmodel_permutation.h libquicktime - A library for reading and writing quicktime/avi/mp4 files. http://libquicktime.sourceforge.net Copyright (C) 2002 Heroine Virtual Ltd. Copyright (C) 2002-2007 Members of the libquicktime project. This library 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. This library 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 this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA*******************************************************************************/#include "colorspace_tables.h"#include "colorspace_macros.h"#include <quicktime/colormodels.h>#include <inttypes.h>// ****************************** Pixel transfers *****************************// *************************** RGB565 -> ************************************static inline void transfer_RGB565_to_RGB565(uint16_t *(*output), uint16_t *input){ *(*output) = *input; (*output) ++;}static inline void transfer_RGB565_to_RGB888(unsigned char *(*output), uint16_t *input){ (*output)[0] = RGB16_TO_R_8(*input); (*output)[1] = RGB16_TO_G_8(*input); (*output)[2] = RGB16_TO_B_8(*input); (*output) +=3;}// *************************** BGR565 -> ************************************static inline void transfer_BGR565_to_BGR565(uint16_t *(*output), uint16_t *input){ *(*output) = *input; (*output) ++;}static inline void transfer_BGR565_to_RGB888(unsigned char *(*output), uint16_t *input){ (*output)[0] = BGR16_TO_R_8(*input); (*output)[1] = BGR16_TO_G_8(*input); (*output)[2] = BGR16_TO_B_8(*input); (*output) +=3;}// *************************** RGB888 -> ************************************static inline void transfer_RGB888_to_BGR565(uint16_t *(*output), unsigned char *input){ PACK_8_TO_BGR16(input[0], input[1], input[2], *(*output)); (*output) ++;}static inline void transfer_RGB888_to_RGB565(uint16_t *(*output), unsigned char *input){ PACK_8_TO_RGB16(input[0], input[1], input[2], *(*output)); (*output) ++;}static inline void transfer_RGB888_to_BGR888(unsigned char *(*output), unsigned char *input){ (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 3;}static inline void transfer_RGB888_to_RGB888(unsigned char *(*output), unsigned char *input){ (*output)[0] = input[0]; (*output)[1] = input[1]; (*output)[2] = input[2]; (*output) += 3;}static inline void transfer_RGB888_to_RGBA8888(unsigned char *(*output), unsigned char *input){ (*output)[0] = input[0]; (*output)[1] = input[1]; (*output)[2] = input[2]; (*output)[3] = 0xff; (*output) += 4;}static inline void transfer_RGB888_to_RGB161616(uint16_t *(*output), unsigned char *input){ (*output)[0] = (input[0] << 8) | input[0]; (*output)[1] = (input[1] << 8) | input[1]; (*output)[2] = (input[2] << 8) | input[2]; (*output) += 3;}static inline void transfer_RGB888_to_RGBA16161616(uint16_t *(*output), unsigned char *input){ (*output)[0] = (input[0] << 8) | input[0]; (*output)[1] = (input[1] << 8) | input[1]; (*output)[2] = (input[2] << 8) | input[2]; (*output)[3] = 0xffff; (*output) += 4;}static inline void transfer_RGB888_to_BGR8888(unsigned char *(*output), unsigned char *input){ (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 4;}static inline void transfer_RGB888_to_YUVA8888(unsigned char *(*output), unsigned char *input){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); (*output)[0] = y; (*output)[1] = u; (*output)[2] = v; (*output)[3] = 255; (*output) += 4;}static inline void transfer_RGB888_to_YUVA16161616(uint16_t *(*output), unsigned char *input){ RGB_24_TO_YUV_16(input[0], input[1], input[2], (*output)[0], (*output)[1], (*output)[2]); (*output)[3] = 0xffff; (*output) += 4;}static inline void transfer_RGB888_to_YUV420P_YUV422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column / 2] = u; output_v[output_column / 2] = v;}static inline void transfer_RGB888_to_YUVJ420P_YUVJ422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUVJ_8(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column / 2] = u; output_v[output_column / 2] = v;}static inline void transfer_RGB888_to_YUV422P16(uint16_t *output_y, uint16_t *output_u, uint16_t *output_v, unsigned char *input, int output_column){ RGB_24_TO_YUV_16(input[0], input[1], input[2], output_y[output_column], output_u[output_column/2], output_v[output_column/2]);}static inline void transfer_RGB888_to_YUV411P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column / 4] = u; output_v[output_column / 4] = v;}static inline void transfer_RGB888_to_YUV444P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column] = u; output_v[output_column] = v;}static inline void transfer_RGB888_to_YUVJ444P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUVJ_8(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column] = u; output_v[output_column] = v;}static inline void transfer_RGB888_to_YUV444P16(uint16_t *output_y, uint16_t *output_u, uint16_t *output_v, unsigned char *input, int output_column){ int y, u, v; RGB_24_TO_YUV_16(input[0], input[1], input[2], y, u, v); output_y[output_column] = y; output_u[output_column] = u; output_v[output_column] = v;}static inline void transfer_RGB888_to_YUV422(unsigned char *(*output), unsigned char *input, int j){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); if(!(j & 1)) { // Store U and V for even pixels only (*output)[1] = u; (*output)[3] = v; (*output)[0] = y; } else { // Store Y and advance output for odd pixels only (*output)[2] = y; (*output) += 4; }}// *************************** RGBA8888 -> ************************************// These routines blend in a black backgroundstatic inline void transfer_RGBA8888_to_BGR565(uint16_t *(*output), unsigned char *input){ unsigned int r, g, b, a; a = input[3]; r = ((unsigned int)input[0] * a) >> 8; g = ((unsigned int)input[1] * a) >> 8; b = ((unsigned int)input[2] * a) >> 8; PACK_8_TO_BGR16(r, g, b, *(*output)); (*output) ++;}static inline void transfer_RGBA8888_to_RGB565(uint16_t *(*output), unsigned char *input){ unsigned int r, g, b, a; a = input[3]; r = ((unsigned int)input[0] * a)>> 8; g = ((unsigned int)input[1] * a)>> 8; b = ((unsigned int)input[2] * a)>> 8; PACK_8_TO_RGB16(r, g, b, *(*output)); (*output) ++;}static inline void transfer_RGBA8888_to_BGR888(unsigned char *(*output), unsigned char *input){ unsigned int r, g, b, a; a = input[3]; r = ((unsigned int)input[0] * a)>> 8; g = ((unsigned int)input[1] * a)>> 8; b = ((unsigned int)input[2] * a)>> 8; (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 3;}static inline void transfer_RGBA8888_to_RGB888(unsigned char *(*output), unsigned char *input){ unsigned int r, g, b, a; a = input[3]; r = ((unsigned int)input[0] * a)>> 8; g = ((unsigned int)input[1] * a)>> 8; b = ((unsigned int)input[2] * a)>> 8; (*output)[0] = r; (*output)[1] = g; (*output)[2] = b; (*output) += 3;}static inline void transfer_RGBA8888_to_RGBA8888(unsigned char *(*output), unsigned char *input){ (*output)[0] = input[0]; (*output)[1] = input[1]; (*output)[2] = input[2]; (*output)[3] = input[3]; (*output) += 4;}static inline void transfer_RGBA8888_to_RGB161616(uint16_t *(*output), unsigned char *input){ int opacity; opacity = input[3]; (*output)[0] = (((int)input[0] << 8) | input[0]) * opacity / 0xff; (*output)[1] = (((int)input[1] << 8) | input[1]) * opacity / 0xff; (*output)[2] = (((int)input[2] << 8) | input[2]) * opacity / 0xff; (*output) += 3;}static inline void transfer_RGBA8888_to_RGBA16161616(uint16_t *(*output), unsigned char *input){ (*output)[0] = (((int)input[0]) << 8) | input[0]; (*output)[1] = (((int)input[1]) << 8) | input[1]; (*output)[2] = (((int)input[2]) << 8) | input[2]; (*output)[3] = (((int)input[3]) << 8) | input[3]; (*output) += 4;}static inline void transfer_RGBA8888_to_BGR8888(unsigned char *(*output), unsigned char *input){ unsigned int r, g, b, a; a = input[3]; r = ((unsigned int)input[0] * a)>> 8; g = ((unsigned int)input[1] * a)>> 8; b = ((unsigned int)input[2] * a)>> 8; (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 4;}static inline void transfer_RGBA8888_to_YUVA8888(unsigned char *(*output), unsigned char *input){ int y, u, v; RGB_24_TO_YUV_8(input[0], input[1], input[2], y, u, v); (*output)[0] = y; (*output)[1] = u; (*output)[2] = v; (*output)[3] = input[3]; (*output) += 4;}static inline void transfer_RGBA8888_to_YUVA16161616(uint16_t *(*output), unsigned char *input){ int r, g, b; r = (((int)input[0]) << 8) | input[0]; g = (((int)input[1]) << 8) | input[1]; b = (((int)input[2]) << 8) | input[2]; RGB_24_TO_YUV_16(input[0], input[1], input[2], (*output)[0], (*output)[1], (*output)[2]); (*output)[3] = RGB_8_TO_16(input[3]); (*output) += 4;}static inline void transfer_RGBA888_to_YUV420P_YUV422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column) { int y, u, v, a, r, g, b; a = input[3]; r = (input[0] * a)>> 8; g = (input[1] * a)>> 8; b = (input[2] * a)>> 8; RGB_24_TO_YUV_8(r, g, b, y, u, v); output_y[output_column] = y; output_u[output_column / 2] = u; output_v[output_column / 2] = v;}static inline void transfer_RGBA888_to_YUV444P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column){ int y, u, v, a, r, g, b; a = input[3]; r = (input[0] * a)>> 8; g = (input[1] * a)>> 8; b = (input[2] * a)>> 8; RGB_24_TO_YUV_8(r, g, b, y, u, v); output_y[output_column] = y; output_u[output_column] = u; output_v[output_column] = v; }static inline void transfer_RGBA888_to_YUV422(unsigned char *(*output), unsigned char *input, int j){ int y, u, v, a, r, g, b; a = input[3]; r = (input[0] * a)>> 8; g = (input[1] * a)>> 8; b = (input[2] * a)>> 8; RGB_24_TO_YUV_8(r, g, b, y, u, v); if(!(j & 1)) { // Store U and V for even pixels only (*output)[1] = u; (*output)[3] = v; (*output)[0] = y; } else { // Store Y and advance output for odd pixels only (*output)[2] = y;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?