📄 mpeg2dec.c
字号:
case 'F':
Frame_Store_Flag = 1;
break;
case 'G':
Big_Picture_Flag = 1;
break;
case 'I':
#ifdef VERIFY
Stats_Flag = atoi(&argv[i][2]);
#else /* VERIFY */
printf("WARNING: This program not compiled for -i option\n");
#endif /* VERIFY */
break;
case 'L': /* spatial scalability flag */
Spatial_Flag = 1;
if(NextArg || LastArg)
{
printf("ERROR: -l must be followed by filename\n");
exit(ERROR);
}
else
Lower_Layer_Picture_Filename = argv[++i];
break;
case 'O':
Output_Type = atoi(&argv[i][2]);
if((Output_Type==4) || (Output_Type==5))
Output_Picture_Filename = ""; /* no need of filename */
else if(NextArg || LastArg)
{
printf("ERROR: -o must be followed by filename\n");
exit(ERROR);
}
else
/* filename is separated by space, so it becomes the next argument */
Output_Picture_Filename = argv[++i];
#ifdef DISPLAY
if (Output_Type==T_X11HIQ)
{
hiQdither = 1;
Output_Type=T_X11;
}
#endif /* DISPLAY */
break;
case 'Q':
Quiet_Flag = 1;
break;
case 'R':
Reference_IDCT_Flag = 1;
break;
case 'T':
#ifdef TRACE
Trace_Flag = 1;
#else /* TRACE */
printf("WARNING: This program not compiled for -t option\n");
#endif /* TRACE */
break;
case 'U':
User_Data_Flag = 1;
case 'V':
#ifdef VERBOSE
Verbose_Flag = atoi(&argv[i][2]);
#else /* VERBOSE */
printf("This program not compiled for -v option\n");
#endif /* VERBOSE */
break;
case 'X':
Ersatz_Flag = 1;
if(NextArg || LastArg)
{
printf("ERROR: -x must be followed by filename\n");
exit(ERROR);
}
else
Substitute_Picture_Filename = argv[++i];
break;
default:
fprintf(stderr,"undefined option -%c ignored. Exiting program\n",
argv[i][1]);
exit(ERROR);
} /* switch() */
} /* if argv[i][0] == '-' */
i++;
/* check for bitstream filename argument (there must always be one, at the very end
of the command line arguments */
} /* while() */
/* options sense checking */
if(Main_Bitstream_Flag!=1)
{
printf("There must be a main bitstream specified (-b filename)\n");
}
/* force display process to show frame pictures */
if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
Display_Progressive_Flag = 1;
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;
}
#endif
static 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;
}
static int Decode_Bitstream()
{
int ret;
int Bitstream_Framenum;
Bitstream_Framenum = 0;
for(;;)
{
#ifdef VERIFY
Clear_Verify_Headers();
#endif /* VERIFY */
ret = Headers();
if(ret==1)
{
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 DEBUG
static 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -