⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rgb.c

📁 mpeg2 decoder filter过滤服务端
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * rgb.c * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> * * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. * See http://libmpeg2.sourceforge.net/ for updates. * * mpeg2dec 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. * * mpeg2dec 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-1307  USA */#include "config.h"#include "attributes.h"#include <inttypes.h>#include "mpeg2.h"#include "mpeg2convert.h"#include "convert_internal.h"static int matrix_coefficients = 6;static const int Inverse_Table_6_9[8][4] = {    {117504, 138453, 13954, 34903}, /* no sequence_display_extension */    {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */    {104597, 132201, 25675, 53279}, /* unspecified */    {104597, 132201, 25675, 53279}, /* reserved */    {104448, 132798, 24759, 53109}, /* FCC */    {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */    {104597, 132201, 25675, 53279}, /* SMPTE 170M */    {117579, 136230, 16907, 35559}  /* SMPTE 240M (1987) */};static const uint8_t dither[] ATTR_ALIGN(32) = {     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35,     3,  9, 27, 63,  1,  4, 25, 59,  5, 12, 28, 67,  3,  7, 26, 62,     3,  9, 27, 63,  1,  4, 25, 59,  5, 12, 28, 67,  3,  7, 26, 62,     3,  9, 27, 63,  1,  4, 25, 59,  5, 12, 28, 67,  3,  7, 26, 62,     3,  9, 27, 63,  1,  4, 25, 59,  5, 12, 28, 67,  3,  7, 26, 62,    19, 45, 11, 27, 17, 41,  9, 22, 21, 49, 13, 30, 19, 44, 11, 26,    19, 45, 11, 27, 17, 41,  9, 22, 21, 49, 13, 30, 19, 44, 11, 26,    19, 45, 11, 27, 17, 41,  9, 22, 21, 49, 13, 30, 19, 44, 11, 26,    19, 45, 11, 27, 17, 41,  9, 22, 21, 49, 13, 30, 19, 44, 11, 26,     0,  2, 24, 57,  6, 15, 30, 70,  0,  1, 23, 55,  6, 14, 29, 69,     0,  2, 24, 57,  6, 15, 30, 70,  0,  1, 23, 55,  6, 14, 29, 69,     0,  2, 24, 57,  6, 15, 30, 70,  0,  1, 23, 55,  6, 14, 29, 69,     0,  2, 24, 57,  6, 15, 30, 70,  0,  1, 23, 55,  6, 14, 29, 69,    16, 38,  8, 20, 22, 52, 14, 34, 16, 37,  8, 19, 21, 51, 14, 33,    16, 38,  8, 20, 22, 52, 14, 34, 16, 37,  8, 19, 21, 51, 14, 33,    16, 38,  8, 20, 22, 52, 14, 34, 16, 37,  8, 19, 21, 51, 14, 33,    16, 38,  8, 20, 22, 52, 14, 34, 16, 37,  8, 19, 21, 51, 14, 33,     4, 11, 28, 66,  2,  6, 26, 61,  4, 10, 27, 65,  2,  5, 25, 60,     4, 11, 28, 66,  2,  6, 26, 61,  4, 10, 27, 65,  2,  5, 25, 60,     4, 11, 28, 66,  2,  6, 26, 61,  4, 10, 27, 65,  2,  5, 25, 60,     4, 11, 28, 66,  2,  6, 26, 61,  4, 10, 27, 65,  2,  5, 25, 60,    20, 47, 12, 29, 18, 43, 10, 25, 20, 46, 12, 28, 18, 42, 10, 23,    20, 47, 12, 29, 18, 43, 10, 25, 20, 46, 12, 28, 18, 42, 10, 23,    20, 47, 12, 29, 18, 43, 10, 25, 20, 46, 12, 28, 18, 42, 10, 23,    20, 47, 12, 29, 18, 43, 10, 25, 20, 46, 12, 28, 18, 42, 10, 23,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,     0,  0, 23, 54,  5, 13, 29, 68,  1,  3, 24, 58,  7, 17, 30, 71,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35,    15, 36,  7, 18, 21, 50, 13, 31, 17, 39,  9, 21, 22, 53, 15, 35};static const uint8_t dither_temporal[64] = {    0x00, 0x20, 0x21, 0x01, 0x40, 0x60, 0x61, 0x41,    0x42, 0x62, 0x63, 0x43, 0x02, 0x22, 0x23, 0x03,    0x80, 0xa0, 0xa1, 0x81, 0xc0, 0xe0, 0xe1, 0xc1,    0xc2, 0xe2, 0xe3, 0xc3, 0x82, 0xa2, 0xa3, 0x83,    0x84, 0xa4, 0xa5, 0x85, 0xc4, 0xe4, 0xe5, 0xc5,    0xc6, 0xe6, 0xe7, 0xc7, 0x86, 0xa6, 0xa7, 0x87,    0x04, 0x24, 0x25, 0x05, 0x44, 0x64, 0x65, 0x45,    0x46, 0x66, 0x67, 0x47, 0x06, 0x26, 0x27, 0x07};typedef struct {    convert_rgb_t base;    void * table_rV[256];    void * table_gU[256];    int table_gV[256];    void * table_bU[256];} convert_rgb_c_t;#define RGB(type,i)							\    U = pu[i];								\    V = pv[i];								\    r = (type *) id->table_rV[V];					\    g = (type *) (((uint8_t *)id->table_gU[U]) + id->table_gV[V]);	\    b = (type *) id->table_bU[U];#define DST(py,dst,i,j)			\    Y = py[i];				\    dst[i] = r[Y] + g[Y] + b[Y];#define DSTRGB(py,dst,i,j)					\    Y = py[i];							\    dst[3*i] = r[Y]; dst[3*i+1] = g[Y]; dst[3*i+2] = b[Y];#define DSTBGR(py,dst,i,j)					\    Y = py[i];							\    dst[3*i] = b[Y]; dst[3*i+1] = g[Y]; dst[3*i+2] = r[Y];#define DSTDITHER(py,dst,i,j)						  \    Y = py[i];								  \    dst[i] = r[Y+pd[2*i+96*j]] + g[Y-pd[2*i+96*j]] + b[Y+pd[2*i+1+96*j]];#define DO(x) x#define SKIP(x)#define DECLARE_420(func,type,num,DST,DITHER)				\static void func (void * _id, uint8_t * const * src,			\		  unsigned int v_offset)				\{									\    const convert_rgb_c_t * const id = (convert_rgb_c_t *) _id;		\    type * dst_1;							\    const uint8_t * py_1, * pu, * pv;					\    int i;								\    DITHER(uint8_t dithpos = id->base.dither_offset;)			\									\    dst_1 = (type *)(id->base.rgb_ptr + id->base.rgb_stride * v_offset);\    py_1 = src[0];	pu = src[1];	pv = src[2];			\									\    i = 8;								\    do {								\	const uint8_t * py_2;						\	int j, U, V, Y;							\	const type * r, * g, * b;					\	type * dst_2;							\	DITHER(const uint8_t * const pd = dither + 2 * dithpos;)	\									\	dst_2 = (type *)((char *)dst_1 + id->base.rgb_stride);		\	py_2 = py_1 + id->base.y_stride;				\	j = id->base.width;						\	do {								\	    RGB (type, 0)						\	    DST (py_1, dst_1, 0, 0)					\	    DST (py_1, dst_1, 1, 0)					\	    DST (py_2, dst_2, 0, 1)					\	    DST (py_2, dst_2, 1, 1)					\									\	    RGB (type, 1)						\	    DST (py_2, dst_2, 2, 1)					\	    DST (py_2, dst_2, 3, 1)					\	    DST (py_1, dst_1, 2, 0)					\	    DST (py_1, dst_1, 3, 0)					\									\	    RGB (type, 2)						\	    DST (py_1, dst_1, 4, 0)					\	    DST (py_1, dst_1, 5, 0)					\	    DST (py_2, dst_2, 4, 1)					\	    DST (py_2, dst_2, 5, 1)					\									\	    RGB (type, 3)						\	    DST (py_2, dst_2, 6, 1)					\	    DST (py_2, dst_2, 7, 1)					\	    DST (py_1, dst_1, 6, 0)					\	    DST (py_1, dst_1, 7, 0)					\									\	    pu += 4;							\	    pv += 4;							\	    py_1 += 8;							\	    py_2 += 8;							\	    dst_1 += 8 * num;						\	    dst_2 += 8 * num;						\	} while (--j);							\	py_1 += id->base.y_increm;					\	pu += id->base.uv_increm;					\	pv += id->base.uv_increm;					\	dst_1 = (type *)((char *)dst_1 + id->base.rgb_increm);		\	DITHER(dithpos += id->base.dither_stride;)			\    } while (--i);							\}DECLARE_420 (rgb_c_32_420, uint32_t, 1, DST, SKIP)DECLARE_420 (rgb_c_24_rgb_420, uint8_t, 3, DSTRGB, SKIP)DECLARE_420 (rgb_c_24_bgr_420, uint8_t, 3, DSTBGR, SKIP)DECLARE_420 (rgb_c_16_420, uint16_t, 1, DST, SKIP)DECLARE_420 (rgb_c_8_420, uint8_t, 1, DSTDITHER, DO)#define DECLARE_422(func,type,num,DST,DITHER)				\static void func (void * _id, uint8_t * const * src,			\		  unsigned int v_offset)				\{									\    const convert_rgb_c_t * const id = (convert_rgb_c_t *) _id;		\    type * dst;								\    const uint8_t * py, * pu, * pv;					\    int i;								\    DITHER(uint8_t dithpos = id->base.dither_offset;)			\									\    dst = (type *)(id->base.rgb_ptr + id->base.rgb_stride * v_offset);	\    py = src[0];	pu = src[1];	pv = src[2];			\									\    i = 16;								\    do {								\	int j, U, V, Y;							\	const type * r, * g, * b;					\	DITHER(const uint8_t * const pd = dither + 2 * dithpos;)	\									\	j = id->base.width;						\	do {								\	    RGB (type, 0)						\	    DST (py, dst, 0, 0)						\	    DST (py, dst, 1, 0)						\									\	    RGB (type, 1)						\	    DST (py, dst, 2, 0)						\	    DST (py, dst, 3, 0)						\									\	    RGB (type, 2)						\	    DST (py, dst, 4, 0)						\	    DST (py, dst, 5, 0)						\									\	    RGB (type, 3)						\	    DST (py, dst, 6, 0)						\	    DST (py, dst, 7, 0)						\									\	    pu += 4;							\	    pv += 4;							\	    py += 8;							\	    dst += 8 * num;						\	} while (--j);							\	py += id->base.y_increm;					\	pu += id->base.uv_increm;					\	pv += id->base.uv_increm;					\	dst = (type *)((char *)dst + id->base.rgb_increm);		\	DITHER(dithpos += id->base.dither_stride;)			\    } while (--i);							\}DECLARE_422 (rgb_c_32_422, uint32_t, 1, DST, SKIP)DECLARE_422 (rgb_c_24_rgb_422, uint8_t, 3, DSTRGB, SKIP)DECLARE_422 (rgb_c_24_bgr_422, uint8_t, 3, DSTBGR, SKIP)DECLARE_422 (rgb_c_16_422, uint16_t, 1, DST, SKIP)DECLARE_422 (rgb_c_8_422, uint8_t, 1, DSTDITHER, DO)#define DECLARE_444(func,type,num,DST,DITHER)				\static void func (void * _id, uint8_t * const * src,			\		  unsigned int v_offset)				\{									\    const convert_rgb_c_t * const id = (convert_rgb_c_t *) _id;		\    type * dst;								\    const uint8_t * py, * pu, * pv;					\    int i;								\    DITHER(uint8_t dithpos = id->base.dither_offset;)			\									\    dst = (type *)(id->base.rgb_ptr + id->base.rgb_stride * v_offset);	\    py = src[0];	pu = src[1];	pv = src[2];			\									\    i = 16;								\    do {								\	int j, U, V, Y;							\	const type * r, * g, * b;					\	DITHER(const uint8_t * const pd = dither + 2 * dithpos;)	\									\	j = id->base.width;						\	do {								\	    RGB (type, 0)						\	    DST (py, dst, 0, 0)						\	    RGB (type, 1)						\	    DST (py, dst, 1, 0)						\	    RGB (type, 2)						\	    DST (py, dst, 2, 0)						\	    RGB (type, 3)						\	    DST (py, dst, 3, 0)						\	    RGB (type, 4)						\	    DST (py, dst, 4, 0)						\	    RGB (type, 5)						\	    DST (py, dst, 5, 0)						\	    RGB (type, 6)						\	    DST (py, dst, 6, 0)						\	    RGB (type, 7)						\	    DST (py, dst, 7, 0)						\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -