OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 return 0; | 116 return 0; |
117 } | 117 } |
118 | 118 |
119 int fourcc_is_ivf(const char detect[4]) { | 119 int fourcc_is_ivf(const char detect[4]) { |
120 if (memcmp(detect, "DKIF", 4) == 0) { | 120 if (memcmp(detect, "DKIF", 4) == 0) { |
121 return 1; | 121 return 1; |
122 } | 122 } |
123 return 0; | 123 return 0; |
124 } | 124 } |
125 | 125 |
| 126 #if CONFIG_WEBM_IO |
126 /* Murmur hash derived from public domain reference implementation at | 127 /* Murmur hash derived from public domain reference implementation at |
127 * http:// sites.google.com/site/murmurhash/ | 128 * http:// sites.google.com/site/murmurhash/ |
128 */ | 129 */ |
129 static unsigned int murmur(const void *key, int len, unsigned int seed) { | 130 static unsigned int murmur(const void *key, int len, unsigned int seed) { |
130 const unsigned int m = 0x5bd1e995; | 131 const unsigned int m = 0x5bd1e995; |
131 const int r = 24; | 132 const int r = 24; |
132 | 133 |
133 unsigned int h = seed ^ len; | 134 unsigned int h = seed ^ len; |
134 | 135 |
135 const unsigned char *data = (const unsigned char *)key; | 136 const unsigned char *data = (const unsigned char *)key; |
(...skipping 26 matching lines...) Expand all Loading... |
162 h ^= data[0]; | 163 h ^= data[0]; |
163 h *= m; | 164 h *= m; |
164 }; | 165 }; |
165 | 166 |
166 h ^= h >> 13; | 167 h ^= h >> 13; |
167 h *= m; | 168 h *= m; |
168 h ^= h >> 15; | 169 h ^= h >> 15; |
169 | 170 |
170 return h; | 171 return h; |
171 } | 172 } |
172 | 173 #endif // CONFIG_WEBM_IO |
173 | 174 |
174 static const arg_def_t debugmode = ARG_DEF("D", "debug", 0, | 175 static const arg_def_t debugmode = ARG_DEF("D", "debug", 0, |
175 "Debug mode (makes output determinist
ic)"); | 176 "Debug mode (makes output determinist
ic)"); |
176 static const arg_def_t outputfile = ARG_DEF("o", "output", 1, | 177 static const arg_def_t outputfile = ARG_DEF("o", "output", 1, |
177 "Output filename"); | 178 "Output filename"); |
178 static const arg_def_t use_yv12 = ARG_DEF(NULL, "yv12", 0, | 179 static const arg_def_t use_yv12 = ARG_DEF(NULL, "yv12", 0, |
179 "Input file is YV12 "); | 180 "Input file is YV12 "); |
180 static const arg_def_t use_i420 = ARG_DEF(NULL, "i420", 0, | 181 static const arg_def_t use_i420 = ARG_DEF(NULL, "i420", 0, |
181 "Input file is I420 (default)"); | 182 "Input file is I420 (default)"); |
182 static const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, | 183 static const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, |
(...skipping 28 matching lines...) Expand all Loading... |
211 {"fatal", TEST_DECODE_FATAL}, | 212 {"fatal", TEST_DECODE_FATAL}, |
212 {"warn", TEST_DECODE_WARN}, | 213 {"warn", TEST_DECODE_WARN}, |
213 {NULL, 0} | 214 {NULL, 0} |
214 }; | 215 }; |
215 static const arg_def_t recontest = ARG_DEF_ENUM(NULL, "test-decode", 1, | 216 static const arg_def_t recontest = ARG_DEF_ENUM(NULL, "test-decode", 1, |
216 "Test encode/decode mismatch", | 217 "Test encode/decode mismatch", |
217 test_decode_enum); | 218 test_decode_enum); |
218 static const arg_def_t framerate = ARG_DEF(NULL, "fps", 1, | 219 static const arg_def_t framerate = ARG_DEF(NULL, "fps", 1, |
219 "Stream frame rate (rate/scale
)"); | 220 "Stream frame rate (rate/scale
)"); |
220 static const arg_def_t use_ivf = ARG_DEF(NULL, "ivf", 0, | 221 static const arg_def_t use_ivf = ARG_DEF(NULL, "ivf", 0, |
221 "Output IVF (default is WebM)"
); | 222 "Output IVF (default is WebM i
f WebM IO is enabled)"); |
222 static const arg_def_t out_part = ARG_DEF("P", "output-partitions", 0, | 223 static const arg_def_t out_part = ARG_DEF("P", "output-partitions", 0, |
223 "Makes encoder output partitions. Requ
ires IVF output!"); | 224 "Makes encoder output partitions. Requ
ires IVF output!"); |
224 static const arg_def_t q_hist_n = ARG_DEF(NULL, "q-hist", 1, | 225 static const arg_def_t q_hist_n = ARG_DEF(NULL, "q-hist", 1, |
225 "Show quantizer histogram (n-b
uckets)"); | 226 "Show quantizer histogram (n-b
uckets)"); |
226 static const arg_def_t rate_hist_n = ARG_DEF(NULL, "rate-hist", 1, | 227 static const arg_def_t rate_hist_n = ARG_DEF(NULL, "rate-hist", 1, |
227 "Show rate histogram (n-buc
kets)"); | 228 "Show rate histogram (n-buc
kets)"); |
228 static const arg_def_t disable_warnings = | 229 static const arg_def_t disable_warnings = |
229 ARG_DEF(NULL, "disable-warnings", 0, | 230 ARG_DEF(NULL, "disable-warnings", 0, |
230 "Disable warnings about potentially incorrect encode settings."); | 231 "Disable warnings about potentially incorrect encode settings."); |
231 static const arg_def_t disable_warning_prompt = | 232 static const arg_def_t disable_warning_prompt = |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 #if CONFIG_VP9_ENCODER | 393 #if CONFIG_VP9_ENCODER |
393 static const arg_def_t tile_cols = | 394 static const arg_def_t tile_cols = |
394 ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2"); | 395 ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2"); |
395 static const arg_def_t tile_rows = | 396 static const arg_def_t tile_rows = |
396 ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2"); | 397 ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2"); |
397 static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode"); | 398 static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode"); |
398 static const arg_def_t frame_parallel_decoding = ARG_DEF( | 399 static const arg_def_t frame_parallel_decoding = ARG_DEF( |
399 NULL, "frame-parallel", 1, "Enable frame parallel decodability features"); | 400 NULL, "frame-parallel", 1, "Enable frame parallel decodability features"); |
400 static const arg_def_t aq_mode = ARG_DEF( | 401 static const arg_def_t aq_mode = ARG_DEF( |
401 NULL, "aq-mode", 1, | 402 NULL, "aq-mode", 1, |
402 "Adaptive q mode (0: off (by default), 1: variance 2: complexity)"); | 403 "Adaptive q mode (0: off (by default), 1: variance 2: complexity, " |
| 404 "3: cyclic refresh)"); |
| 405 static const arg_def_t frame_periodic_boost = ARG_DEF( |
| 406 NULL, "frame_boost", 1, |
| 407 "Enable frame periodic boost (0: off (by default), 1: on)"); |
403 | 408 |
404 static const arg_def_t *vp9_args[] = { | 409 static const arg_def_t *vp9_args[] = { |
405 &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh, | 410 &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh, |
406 &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, | 411 &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, |
407 &tune_ssim, &cq_level, &max_intra_rate_pct, &lossless, | 412 &tune_ssim, &cq_level, &max_intra_rate_pct, &lossless, |
408 &frame_parallel_decoding, &aq_mode, | 413 &frame_parallel_decoding, &aq_mode, &frame_periodic_boost, |
409 NULL | 414 NULL |
410 }; | 415 }; |
411 static const int vp9_arg_ctrl_map[] = { | 416 static const int vp9_arg_ctrl_map[] = { |
412 VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, | 417 VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, |
413 VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, | 418 VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, |
414 VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS, | 419 VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS, |
415 VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE, | 420 VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE, |
416 VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, | 421 VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, |
417 VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE, | 422 VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE, |
| 423 VP9E_SET_FRAME_PERIODIC_BOOST, |
418 0 | 424 0 |
419 }; | 425 }; |
420 #endif | 426 #endif |
421 | 427 |
422 static const arg_def_t *no_args[] = { NULL }; | 428 static const arg_def_t *no_args[] = { NULL }; |
423 | 429 |
424 void usage_exit() { | 430 void usage_exit() { |
425 int i; | 431 int i; |
426 | 432 |
427 fprintf(stderr, "Usage: %s <options> -o dst_filename src_filename \n", | 433 fprintf(stderr, "Usage: %s <options> -o dst_filename src_filename \n", |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 | 833 |
828 /* Never use the library's default resolution, require it be parsed | 834 /* Never use the library's default resolution, require it be parsed |
829 * from the file or set on the command line. | 835 * from the file or set on the command line. |
830 */ | 836 */ |
831 stream->config.cfg.g_w = 0; | 837 stream->config.cfg.g_w = 0; |
832 stream->config.cfg.g_h = 0; | 838 stream->config.cfg.g_h = 0; |
833 | 839 |
834 /* Initialize remaining stream parameters */ | 840 /* Initialize remaining stream parameters */ |
835 stream->config.stereo_fmt = STEREO_FORMAT_MONO; | 841 stream->config.stereo_fmt = STEREO_FORMAT_MONO; |
836 stream->config.write_webm = 1; | 842 stream->config.write_webm = 1; |
| 843 #if CONFIG_WEBM_IO |
837 stream->ebml.last_pts_ms = -1; | 844 stream->ebml.last_pts_ms = -1; |
| 845 #endif |
838 | 846 |
839 /* Allows removal of the application version from the EBML tags */ | 847 /* Allows removal of the application version from the EBML tags */ |
840 stream->ebml.debug = global->debug; | 848 stream->ebml.debug = global->debug; |
841 | 849 |
842 /* Default lag_in_frames is 0 in realtime mode */ | 850 /* Default lag_in_frames is 0 in realtime mode */ |
843 if (global->deadline == VPX_DL_REALTIME) | 851 if (global->deadline == VPX_DL_REALTIME) |
844 stream->config.cfg.g_lag_in_frames = 0; | 852 stream->config.cfg.g_lag_in_frames = 0; |
845 } | 853 } |
846 | 854 |
847 /* Output files must be specified for each stream */ | 855 /* Output files must be specified for each stream */ |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1136 return; | 1144 return; |
1137 | 1145 |
1138 stream->file = strcmp(fn, "-") ? fopen(fn, "wb") : set_binary_mode(stdout); | 1146 stream->file = strcmp(fn, "-") ? fopen(fn, "wb") : set_binary_mode(stdout); |
1139 | 1147 |
1140 if (!stream->file) | 1148 if (!stream->file) |
1141 fatal("Failed to open output file"); | 1149 fatal("Failed to open output file"); |
1142 | 1150 |
1143 if (stream->config.write_webm && fseek(stream->file, 0, SEEK_CUR)) | 1151 if (stream->config.write_webm && fseek(stream->file, 0, SEEK_CUR)) |
1144 fatal("WebM output to pipes not supported."); | 1152 fatal("WebM output to pipes not supported."); |
1145 | 1153 |
| 1154 #if CONFIG_WEBM_IO |
1146 if (stream->config.write_webm) { | 1155 if (stream->config.write_webm) { |
1147 stream->ebml.stream = stream->file; | 1156 stream->ebml.stream = stream->file; |
1148 write_webm_file_header(&stream->ebml, cfg, | 1157 write_webm_file_header(&stream->ebml, cfg, |
1149 &global->framerate, | 1158 &global->framerate, |
1150 stream->config.stereo_fmt, | 1159 stream->config.stereo_fmt, |
1151 global->codec->fourcc); | 1160 global->codec->fourcc); |
1152 } else { | 1161 } |
| 1162 #endif |
| 1163 |
| 1164 if (!stream->config.write_webm) { |
1153 ivf_write_file_header(stream->file, cfg, global->codec->fourcc, 0); | 1165 ivf_write_file_header(stream->file, cfg, global->codec->fourcc, 0); |
1154 } | 1166 } |
1155 } | 1167 } |
1156 | 1168 |
1157 | 1169 |
1158 static void close_output_file(struct stream_state *stream, | 1170 static void close_output_file(struct stream_state *stream, |
1159 unsigned int fourcc) { | 1171 unsigned int fourcc) { |
1160 const struct vpx_codec_enc_cfg *const cfg = &stream->config.cfg; | 1172 const struct vpx_codec_enc_cfg *const cfg = &stream->config.cfg; |
1161 | 1173 |
1162 if (cfg->g_pass == VPX_RC_FIRST_PASS) | 1174 if (cfg->g_pass == VPX_RC_FIRST_PASS) |
1163 return; | 1175 return; |
1164 | 1176 |
| 1177 #if CONFIG_WEBM_IO |
1165 if (stream->config.write_webm) { | 1178 if (stream->config.write_webm) { |
1166 write_webm_file_footer(&stream->ebml, stream->hash); | 1179 write_webm_file_footer(&stream->ebml, stream->hash); |
1167 free(stream->ebml.cue_list); | 1180 free(stream->ebml.cue_list); |
1168 stream->ebml.cue_list = NULL; | 1181 stream->ebml.cue_list = NULL; |
1169 } else { | 1182 } |
| 1183 #endif |
| 1184 |
| 1185 if (!stream->config.write_webm) { |
1170 if (!fseek(stream->file, 0, SEEK_SET)) | 1186 if (!fseek(stream->file, 0, SEEK_SET)) |
1171 ivf_write_file_header(stream->file, &stream->config.cfg, | 1187 ivf_write_file_header(stream->file, &stream->config.cfg, |
1172 fourcc, | 1188 fourcc, |
1173 stream->frames_out); | 1189 stream->frames_out); |
1174 } | 1190 } |
1175 | 1191 |
1176 fclose(stream->file); | 1192 fclose(stream->file); |
1177 } | 1193 } |
1178 | 1194 |
1179 | 1195 |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1309 | 1325 |
1310 switch (pkt->kind) { | 1326 switch (pkt->kind) { |
1311 case VPX_CODEC_CX_FRAME_PKT: | 1327 case VPX_CODEC_CX_FRAME_PKT: |
1312 if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { | 1328 if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { |
1313 stream->frames_out++; | 1329 stream->frames_out++; |
1314 } | 1330 } |
1315 if (!global->quiet) | 1331 if (!global->quiet) |
1316 fprintf(stderr, " %6luF", (unsigned long)pkt->data.frame.sz); | 1332 fprintf(stderr, " %6luF", (unsigned long)pkt->data.frame.sz); |
1317 | 1333 |
1318 update_rate_histogram(stream->rate_hist, cfg, pkt); | 1334 update_rate_histogram(stream->rate_hist, cfg, pkt); |
| 1335 #if CONFIG_WEBM_IO |
1319 if (stream->config.write_webm) { | 1336 if (stream->config.write_webm) { |
1320 /* Update the hash */ | 1337 /* Update the hash */ |
1321 if (!stream->ebml.debug) | 1338 if (!stream->ebml.debug) |
1322 stream->hash = murmur(pkt->data.frame.buf, | 1339 stream->hash = murmur(pkt->data.frame.buf, |
1323 (int)pkt->data.frame.sz, | 1340 (int)pkt->data.frame.sz, |
1324 stream->hash); | 1341 stream->hash); |
1325 | 1342 |
1326 write_webm_block(&stream->ebml, cfg, pkt); | 1343 write_webm_block(&stream->ebml, cfg, pkt); |
1327 } else { | 1344 } |
| 1345 #endif |
| 1346 if (!stream->config.write_webm) { |
1328 if (pkt->data.frame.partition_id <= 0) { | 1347 if (pkt->data.frame.partition_id <= 0) { |
1329 ivf_header_pos = ftello(stream->file); | 1348 ivf_header_pos = ftello(stream->file); |
1330 fsize = pkt->data.frame.sz; | 1349 fsize = pkt->data.frame.sz; |
1331 | 1350 |
1332 ivf_write_frame_header(stream->file, pkt->data.frame.pts, fsize); | 1351 ivf_write_frame_header(stream->file, pkt->data.frame.pts, fsize); |
1333 } else { | 1352 } else { |
1334 fsize += pkt->data.frame.sz; | 1353 fsize += pkt->data.frame.sz; |
1335 | 1354 |
1336 if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { | 1355 if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { |
1337 off_t currpos = ftello(stream->file); | 1356 off_t currpos = ftello(stream->file); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 int64_t mins; | 1496 int64_t mins; |
1478 int64_t secs; | 1497 int64_t secs; |
1479 | 1498 |
1480 if (etl >= 0) { | 1499 if (etl >= 0) { |
1481 hours = etl / 3600; | 1500 hours = etl / 3600; |
1482 etl -= hours * 3600; | 1501 etl -= hours * 3600; |
1483 mins = etl / 60; | 1502 mins = etl / 60; |
1484 etl -= mins * 60; | 1503 etl -= mins * 60; |
1485 secs = etl; | 1504 secs = etl; |
1486 | 1505 |
1487 fprintf(stderr, "[%3s %2"PRId64":%02"PRId64": % 02"PRId64"] ", | 1506 fprintf(stderr, "[%3s %2"PRId64":%02"PRId64":%02"PRId64"] ", |
1488 label, hours, mins, secs); | 1507 label, hours, mins, secs); |
1489 } else { | 1508 } else { |
1490 fprintf(stderr, "[%3s unknown] ", label); | 1509 fprintf(stderr, "[%3s unknown] ", label); |
1491 } | 1510 } |
1492 } | 1511 } |
1493 | 1512 |
1494 | 1513 |
1495 int main(int argc, const char **argv_) { | 1514 int main(int argc, const char **argv_) { |
1496 int pass; | 1515 int pass; |
1497 vpx_image_t raw; | 1516 vpx_image_t raw; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1587 /* Ensure that --passes and --pass are consistent. If --pass is set and | 1606 /* Ensure that --passes and --pass are consistent. If --pass is set and |
1588 * --passes=2, ensure --fpf was set. | 1607 * --passes=2, ensure --fpf was set. |
1589 */ | 1608 */ |
1590 if (global.pass && global.passes == 2) | 1609 if (global.pass && global.passes == 2) |
1591 FOREACH_STREAM( { | 1610 FOREACH_STREAM( { |
1592 if (!stream->config.stats_fn) | 1611 if (!stream->config.stats_fn) |
1593 die("Stream %d: Must specify --fpf when --pass=%d" | 1612 die("Stream %d: Must specify --fpf when --pass=%d" |
1594 " and --passes=2\n", stream->index, global.pass); | 1613 " and --passes=2\n", stream->index, global.pass); |
1595 }); | 1614 }); |
1596 | 1615 |
| 1616 #if !CONFIG_WEBM_IO |
| 1617 FOREACH_STREAM({ |
| 1618 stream->config.write_webm = 0; |
| 1619 warn("vpxenc was compiled without WebM container support." |
| 1620 "Producing IVF output"); |
| 1621 }); |
| 1622 #endif |
| 1623 |
1597 /* Use the frame rate from the file only if none was specified | 1624 /* Use the frame rate from the file only if none was specified |
1598 * on the command-line. | 1625 * on the command-line. |
1599 */ | 1626 */ |
1600 if (!global.have_framerate) { | 1627 if (!global.have_framerate) { |
1601 global.framerate.num = input.framerate.numerator; | 1628 global.framerate.num = input.framerate.numerator; |
1602 global.framerate.den = input.framerate.denominator; | 1629 global.framerate.den = input.framerate.denominator; |
1603 } | 1630 } |
1604 | 1631 |
1605 FOREACH_STREAM(set_default_kf_interval(stream, &global)); | 1632 FOREACH_STREAM(set_default_kf_interval(stream, &global)); |
1606 | 1633 |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1779 } | 1806 } |
1780 fclose(f); | 1807 fclose(f); |
1781 }); | 1808 }); |
1782 #endif | 1809 #endif |
1783 | 1810 |
1784 vpx_img_free(&raw); | 1811 vpx_img_free(&raw); |
1785 free(argv); | 1812 free(argv); |
1786 free(streams); | 1813 free(streams); |
1787 return res ? EXIT_FAILURE : EXIT_SUCCESS; | 1814 return res ? EXIT_FAILURE : EXIT_SUCCESS; |
1788 } | 1815 } |
OLD | NEW |