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

📄 decode.c

📁 mpeg2 decoder filter过滤服务端
💻 C
📖 第 1 页 / 共 2 页
字号:
    error = convert (MPEG2_CONVERT_SET, NULL, &(mpeg2dec->sequence), 0,		     mpeg2_accels, arg, &convert_init);    if (!error) {	mpeg2dec->convert = convert;	mpeg2dec->convert_arg = arg;	mpeg2dec->convert_id_size = convert_init.id_size;	mpeg2dec->convert_stride = 0;    }    return error;}int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride){    if (!mpeg2dec->convert) {	if (stride < (int) mpeg2dec->sequence.width)	    stride = mpeg2dec->sequence.width;	mpeg2dec->decoder.stride_frame = stride;    } else {	mpeg2_convert_init_t convert_init;	stride = mpeg2dec->convert (MPEG2_CONVERT_STRIDE, NULL,				    &(mpeg2dec->sequence), stride,				    mpeg2_accels, mpeg2dec->convert_arg,				    &convert_init);	mpeg2dec->convert_id_size = convert_init.id_size;	mpeg2dec->convert_stride = stride;    }    return stride;}void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id){    mpeg2_fbuf_t * fbuf;    if (mpeg2dec->custom_fbuf) {	if (mpeg2dec->state == STATE_SEQUENCE) {	    mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];	    mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];	}	mpeg2_set_fbuf (mpeg2dec, (mpeg2dec->decoder.coding_type ==				   PIC_FLAG_CODING_TYPE_B));	fbuf = mpeg2dec->fbuf[0];    } else {	fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index].fbuf);	mpeg2dec->alloc_index_user = ++mpeg2dec->alloc_index;    }    fbuf->buf[0] = buf[0];    fbuf->buf[1] = buf[1];    fbuf->buf[2] = buf[2];    fbuf->id = id;}void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf){    mpeg2dec->custom_fbuf = custom_fbuf;}void mpeg2_skip (mpeg2dec_t * mpeg2dec, int skip){    mpeg2dec->first_decode_slice = 1;    mpeg2dec->nb_decode_slices = skip ? 0 : (0xb0 - 1);}void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end){    start = (start < 1) ? 1 : (start > 0xb0) ? 0xb0 : start;    end = (end < start) ? start : (end > 0xb0) ? 0xb0 : end;    mpeg2dec->first_decode_slice = start;    mpeg2dec->nb_decode_slices = end - start;}void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2){    mpeg2dec->tag_previous = mpeg2dec->tag_current;    mpeg2dec->tag2_previous = mpeg2dec->tag2_current;    mpeg2dec->tag_current = tag;    mpeg2dec->tag2_current = tag2;    mpeg2dec->num_tags++;    mpeg2dec->bytes_since_tag = 0;}uint32_t mpeg2_accel (uint32_t accel){    if (!mpeg2_accels) {	if (accel & MPEG2_ACCEL_DETECT)	    accel |= mpeg2_detect_accel ();	mpeg2_accels = accel |= MPEG2_ACCEL_DETECT;	mpeg2_cpu_state_init (accel);	mpeg2_idct_init (accel);	mpeg2_mc_init (accel);    }    return mpeg2_accels & ~MPEG2_ACCEL_DETECT;}void mpeg2_reset (mpeg2dec_t * mpeg2dec, int full_reset){    mpeg2dec->buf_start = mpeg2dec->buf_end = NULL;    mpeg2dec->num_tags = 0;    mpeg2dec->shift = 0xffffff00;    mpeg2dec->code = 0xb4;    mpeg2dec->action = mpeg2_seek_header;    mpeg2dec->state = STATE_INVALID;    mpeg2dec->first = 1;    mpeg2_reset_info(&(mpeg2dec->info));    mpeg2dec->info.gop = NULL;    mpeg2dec->info.user_data = NULL;    mpeg2dec->info.user_data_len = 0;    if (full_reset) {	mpeg2dec->info.sequence = NULL;	mpeg2_header_state_init (mpeg2dec);    }}mpeg2dec_t *  mpeg2_init (void){    mpeg2dec_t * mpeg2dec;    mpeg2_accel (MPEG2_ACCEL_DETECT);    mpeg2dec = (mpeg2dec_t *) mpeg2_malloc (sizeof (mpeg2dec_t),					    MPEG2_ALLOC_MPEG2DEC);    if (mpeg2dec == NULL)	return NULL;    memset (mpeg2dec->decoder.DCTblock, 0, 64 * sizeof (int16_t));    memset (mpeg2dec->quantizer_matrix, 0, 4 * 64 * sizeof (uint8_t));    mpeg2dec->chunk_buffer = (uint8_t *) mpeg2_malloc (BUFFER_SIZE + 4,						       MPEG2_ALLOC_CHUNK);    mpeg2dec->sequence.width = (unsigned)-1;    //mpeg2_reset (mpeg2dec, 1);	mpeg2_reset (mpeg2dec, 0);
    return mpeg2dec;}void mpeg2_close (mpeg2dec_t * mpeg2dec){    mpeg2_header_state_init (mpeg2dec);    mpeg2_free (mpeg2dec->chunk_buffer);    mpeg2_free (mpeg2dec);}

/*
//add by djhuang


void InitialDecoder(void)
{
	int i, size;

	mb_width = (horizontal_size+15)/16;
	mb_height = progressive_sequence ? (vertical_size+15)/16 : 2*((vertical_size+31)/32);

	Coded_Picture_Width = 16 * mb_width;
	Coded_Picture_Height = 16 * mb_height;

	Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width : Coded_Picture_Width>>1;
	Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height : Coded_Picture_Height>>1;

	block_count = ChromaFormat[chroma_format];

	hheightd2 = Coded_Picture_Height / 2 - 2;
	qheightd2 = Coded_Picture_Height / 4 - 2;
	hwidth = Coded_Picture_Width / 2;
	hwidthd8 = Coded_Picture_Width / 2 - 8;
	dwidth = Coded_Picture_Width * 2;
	qwidth = Coded_Picture_Width * 4;
	nwidth = Coded_Picture_Width * 9;

	for (i=0; i<3; i++)
	{
		if (i==0)
			size = Coded_Picture_Width * Coded_Picture_Height;
		else
			size = Chroma_Width * Chroma_Height;

		backward_reference_frame[i] = (unsigned char*)malloc(size);
		forward_reference_frame[i] = (unsigned char*)malloc(size);
		auxframe[i] = (unsigned char*)malloc(size);
	}

	u422 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height/2);
	v422 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height/2);
	u444 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height);
	v444 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height);
	rgb24 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height*3);
	yuy2 = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height*2);
	lum = (unsigned char*)malloc(Coded_Picture_Width*Coded_Picture_Height);

	ZeroMemory(&birgb, sizeof(BITMAPINFOHEADER));
	birgb.biSize = sizeof(BITMAPINFOHEADER);
	birgb.biWidth = Coded_Picture_Width;
	birgb.biHeight = Coded_Picture_Height;
	birgb.biPlanes = 1;
	birgb.biBitCount = 24;
	birgb.biCompression = BI_RGB;
	birgb.biSizeImage = Coded_Picture_Width * Coded_Picture_Height * 3;

	biyuv = birgb;
	biyuv.biBitCount = 16;
	biyuv.biCompression = mmioFOURCC('Y','U','Y','2');
	biyuv.biSizeImage = Coded_Picture_Width * Coded_Picture_Height * 2;
}

void CheckSequenceHeader(void)
{
	if (!Check_Flag)
	{
		Initialize_Reference_IDCT();
		Initialize_Buffer();

		while (!Check_Flag)
		{
			next_start_code();
			switch (Get_Bits(32))
			{
			case PACK_START_CODE:
				SystemStream_Flag = 1;
				break;

			case SEQUENCE_HEADER_CODE:
				sequence_header();
				InitialDecoder();
				Check_Flag = 1;
				break;
			}
		}
		
		Frame_Rate = (FO_Flag==FO_FILM) ? frame_rate*4/5 : frame_rate;
		
		ResetCacheChecking();   // Reuse the cache header
		Initialize_Buffer();
	}
}



void InitSystem(void)
{
	int  i;
	Stop_Flag = Rip_Flag = Fault_Flag = 0;
	Frame_Number = Second_Field = 0;
	VOB_ID = CELL_ID = 0;
	Bitrate_Meter = 0;
	SystemStream_Flag = 0;

	for (i = 0; i < 8; i++)
	{
		p_block[i] = (short *)malloc(sizeof(short)*64 + 64);
		block[i]   = (short *)((long)p_block[i] + 64 - (long)p_block[i]%64);
	}
	
	Initialize_Reference_IDCT();
//	Initialize_FPU_IDCT();
	
	iDCT_Flag  = IDCT_MMX;
	FO_Flag    = FO_NONE;
	Scale_Flag = TRUE;
	if (Scale_Flag)
	{
		YUVRGB_Scale  = 0x1000254310002543;
		YUVRGB_Offset = 0x0010001000100010;
	}
	else
	{
		YUVRGB_Scale  = 0x1000200010002000;
		YUVRGB_Offset = 0x0000000000000000;
	}

	Luminance_Flag     = 0;
	gIsPictureDecoding = FALSE;
	gIsEOS = FALSE; 
}

void UninitSystem(void)
{
	int i;
	if (Check_Flag)
	{
		for (i=0; i<3; i++)
		{
			free(backward_reference_frame[i]);
			free(forward_reference_frame[i]);
			free(auxframe[i]);
		}

		free(u422);
		free(v422);
		free(u444);
		free(v444);
		free(rgb24);
		free(yuy2);
		free(lum);
	}
	Check_Flag = 0;

	// Added by luqiming
	for (i = 0; i < 8; i++)
	{
		if (p_block[i])
		{
			free(p_block[i]);
			p_block[i] = 0;
		}		
	}
}

*/

⌨️ 快捷键说明

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