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

📄 rgb2rgb.c

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/**
 * Pallete is assumed to contain bgr32
 */
void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;

/*
        for(i=0; i<num_pixels; i++)
                ((unsigned *)dst)[i] = ((unsigned *)palette)[ src[i] ];
*/

	for(i=0; i<num_pixels; i++)
	{
		#ifdef WORDS_BIGENDIAN
		dst[3]= palette[ src[i]*4+2 ];
		dst[2]= palette[ src[i]*4+1 ];
		dst[1]= palette[ src[i]*4+0 ];
		#else
		//FIXME slow?
		dst[0]= palette[ src[i]*4+2 ];
		dst[1]= palette[ src[i]*4+1 ];
		dst[2]= palette[ src[i]*4+0 ];
//		dst[3]= 0; /* do we need this cleansing? */
		#endif
		dst+= 4;
	}
}

void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
	for(i=0; i<num_pixels; i++)
	{
		#ifdef WORDS_BIGENDIAN
		dst[3]= palette[ src[i]*4+0 ];
		dst[2]= palette[ src[i]*4+1 ];
		dst[1]= palette[ src[i]*4+2 ];
		#else
		//FIXME slow?
		dst[0]= palette[ src[i]*4+0 ];
		dst[1]= palette[ src[i]*4+1 ];
		dst[2]= palette[ src[i]*4+2 ];
//		dst[3]= 0; /* do we need this cleansing? */
		#endif

		dst+= 4;
	}
}

/**
 * Pallete is assumed to contain bgr32
 */
void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
/*
        writes 1 byte o much and might cause alignment issues on some architectures?
        for(i=0; i<num_pixels; i++)
                ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[ src[i] ];
*/
        for(i=0; i<num_pixels; i++)
        {
                //FIXME slow?
		dst[0]= palette[ src[i]*4+2 ];
		dst[1]= palette[ src[i]*4+1 ];
		dst[2]= palette[ src[i]*4+0 ];
		dst+= 3;
	}
}

void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
/*
	writes 1 byte o much and might cause alignment issues on some architectures?
	for(i=0; i<num_pixels; i++)
		((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[ src[i] ];
*/
	for(i=0; i<num_pixels; i++)
	{
		//FIXME slow?
                dst[0]= palette[ src[i]*4+0 ];
                dst[1]= palette[ src[i]*4+1 ];
                dst[2]= palette[ src[i]*4+2 ];
                dst+= 3;
        }
}

/**
 * Palette is assumed to contain bgr16, see rgb32to16 to convert the palette
 */
void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
        for(i=0; i<num_pixels; i++)
                ((uint16_t *)dst)[i] = ((uint16_t *)palette)[ src[i] ];
}
void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
	for(i=0; i<num_pixels; i++)
		((uint16_t *)dst)[i] = bswap_16(((uint16_t *)palette)[ src[i] ]);
}

/**
 * Pallete is assumed to contain bgr15, see rgb32to15 to convert the palette
 */
void palette8torgb15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
        for(i=0; i<num_pixels; i++)
                ((uint16_t *)dst)[i] = ((uint16_t *)palette)[ src[i] ];
}
void palette8tobgr15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
{
	long i;
	for(i=0; i<num_pixels; i++)
		((uint16_t *)dst)[i] = bswap_16(((uint16_t *)palette)[ src[i] ]);
}

void rgb32tobgr24(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size >> 2;
	for(i=0; i<num_pixels; i++)
	{
		#ifdef WORDS_BIGENDIAN
			/* RGB32 (= A,B,G,R) -> BGR24 (= B,G,R) */
			dst[3*i + 0] = src[4*i + 1];
			dst[3*i + 1] = src[4*i + 2];
			dst[3*i + 2] = src[4*i + 3];
		#else
		dst[3*i + 0] = src[4*i + 2];
		dst[3*i + 1] = src[4*i + 1];
		dst[3*i + 2] = src[4*i + 0];
		#endif
	}
}

void rgb24tobgr32(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	for(i=0; 3*i<src_size; i++)
	{
		#ifdef WORDS_BIGENDIAN
			/* RGB24 (= R,G,B) -> BGR32 (= A,R,G,B) */
			dst[4*i + 0] = 0;
			dst[4*i + 1] = src[3*i + 0];
			dst[4*i + 2] = src[3*i + 1];
			dst[4*i + 3] = src[3*i + 2];
		#else
		dst[4*i + 0] = src[3*i + 2];
		dst[4*i + 1] = src[3*i + 1];
		dst[4*i + 2] = src[3*i + 0];
		dst[4*i + 3] = 0;
		#endif
	}
}

void rgb16tobgr32(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	const uint16_t *end;
	uint8_t *d = (uint8_t *)dst;
	const uint16_t *s = (uint16_t *)src;
	end = s + src_size/2;
	while(s < end)
	{
		register uint16_t bgr;
		bgr = *s++;
		#ifdef WORDS_BIGENDIAN
			*d++ = 0;
			*d++ = (bgr&0x1F)<<3;
			*d++ = (bgr&0x7E0)>>3;
			*d++ = (bgr&0xF800)>>8;
		#else
		*d++ = (bgr&0xF800)>>8;
		*d++ = (bgr&0x7E0)>>3;
		*d++ = (bgr&0x1F)<<3;
		*d++ = 0;
		#endif
	}
}

void rgb16tobgr24(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	const uint16_t *end;
	uint8_t *d = (uint8_t *)dst;
	const uint16_t *s = (const uint16_t *)src;
	end = s + src_size/2;
	while(s < end)
	{
		register uint16_t bgr;
		bgr = *s++;
		*d++ = (bgr&0xF800)>>8;
		*d++ = (bgr&0x7E0)>>3;
		*d++ = (bgr&0x1F)<<3;
	}
}

void rgb16tobgr16(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size >> 1;

	for(i=0; i<num_pixels; i++)
	{
	    unsigned b,g,r;
	    register uint16_t rgb;
	    rgb = ((uint16_t*)src)[i];
	    r = rgb&0x1F;
	    g = (rgb&0x7E0)>>5;
	    b = (rgb&0xF800)>>11;
	    ((uint16_t*)dst)[i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11);
	}
}

void rgb16tobgr15(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size >> 1;

	for(i=0; i<num_pixels; i++)
	{
	    unsigned b,g,r;
	    register uint16_t rgb;
	    rgb = ((uint16_t*)src)[i];
	    r = rgb&0x1F;
	    g = (rgb&0x7E0)>>5;
	    b = (rgb&0xF800)>>11;
	    ((uint16_t*)dst)[i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10);
	}
}

void rgb15tobgr32(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	const uint16_t *end;
	uint8_t *d = (uint8_t *)dst;
	const uint16_t *s = (const uint16_t *)src;
	end = s + src_size/2;
	while(s < end)
	{
		register uint16_t bgr;
		bgr = *s++;
		#ifdef WORDS_BIGENDIAN
			*d++ = 0;
			*d++ = (bgr&0x1F)<<3;
			*d++ = (bgr&0x3E0)>>2;
			*d++ = (bgr&0x7C00)>>7;
		#else
		*d++ = (bgr&0x7C00)>>7;
		*d++ = (bgr&0x3E0)>>2;
		*d++ = (bgr&0x1F)<<3;
		*d++ = 0;
		#endif
	}
}

void rgb15tobgr24(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	const uint16_t *end;
	uint8_t *d = (uint8_t *)dst;
	const uint16_t *s = (uint16_t *)src;
	end = s + src_size/2;
	while(s < end)
	{
		register uint16_t bgr;
		bgr = *s++;
		*d++ = (bgr&0x7C00)>>7;
		*d++ = (bgr&0x3E0)>>2;
		*d++ = (bgr&0x1F)<<3;
	}
}

void rgb15tobgr16(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size >> 1;

	for(i=0; i<num_pixels; i++)
	{
	    unsigned b,g,r;
	    register uint16_t rgb;
	    rgb = ((uint16_t*)src)[i];
	    r = rgb&0x1F;
	    g = (rgb&0x3E0)>>5;
	    b = (rgb&0x7C00)>>10;
	    ((uint16_t*)dst)[i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11);
	}
}

void rgb15tobgr15(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size >> 1;

	for(i=0; i<num_pixels; i++)
	{
	    unsigned b,g,r;
	    register uint16_t rgb;
	    rgb = ((uint16_t*)src)[i];
	    r = rgb&0x1F;
	    g = (rgb&0x3E0)>>5;
	    b = (rgb&0x7C00)>>10;
	    ((uint16_t*)dst)[i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10);
	}
}

void rgb8tobgr8(const uint8_t *src, uint8_t *dst, stride_t src_size)
{
	long i;
	stride_t num_pixels = src_size;
	for(i=0; i<num_pixels; i++)
	{
	    unsigned b,g,r;
	    register uint8_t rgb;
	    rgb = src[i];
	    r = (rgb&0x07);
	    g = (rgb&0x38)>>3;
	    b = (rgb&0xC0)>>6;
	    dst[i] = ((b<<1)&0x07) | ((g&0x07)<<3) | ((r&0x03)<<6);
	}
}

⌨️ 快捷键说明

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