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 + -
显示快捷键?