📄 mpeg2dec.c
字号:
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 + -