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

📄 frame.c

📁 由bmp生成mpeg2 的I_frame 数据
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************
                  YUV frame treating module
 *******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FRAME_C
#include "frame.h"

const unsigned char uchar_clip_table[1024] = {
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  0,  0,  0,  0,  0,  0,  0,
	  0,  1,  2,  3,  4,  5,  6,  7,
	  8,  9, 10, 11, 12, 13, 14, 15,
	 16, 17, 18, 19, 20, 21, 22, 23,
	 24, 25, 26, 27, 28, 29, 30, 31,
	 32, 33, 34, 35, 36, 37, 38, 39,
	 40, 41, 42, 43, 44, 45, 46, 47,
	 48, 49, 50, 51, 52, 53, 54, 55,
	 56, 57, 58, 59, 60, 61, 62, 63,
	 64, 65, 66, 67, 68, 69, 70, 71,
	 72, 73, 74, 75, 76, 77, 78, 79,
	 80, 81, 82, 83, 84, 85, 86, 87,
	 88, 89, 90, 91, 92, 93, 94, 95,
	 96, 97, 98, 99,100,101,102,103,
	104,105,106,107,108,109,110,111,
	112,113,114,115,116,117,118,119,
	120,121,122,123,124,125,126,127,
	128,129,130,131,132,133,134,135,
	136,137,138,139,140,141,142,143,
	144,145,146,147,148,149,150,151,
	152,153,154,155,156,157,158,159,
	160,161,162,163,164,165,166,167,
	168,169,170,171,172,173,174,175,
	176,177,178,179,180,181,182,183,
	184,185,186,187,188,189,190,191,
	192,193,194,195,196,197,198,199,
	200,201,202,203,204,205,206,207,
	208,209,210,211,212,213,214,215,
	216,217,218,219,220,221,222,223,
	224,225,226,227,228,229,230,231,
	232,233,234,235,236,237,238,239,
	240,241,242,243,244,245,246,247,
	248,249,250,251,252,253,254,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
	255,255,255,255,255,255,255,255,
};

FRAME *new_frame(int width, int height);
void delete_frame(FRAME *p);
FRAME *copy_frame(FRAME *in);

void upsample_chroma_none(FRAME *p);

void upsample_chroma_420i(FRAME *p);
void upsample_chroma_420p(FRAME *p);

void upsample_chroma_420i_mmx(FRAME *p);
void upsample_chroma_420p_mmx(FRAME *p);

void upsample_chroma_420i_sse2(FRAME *p);
void upsample_chroma_420p_sse2(FRAME *p);

void __stdcall yuv444_to_bgr(FRAME *top, FRAME *bottom, unsigned char *out, BGR_CONVERSION_PARAMETER *prm);
void __stdcall yuv422_to_bgr(FRAME *top, FRAME *bottom, unsigned char *out, BGR_CONVERSION_PARAMETER *prm);
void __stdcall yuv444_to_yuy2(FRAME *top, FRAME *bottom, unsigned char *out, CONVERSION_PARAMETER *prm);
void __stdcall yuv422_to_yuy2(FRAME *top, FRAME *bottom, unsigned char *out, CONVERSION_PARAMETER *prm);

void __stdcall yuy2_convert(unsigned char *yuy2, int step, int height, YUY2_CONVERSION_PARAMETER *prm);
void __stdcall yuy2_convert_none(unsigned char *yuy2, int step, int height, YUY2_CONVERSION_PARAMETER *prm);

static void chroma420i_to_422(unsigned char *data, int width, int height);
static void chroma420p_to_422(unsigned char *data, int width, int height);

extern void __stdcall chroma420i_to_422_mmx(unsigned char *data, int width, int height);
extern void __stdcall chroma420p_to_422_mmx(unsigned char *data, int width, int height);

extern void __stdcall chroma420i_to_422_sse2(unsigned char *data, int width, int height);
extern void __stdcall chroma420p_to_422_sse2(unsigned char *data, int width, int height);

FRAME *new_frame(int width, int height)
{
	FRAME *r;

	r = (FRAME *)malloc(sizeof(FRAME));
	if(r == NULL){
		return NULL;
	}

	r->width = width;
	r->height = height;

	r->ref_count = 1;

	r->p = (unsigned char *)malloc(width * height * 3 + 16);
	if(r->p == NULL){
		free(r);
		return NULL;
	}

	r->y = r->p + 16 - ( ((long)r->p) & 0xf);
	r->u = r->y + (width * height);
	r->v = r->u + (width * height);

	return r;
}

FRAME *copy_frame(FRAME *in)
{
	FRAME *r;

	if(in == NULL){
		return NULL;
	}

	r = new_frame(in->width, in->height);

	if(r == NULL){
		return NULL;
	}

	memcpy(r->y, in->y, in->width * in->height);
	memcpy(r->u, in->u, in->width * in->height);
	memcpy(r->v, in->v, in->width * in->height);
	
	return r;
}

void delete_frame(FRAME *p)
{
	p->ref_count -= 1;

	if(p->ref_count == 0){
		free(p->p);
		free(p);
	}
}

void __stdcall yuv444_to_bgr(FRAME *top, FRAME *bottom, unsigned char *out, BGR_CONVERSION_PARAMETER *prm)
{
	int i, j;
	unsigned char *yt, *ut, *vt;
	unsigned char *yb, *ub, *vb;
	unsigned char *r, *g, *b;

	yt = top->y;
	ut = top->u;
	vt = top->v;

	yb = bottom->y + prm->prm.in_step;
	ub = bottom->u + prm->prm.in_step;
	vb = bottom->v + prm->prm.in_step;

	b = out;
	g = out+1;
	r = out+2;

	for(i=0;i<prm->prm.height/2;i++){
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->bu * (((int)ut[j]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->gu * (((int)ut[j]) - 128) + prm->gv * (((int)vt[j]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->rv * (((int)vt[j]) - 128)) >> 16)];
		}
		yt += prm->prm.in_step*2;
		ut += prm->prm.in_step*2;
		vt += prm->prm.in_step*2;
		b += prm->prm.out_step;
		g += prm->prm.out_step;
		r += prm->prm.out_step;
		
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->bu * (((int)ub[j]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->gu * (((int)ub[j]) - 128) + prm->gv * (((int)vb[j]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->rv * (((int)vb[j]) - 128)) >> 16)];
		}
		yb += prm->prm.in_step*2;
		ub += prm->prm.in_step*2;
		vb += prm->prm.in_step*2;
		b += prm->prm.out_step;
		g += prm->prm.out_step;
		r += prm->prm.out_step;
	}

	if(prm->prm.height%2){
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->bu * (((int)ut[j]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->gu * (((int)ut[j]) - 128) + prm->gv * (((int)vt[j]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->rv * (((int)vt[j]) - 128)) >> 16)];
		}
	}
}

void __stdcall yuv422_to_bgr(FRAME *top, FRAME *bottom, unsigned char *out, BGR_CONVERSION_PARAMETER *prm)
{
	int i, j;
	unsigned char *yt, *ut, *vt;
	unsigned char *yb, *ub, *vb;
	unsigned char *r, *g, *b;

	yt = top->y;
	ut = top->u + prm->prm.c_offset;
	vt = top->v + prm->prm.c_offset;

	yb = bottom->y + prm->prm.in_step;
	ub = bottom->u + prm->prm.in_step + prm->prm.c_offset;

⌨️ 快捷键说明

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