21 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
22 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
* |
* |
24 |
* $Id: xvid_encraw.c,v 1.13 2004-03-22 22:36:23 edgomez Exp $ |
* $Id: xvid_encraw.c,v 1.19 2005-07-05 20:55:12 chl Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
151 |
static int ARG_PACKED = 0; |
static int ARG_PACKED = 0; |
152 |
static int ARG_DEBUG = 0; |
static int ARG_DEBUG = 0; |
153 |
static int ARG_VOPDEBUG = 0; |
static int ARG_VOPDEBUG = 0; |
154 |
|
static int ARG_GREYSCALE = 0; |
155 |
static int ARG_GMC = 0; |
static int ARG_GMC = 0; |
156 |
|
static int ARG_INTERLACING = 0; |
157 |
static int ARG_QPEL = 0; |
static int ARG_QPEL = 0; |
158 |
|
static int ARG_VHQMODE = 0; |
159 |
static int ARG_CLOSED_GOP = 0; |
static int ARG_CLOSED_GOP = 0; |
160 |
|
|
161 |
#ifndef READ_PNM |
#ifndef READ_PNM |
240 |
int stats_type; |
int stats_type; |
241 |
int stats_quant; |
int stats_quant; |
242 |
int stats_length; |
int stats_length; |
243 |
int use_assembler = 0; |
int use_assembler = 1; // this default changed! |
244 |
|
|
245 |
int input_num; |
int input_num; |
246 |
int output_num; |
int output_num; |
267 |
|
|
268 |
if (strcmp("-asm", argv[i]) == 0) { |
if (strcmp("-asm", argv[i]) == 0) { |
269 |
use_assembler = 1; |
use_assembler = 1; |
270 |
|
} else if (strcmp("-noasm", argv[i]) == 0) { |
271 |
|
use_assembler = 0; |
272 |
} else if (strcmp("-w", argv[i]) == 0 && i < argc - 1) { |
} else if (strcmp("-w", argv[i]) == 0 && i < argc - 1) { |
273 |
i++; |
i++; |
274 |
XDIM = atoi(argv[i]); |
XDIM = atoi(argv[i]); |
315 |
} else if (strcmp("-quality", argv[i]) == 0 && i < argc - 1) { |
} else if (strcmp("-quality", argv[i]) == 0 && i < argc - 1) { |
316 |
i++; |
i++; |
317 |
ARG_QUALITY = atoi(argv[i]); |
ARG_QUALITY = atoi(argv[i]); |
318 |
|
} else if (strcmp("-vhqmode", argv[i]) == 0 && i < argc - 1) { |
319 |
|
i++; |
320 |
|
ARG_VHQMODE = atoi(argv[i]); |
321 |
} else if (strcmp("-framerate", argv[i]) == 0 && i < argc - 1) { |
} else if (strcmp("-framerate", argv[i]) == 0 && i < argc - 1) { |
322 |
i++; |
i++; |
323 |
ARG_FRAMERATE = (float) atof(argv[i]); |
ARG_FRAMERATE = (float) atof(argv[i]); |
351 |
ARG_OUTPUTFILE = argv[i]; |
ARG_OUTPUTFILE = argv[i]; |
352 |
} else if (strcmp("-vop_debug", argv[i]) == 0) { |
} else if (strcmp("-vop_debug", argv[i]) == 0) { |
353 |
ARG_VOPDEBUG = 1; |
ARG_VOPDEBUG = 1; |
354 |
} else if (strcmp("-qpel", argv[i]) == 0) { |
} |
355 |
|
else if (strcmp("-grey", argv[i]) == 0) { |
356 |
|
ARG_GREYSCALE = 1; |
357 |
|
} |
358 |
|
else if (strcmp("-qpel", argv[i]) == 0) { |
359 |
ARG_QPEL = 1; |
ARG_QPEL = 1; |
360 |
} else if (strcmp("-gmc", argv[i]) == 0) { |
} else if (strcmp("-gmc", argv[i]) == 0) { |
361 |
ARG_GMC = 1; |
ARG_GMC = 1; |
362 |
|
} else if (strcmp("-interlaced", argv[i]) == 0) { |
363 |
|
ARG_INTERLACING = 1; |
364 |
} else if (strcmp("-closed_gop", argv[i]) == 0) { |
} else if (strcmp("-closed_gop", argv[i]) == 0) { |
365 |
ARG_CLOSED_GOP = 1; |
ARG_CLOSED_GOP = 1; |
366 |
} else if (strcmp("-help", argv[i])) { |
} else if (strcmp("-help", argv[i])) { |
707 |
fprintf(stderr, "\n"); |
fprintf(stderr, "\n"); |
708 |
fprintf(stderr, "Other options\n"); |
fprintf(stderr, "Other options\n"); |
709 |
fprintf(stderr, " -asm : use assembly optmized code\n"); |
fprintf(stderr, " -asm : use assembly optmized code\n"); |
710 |
|
fprintf(stderr, " -noasm : do not use assembly optmized code\n"); |
711 |
fprintf(stderr, " -quality integer: quality ([0..%d])\n", ME_ELEMENTS - 1); |
fprintf(stderr, " -quality integer: quality ([0..%d])\n", ME_ELEMENTS - 1); |
712 |
|
fprintf(stderr, " -vhqmode integer: level of Rate-Distorsion optimizations ([0..4]) (default=0)\n"); |
713 |
fprintf(stderr, " -qpel : use quarter pixel ME\n"); |
fprintf(stderr, " -qpel : use quarter pixel ME\n"); |
714 |
fprintf(stderr, " -gmc : use global motion compensation\n"); |
fprintf(stderr, " -gmc : use global motion compensation\n"); |
715 |
|
fprintf(stderr, " -interlaced : use interlaced encoding (this is NOT a deinterlacer!)\n"); |
716 |
fprintf(stderr, " -packed : packed mode\n"); |
fprintf(stderr, " -packed : packed mode\n"); |
717 |
fprintf(stderr, " -closed_gop : closed GOP mode\n"); |
fprintf(stderr, " -closed_gop : closed GOP mode\n"); |
718 |
|
fprintf(stderr, " -grey : grey scale coding (chroma is discarded)\n"); |
719 |
fprintf(stderr, " -lumimasking : use lumimasking algorithm\n"); |
fprintf(stderr, " -lumimasking : use lumimasking algorithm\n"); |
720 |
fprintf(stderr, " -stats : print stats about encoded frames\n"); |
fprintf(stderr, " -stats : print stats about encoded frames\n"); |
721 |
fprintf(stderr, " -debug : activates xvidcore internal debugging output\n"); |
fprintf(stderr, " -debug : activates xvidcore internal debugging output\n"); |
747 |
return (1); |
return (1); |
748 |
|
|
749 |
fscanf(handle, "%d %d %d", &xsize, &ysize, &depth); |
fscanf(handle, "%d %d %d", &xsize, &ysize, &depth); |
750 |
if ((xsize > 1440) || (ysize > 2880) || (depth != 255)) { |
if ((xsize > 4096) || (ysize > 4096*3/2) || (depth != 255)) { |
751 |
fprintf(stderr, "%d %d %d\n", xsize, ysize, depth); |
fprintf(stderr, "%d %d %d\n", xsize, ysize, depth); |
752 |
return (2); |
return (2); |
753 |
} |
} |
968 |
rc2pass2.filename = ARG_PASS2; |
rc2pass2.filename = ARG_PASS2; |
969 |
rc2pass2.bitrate = ARG_BITRATE; |
rc2pass2.bitrate = ARG_BITRATE; |
970 |
|
|
971 |
|
/* An example of activating VBV could look like this |
972 |
|
rc2pass2.vbv_size = 3145728; |
973 |
|
rc2pass2.vbv_initial = 2359296; |
974 |
|
rc2pass2.vbv_maxrate = 4000000; |
975 |
|
rc2pass2.vbv_peakrate = 10000000; |
976 |
|
*/ |
977 |
|
|
978 |
plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; |
plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; |
979 |
plugins[xvid_enc_create.num_plugins].param = &rc2pass2; |
plugins[xvid_enc_create.num_plugins].param = &rc2pass2; |
980 |
xvid_enc_create.num_plugins++; |
xvid_enc_create.num_plugins++; |
1116 |
xvid_enc_frame.vol_flags |= XVID_VOL_QUARTERPEL; |
xvid_enc_frame.vol_flags |= XVID_VOL_QUARTERPEL; |
1117 |
if (ARG_GMC) |
if (ARG_GMC) |
1118 |
xvid_enc_frame.vol_flags |= XVID_VOL_GMC; |
xvid_enc_frame.vol_flags |= XVID_VOL_GMC; |
1119 |
|
if (ARG_INTERLACING) |
1120 |
|
xvid_enc_frame.vol_flags |= XVID_VOL_INTERLACING; |
1121 |
|
|
1122 |
/* Set up core's general features */ |
/* Set up core's general features */ |
1123 |
xvid_enc_frame.vop_flags = vop_presets[ARG_QUALITY]; |
xvid_enc_frame.vop_flags = vop_presets[ARG_QUALITY]; |
1126 |
xvid_enc_frame.vop_flags |= XVID_VOP_DEBUG; |
xvid_enc_frame.vop_flags |= XVID_VOP_DEBUG; |
1127 |
} |
} |
1128 |
|
|
1129 |
|
if (ARG_GREYSCALE) { |
1130 |
|
xvid_enc_frame.vop_flags |= XVID_VOP_GREYSCALE; |
1131 |
|
} |
1132 |
|
|
1133 |
/* Frame type -- let core decide for us */ |
/* Frame type -- let core decide for us */ |
1134 |
xvid_enc_frame.type = XVID_TYPE_AUTO; |
xvid_enc_frame.type = XVID_TYPE_AUTO; |
1135 |
|
|
1147 |
if (ARG_QPEL && (xvid_enc_frame.vop_flags & XVID_VOP_INTER4V)) |
if (ARG_QPEL && (xvid_enc_frame.vop_flags & XVID_VOP_INTER4V)) |
1148 |
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE8; |
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE8; |
1149 |
|
|
1150 |
|
switch (ARG_VHQMODE) /* this is the same code as for vfw */ |
1151 |
|
{ |
1152 |
|
case 1: /* VHQ_MODE_DECISION */ |
1153 |
|
xvid_enc_frame.vop_flags |= XVID_VOP_MODEDECISION_RD; |
1154 |
|
break; |
1155 |
|
|
1156 |
|
case 2: /* VHQ_LIMITED_SEARCH */ |
1157 |
|
xvid_enc_frame.vop_flags |= XVID_VOP_MODEDECISION_RD; |
1158 |
|
xvid_enc_frame.motion |= XVID_ME_HALFPELREFINE16_RD; |
1159 |
|
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE16_RD; |
1160 |
|
break; |
1161 |
|
|
1162 |
|
case 3: /* VHQ_MEDIUM_SEARCH */ |
1163 |
|
xvid_enc_frame.vop_flags |= XVID_VOP_MODEDECISION_RD; |
1164 |
|
xvid_enc_frame.motion |= XVID_ME_HALFPELREFINE16_RD; |
1165 |
|
xvid_enc_frame.motion |= XVID_ME_HALFPELREFINE8_RD; |
1166 |
|
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE16_RD; |
1167 |
|
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE8_RD; |
1168 |
|
xvid_enc_frame.motion |= XVID_ME_CHECKPREDICTION_RD; |
1169 |
|
break; |
1170 |
|
|
1171 |
|
case 4: /* VHQ_WIDE_SEARCH */ |
1172 |
|
xvid_enc_frame.vop_flags |= XVID_VOP_MODEDECISION_RD; |
1173 |
|
xvid_enc_frame.motion |= XVID_ME_HALFPELREFINE16_RD; |
1174 |
|
xvid_enc_frame.motion |= XVID_ME_HALFPELREFINE8_RD; |
1175 |
|
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE16_RD; |
1176 |
|
xvid_enc_frame.motion |= XVID_ME_QUARTERPELREFINE8_RD; |
1177 |
|
xvid_enc_frame.motion |= XVID_ME_CHECKPREDICTION_RD; |
1178 |
|
xvid_enc_frame.motion |= XVID_ME_EXTSEARCH_RD; |
1179 |
|
break; |
1180 |
|
|
1181 |
|
default : |
1182 |
|
break; |
1183 |
|
} |
1184 |
|
|
1185 |
/* We don't use special matrices */ |
/* We don't use special matrices */ |
1186 |
xvid_enc_frame.quant_intra_matrix = NULL; |
xvid_enc_frame.quant_intra_matrix = NULL; |
1187 |
xvid_enc_frame.quant_inter_matrix = NULL; |
xvid_enc_frame.quant_inter_matrix = NULL; |