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

📄 mpeg2dec.c

📁 mpeg2 decoder filter过滤服务端
💻 C
📖 第 1 页 / 共 2 页
字号:
  else    Display_Progressive_Flag = 0;#ifdef VERIFY  /* parse the bitstream, do not actually decode it completely */  #if 0  if(Output_Type==-1)  {    Decode_Layer = Verify_Flag;    printf("FYI: Decoding bitstream elements up to: %s\n",       Layer_Table[Decode_Layer]);  }  else#endif    Decode_Layer = ALL_LAYERS;#endif /* VERIFY */  /* no output type specified */  if(Output_Type==-1)  {    Output_Type = 9;     Output_Picture_Filename = "";  }#ifdef DISPLAY  if (Output_Type==T_X11)  {    if(Frame_Store_Flag)      Display_Progressive_Flag = 1;    else      Display_Progressive_Flag = 0;    Frame_Store_Flag = 1; /* to avoid calling dither() twice */  }#endif}#ifdef OLD/*    this is an old routine used to convert command line arguments   into integers */static int Get_Val(argv)char *argv[];{  int val;  if (sscanf(argv[1]+2,"%d",&val)!=1)    return 0;  while (isdigit(argv[1][2]))    argv[1]++;  return val;}#endifstatic int Headers(){  int ret;  ld = &base;    /* return when end of sequence (0) or picture     header has been parsed (1) */  ret = Get_Hdr();  if (Two_Streams)  {    ld = &enhan;    if (Get_Hdr()!=ret && !Quiet_Flag)      fprintf(stderr,"streams out of sync\n");    ld = &base;  }  return ret;}int Decode_Bitstream(){  int ret;  int Bitstream_Framenum;  Bitstream_Framenum = 0;  for(;;)  {#ifdef VERIFY    Clear_Verify_Headers();#endif /* VERIFY */    ret = Headers();        if(ret==1)    {
	  printf("start num:                          = %d\n", Bitstream_Framenum);      ret = video_sequence(&Bitstream_Framenum);    }    else      return(ret);  }}static void Deinitialize_Sequence(){  int i;  /* clear flags */  base.MPEG2_Flag=0;  for(i=0;i<3;i++)  {    free(backward_reference_frame[i]);    free(forward_reference_frame[i]);    free(auxframe[i]);    if (base.scalable_mode==SC_SPAT)    {     free(llframe0[i]);     free(llframe1[i]);    }  }  if (base.scalable_mode==SC_SPAT)    free(lltmp);#ifdef DISPLAY  if (Output_Type==T_X11)     Terminate_Display_Process();#endif}static int video_sequence(Bitstream_Framenumber)int *Bitstream_Framenumber;{  int Bitstream_Framenum;  int Sequence_Framenum;  int Return_Value;  Bitstream_Framenum = *Bitstream_Framenumber;  Sequence_Framenum=0;  Initialize_Sequence();  /* decode picture whose header has already been parsed in      Decode_Bitstream() */  Decode_Picture(Bitstream_Framenum, Sequence_Framenum);  /* update picture numbers */  if (!Second_Field)  {    Bitstream_Framenum++;    Sequence_Framenum++;  }  /* loop through the rest of the pictures in the sequence */  while ((Return_Value=Headers()))  {    Decode_Picture(Bitstream_Framenum, Sequence_Framenum);    if (!Second_Field)    {      Bitstream_Framenum++;      Sequence_Framenum++;    }  }  /* put last frame */  if (Sequence_Framenum!=0)  {    Output_Last_Frame_of_Sequence(Bitstream_Framenum);  }  Deinitialize_Sequence();#ifdef VERIFY    Clear_Verify_Headers();#endif /* VERIFY */  *Bitstream_Framenumber = Bitstream_Framenum;  return(Return_Value);}static void Clear_Options(){  Verbose_Flag = 0;  Output_Type = 0;  Output_Picture_Filename = " ";  hiQdither  = 0;  Output_Type = 0;  Frame_Store_Flag = 0;  Spatial_Flag = 0;  Lower_Layer_Picture_Filename = " ";  Reference_IDCT_Flag = 0;  Trace_Flag = 0;  Quiet_Flag = 0;  Ersatz_Flag = 0;  Substitute_Picture_Filename  = " ";  Two_Streams = 0;  Enhancement_Layer_Bitstream_Filename = " ";  Big_Picture_Flag = 0;  Main_Bitstream_Flag = 0;  Main_Bitstream_Filename = " ";  Verify_Flag = 0;  Stats_Flag  = 0;  User_Data_Flag = 0; }#ifdef DEBUGstatic void Print_Options(){    printf("Verbose_Flag                         = %d\n", Verbose_Flag);  printf("Output_Type                          = %d\n", Output_Type);  printf("Output_Picture_Filename              = %s\n", Output_Picture_Filename);  printf("hiQdither                            = %d\n", hiQdither);  printf("Output_Type                          = %d\n", Output_Type);  printf("Frame_Store_Flag                     = %d\n", Frame_Store_Flag);  printf("Spatial_Flag                         = %d\n", Spatial_Flag);  printf("Lower_Layer_Picture_Filename         = %s\n", Lower_Layer_Picture_Filename);  printf("Reference_IDCT_Flag                  = %d\n", Reference_IDCT_Flag);  printf("Trace_Flag                           = %d\n", Trace_Flag);  printf("Quiet_Flag                           = %d\n", Quiet_Flag);  printf("Ersatz_Flag                          = %d\n", Ersatz_Flag);  printf("Substitute_Picture_Filename          = %s\n", Substitute_Picture_Filename);  printf("Two_Streams                          = %d\n", Two_Streams);  printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);  printf("Big_Picture_Flag                     = %d\n", Big_Picture_Flag);  printf("Main_Bitstream_Flag                  = %d\n", Main_Bitstream_Flag);  printf("Main_Bitstream_Filename              = %s\n", Main_Bitstream_Filename);  printf("Verify_Flag                          = %d\n", Verify_Flag);  printf("Stats_Flag                           = %d\n", Stats_Flag);  printf("User_Data_Flag                       = %d\n", User_Data_Flag);}#endif


//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 + -