📄 avi2mpg.cpp
字号:
Xi = 0;
Xp = 0;
Xb = 0;
d0i = 0;
d0p = 0;
d0b = 0;
motion_data = (struct motion_data *)malloc(M*sizeof(struct motion_data));
if (!motion_data)
error("malloc failed\n");
switch (m_search_size)
{
case 0:
motion_data[0].forw_hor_f_code = motion_data[0].forw_vert_f_code = 2;
motion_data[0].sxf = motion_data[0].syf = 11;
motion_data[1].forw_hor_f_code = motion_data[1].forw_vert_f_code = 1;
motion_data[1].sxf = motion_data[1].syf = 3;
motion_data[1].back_hor_f_code = motion_data[1].back_vert_f_code = 1;
motion_data[1].sxb = motion_data[1].syb = 7;
motion_data[2].forw_hor_f_code = motion_data[2].forw_vert_f_code = 1;
motion_data[2].sxf = motion_data[2].syf = 7;
motion_data[2].back_hor_f_code = motion_data[2].back_vert_f_code = 1;
motion_data[2].sxb = motion_data[2].syb = 3;
break;
case 1:
motion_data[0].forw_hor_f_code = motion_data[0].forw_vert_f_code = 2;
motion_data[0].sxf = motion_data[0].syf = 15;
motion_data[1].forw_hor_f_code = motion_data[1].forw_vert_f_code = 1;
motion_data[1].sxf = motion_data[1].syf = 7;
motion_data[1].back_hor_f_code = motion_data[1].back_vert_f_code = 2;
motion_data[1].sxb = motion_data[1].syb = 15;
motion_data[2].forw_hor_f_code = motion_data[2].forw_vert_f_code = 2;
motion_data[2].sxf = motion_data[2].syf = 15;
motion_data[2].back_hor_f_code = motion_data[2].back_vert_f_code = 1;
motion_data[2].sxb = motion_data[2].syb = 7;
break;
case 2:
motion_data[0].forw_hor_f_code = motion_data[0].forw_vert_f_code = 3;
motion_data[0].sxf = motion_data[0].syf = 31;
motion_data[1].forw_hor_f_code = motion_data[1].forw_vert_f_code = 2;
motion_data[1].sxf = motion_data[1].syf = 15;
motion_data[1].back_hor_f_code = motion_data[1].back_vert_f_code = 3;
motion_data[1].sxb = motion_data[1].syb = 31;
motion_data[2].forw_hor_f_code = motion_data[2].forw_vert_f_code = 3;
motion_data[2].sxf = motion_data[2].syf = 31;
motion_data[2].back_hor_f_code = motion_data[2].back_vert_f_code = 2;
motion_data[2].sxb = motion_data[2].syb = 15;
break;
case 3:
motion_data[0].forw_hor_f_code = motion_data[0].forw_vert_f_code = 4;
motion_data[0].sxf = motion_data[0].syf = 63;
motion_data[1].forw_hor_f_code = motion_data[1].forw_vert_f_code = 3;
motion_data[1].sxf = motion_data[1].syf = 31;
motion_data[1].back_hor_f_code = motion_data[1].back_vert_f_code = 4;
motion_data[1].sxb = motion_data[1].syb = 63;
motion_data[2].forw_hor_f_code = motion_data[2].forw_vert_f_code = 4;
motion_data[2].sxf = motion_data[2].syf = 63;
motion_data[2].back_hor_f_code = motion_data[2].back_vert_f_code = 3;
motion_data[2].sxb = motion_data[2].syb = 31;
break;
case 4:
motion_data[0].forw_hor_f_code = motion_data[0].forw_vert_f_code = 4;
motion_data[0].sxf = motion_data[0].syf = 63;
motion_data[1].forw_hor_f_code = motion_data[1].forw_vert_f_code = 4;
motion_data[1].sxf = motion_data[1].syf = 63;
motion_data[1].back_hor_f_code = motion_data[1].back_vert_f_code = 4;
motion_data[1].sxb = motion_data[1].syb = 63;
motion_data[2].forw_hor_f_code = motion_data[2].forw_vert_f_code = 4;
motion_data[2].sxf = motion_data[2].syf = 63;
motion_data[2].back_hor_f_code = motion_data[2].back_vert_f_code = 4;
motion_data[2].sxb = motion_data[2].syb = 63;
break;
}
}
if(vcd_parm)
{
vbv_buffer_size = 20;
aspectratio = 14;
}
/* make flags boolean (x!=0 -> x=1) */
fieldpic = !!fieldpic;
low_delay = !!low_delay;
constrparms = !!constrparms;
prog_seq = !!prog_seq;
topfirst = !!topfirst;
for (i=0; i<3; i++)
{
frame_pred_dct_tab[i] = !!frame_pred_dct_tab[i];
conceal_tab[i] = !!conceal_tab[i];
qscale_tab[i] = !!qscale_tab[i];
intravlc_tab[i] = !!intravlc_tab[i];
altscan_tab[i] = !!altscan_tab[i];
}
repeatfirst = !!repeatfirst;
prog_frame = !!prog_frame;
/* 确认MPEG的特定参数是有效的*/
range_checks();
frame_rate = ratetab[frame_rate_code-1];
/* timecode -> frame number */
tc0 = h;
tc0 = 60*tc0 + m;
tc0 = 60*tc0 + s;
tc0 = (int)(frame_rate+0.5)*tc0 + f;
/* MPEG-1 */
if (constrparms)
{
if (horizontal_size>768
|| vertical_size>576
|| ((horizontal_size+15)/16)*((vertical_size+15)/16)>396
|| ((horizontal_size+15)/16)*((vertical_size+15)/16)*frame_rate>396*25.0
|| frame_rate>30.0)
{
if (!quiet)
fprintf(stderr,"\n*** WARNING: VIDEO EXCEEDS CPB STANDARD!\n");
constrparms = 0;
}
}
if (constrparms)
{
for (i=0; i<M; i++)
{
if (motion_data[i].forw_hor_f_code>4)
{
if (!quiet)
fprintf(stderr,"\n*** WARNING: VIDEO EXCEEDS CPB STANDARD!\n");
constrparms = 0;
break;
}
if (motion_data[i].forw_vert_f_code>4)
{
if (!quiet)
fprintf(stderr,"\n*** WARNING: VIDEO EXCEEDS CPB STANDARD!\n");
constrparms = 0;
break;
}
if (i!=0)
{
if (motion_data[i].back_hor_f_code>4)
{
if (!quiet)
fprintf(stderr,"\n*** WARNING: VIDEO EXCEEDS CPB STANDARD!\n");
constrparms = 0;
break;
}
if (motion_data[i].back_vert_f_code>4)
{
if (!quiet)
fprintf(stderr,"\n*** WARNING: VIDEO EXCEEDS CPB STANDARD!\n");
constrparms = 0;
break;
}
}
}
}
if (!prog_seq)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting progressive_sequence = 1\n");
prog_seq = 1;
}
if (chroma_format!=CHROMA420)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting chroma_format = 1 (4:2:0)\n");
chroma_format = CHROMA420;
}
if (dc_prec!=0)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting intra_dc_precision = 0\n");
dc_prec = 0;
}
for (i=0; i<3; i++)
if (qscale_tab[i])
{
if (!quiet)
fprintf(stderr,"\nWarning: setting qscale_tab[%d] = 0\n",i);
qscale_tab[i] = 0;
}
for (i=0; i<3; i++)
if (intravlc_tab[i])
{
if (!quiet)
fprintf(stderr,"\nWarning: setting intravlc_tab[%d] = 0\n",i);
intravlc_tab[i] = 0;
}
for (i=0; i<3; i++)
if (altscan_tab[i])
{
if (!quiet)
fprintf(stderr,"\nWarning: setting altscan_tab[%d] = 0\n",i);
altscan_tab[i] = 0;
}
if (prog_seq && !prog_frame)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting progressive_frame = 1\n");
prog_frame = 1;
}
if (prog_frame && fieldpic)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting field_pictures = 0\n");
fieldpic = 0;
}
if (!prog_frame && repeatfirst)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting repeat_first_field = 0\n");
repeatfirst = 0;
}
if (prog_frame)
{
for (i=0; i<3; i++)
if (!frame_pred_dct_tab[i])
{
if (!quiet)
fprintf(stderr,"\nWarning: setting frame_pred_frame_dct[%d] = 1\n",i);
frame_pred_dct_tab[i] = 1;
}
}
if (prog_seq && !repeatfirst && topfirst)
{
if (!quiet)
fprintf(stderr,"\nWarning: setting top_field_first = 0\n");
topfirst = 0;
}
/* search windows */
for (i=0; i<M; i++)
{
if (motion_data[i].sxf > (4<<motion_data[i].forw_hor_f_code)-1)
{
if (!quiet)
fprintf(stderr,
"\nWarning: reducing forward horizontal search width to %d\n",
(4<<motion_data[i].forw_hor_f_code)-1);
motion_data[i].sxf = (4<<motion_data[i].forw_hor_f_code)-1;
}
if (motion_data[i].syf > (4<<motion_data[i].forw_vert_f_code)-1)
{
if (!quiet)
fprintf(stderr,
"\nWarning: reducing forward vertical search width to %d\n",
(4<<motion_data[i].forw_vert_f_code)-1);
motion_data[i].syf = (4<<motion_data[i].forw_vert_f_code)-1;
}
if (i!=0)
{
if (motion_data[i].sxb > (4<<motion_data[i].back_hor_f_code)-1)
{
if (!quiet)
fprintf(stderr,
"\nWarning: reducing backward horizontal search width to %d\n",
(4<<motion_data[i].back_hor_f_code)-1);
motion_data[i].sxb = (4<<motion_data[i].back_hor_f_code)-1;
}
if (motion_data[i].syb > (4<<motion_data[i].back_vert_f_code)-1)
{
if (!quiet)
fprintf(stderr,
"\nWarning: reducing backward vertical search width to %d\n",
(4<<motion_data[i].back_vert_f_code)-1);
motion_data[i].syb = (4<<motion_data[i].back_vert_f_code)-1;
}
}
}
}
static void initquantmat()
{
int i,v;
FILE *fd;
if (iqname[0]=='-')
{
load_iquant = 0;
for (i=0; i<64; i++)
{
intra_q[i] = default_intra_quantizer_matrix[i];
recip_intra_q[i] = (unsigned short)((16384.0 + (double) intra_q[i]/2.0)/intra_q[i]);
}
}
else
{
load_iquant = 1;
if (!(fd = fopen(iqname,"r")))
{
sprintf(errortext,"Couldn't open quant intra matrix file %s",iqname);
error(errortext);
}
for (i=0; i<64; i++)
{
fscanf(fd,"%d",&v);
if (v<1 || v>255)
error("invalid value in quant matrix");
intra_q[i] = v;
recip_intra_q[i] = (unsigned short)((16384.0 + (double) intra_q[i]/2.0)/intra_q[i]);
}
fclose(fd);
}
if (niqname[0]=='-')
{
load_niquant = 0;
for (i=0; i<64; i++)
{
inter_q[i] = 16;
recip_inter_q[i] = (unsigned short)((16384.0 + (double) inter_q[i]/2.0)/inter_q[i]);
}
}
else
{
load_niquant = 1;
if (!(fd = fopen(niqname,"r")))
{
sprintf(errortext,"Couldn't open quant non-intra matrix file %s",niqname);
error(errortext);
}
for (i=0; i<64; i++)
{
fscanf(fd,"%d",&v);
if (v<1 || v>255)
error("invalid value in quant matrix");
inter_q[i] = v;
recip_inter_q[i] = (unsigned short)((16384.0 + (double) inter_q[i]/2.0)/inter_q[i]);
}
fclose(fd);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -