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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 static const arg_def_t outputfile = ARG_DEF("o", "output", 1, | 70 static const arg_def_t outputfile = ARG_DEF("o", "output", 1, |
71 "Output file name pattern (see below
)"); | 71 "Output file name pattern (see below
)"); |
72 static const arg_def_t threadsarg = ARG_DEF("t", "threads", 1, | 72 static const arg_def_t threadsarg = ARG_DEF("t", "threads", 1, |
73 "Max threads to use"); | 73 "Max threads to use"); |
74 static const arg_def_t verbosearg = ARG_DEF("v", "verbose", 0, | 74 static const arg_def_t verbosearg = ARG_DEF("v", "verbose", 0, |
75 "Show version string"); | 75 "Show version string"); |
76 static const arg_def_t error_concealment = ARG_DEF(NULL, "error-concealment", 0, | 76 static const arg_def_t error_concealment = ARG_DEF(NULL, "error-concealment", 0, |
77 "Enable decoder error-conceal
ment"); | 77 "Enable decoder error-conceal
ment"); |
78 static const arg_def_t scalearg = ARG_DEF("S", "scale", 0, | 78 static const arg_def_t scalearg = ARG_DEF("S", "scale", 0, |
79 "Scale output frames uniformly"); | 79 "Scale output frames uniformly"); |
| 80 static const arg_def_t continuearg = |
| 81 ARG_DEF("k", "keep-going", 0, "(debug) Continue decoding after error"); |
80 | 82 |
81 static const arg_def_t fb_arg = | 83 static const arg_def_t fb_arg = |
82 ARG_DEF(NULL, "frame-buffers", 1, "Number of frame buffers to use"); | 84 ARG_DEF(NULL, "frame-buffers", 1, "Number of frame buffers to use"); |
83 | 85 |
84 static const arg_def_t md5arg = ARG_DEF(NULL, "md5", 0, | 86 static const arg_def_t md5arg = ARG_DEF(NULL, "md5", 0, |
85 "Compute the MD5 sum of the decoded fram
e"); | 87 "Compute the MD5 sum of the decoded fram
e"); |
86 | 88 |
87 static const arg_def_t *all_args[] = { | 89 static const arg_def_t *all_args[] = { |
88 &codecarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg, | 90 &codecarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg, |
89 &progressarg, &limitarg, &skiparg, &postprocarg, &summaryarg, &outputfile, | 91 &progressarg, &limitarg, &skiparg, &postprocarg, &summaryarg, &outputfile, |
90 &threadsarg, &verbosearg, &scalearg, &fb_arg, | 92 &threadsarg, &verbosearg, &scalearg, &fb_arg, |
91 &md5arg, | 93 &md5arg, &error_concealment, &continuearg, |
92 &error_concealment, | |
93 NULL | 94 NULL |
94 }; | 95 }; |
95 | 96 |
96 #if CONFIG_VP8_DECODER | 97 #if CONFIG_VP8_DECODER |
97 static const arg_def_t addnoise_level = ARG_DEF(NULL, "noise-level", 1, | 98 static const arg_def_t addnoise_level = ARG_DEF(NULL, "noise-level", 1, |
98 "Enable VP8 postproc add noise")
; | 99 "Enable VP8 postproc add noise")
; |
99 static const arg_def_t deblock = ARG_DEF(NULL, "deblock", 0, | 100 static const arg_def_t deblock = ARG_DEF(NULL, "deblock", 0, |
100 "Enable VP8 deblocking"); | 101 "Enable VP8 deblocking"); |
101 static const arg_def_t demacroblock_level = ARG_DEF(NULL, "demacroblock-level",
1, | 102 static const arg_def_t demacroblock_level = ARG_DEF(NULL, "demacroblock-level",
1, |
102 "Enable VP8 demacroblocking,
w/ level"); | 103 "Enable VP8 demacroblocking,
w/ level"); |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 char *fn = NULL; | 491 char *fn = NULL; |
491 int i; | 492 int i; |
492 uint8_t *buf = NULL; | 493 uint8_t *buf = NULL; |
493 size_t bytes_in_buffer = 0, buffer_size = 0; | 494 size_t bytes_in_buffer = 0, buffer_size = 0; |
494 FILE *infile; | 495 FILE *infile; |
495 int frame_in = 0, frame_out = 0, flipuv = 0, noblit = 0; | 496 int frame_in = 0, frame_out = 0, flipuv = 0, noblit = 0; |
496 int do_md5 = 0, progress = 0; | 497 int do_md5 = 0, progress = 0; |
497 int stop_after = 0, postproc = 0, summary = 0, quiet = 1; | 498 int stop_after = 0, postproc = 0, summary = 0, quiet = 1; |
498 int arg_skip = 0; | 499 int arg_skip = 0; |
499 int ec_enabled = 0; | 500 int ec_enabled = 0; |
| 501 int keep_going = 0; |
500 const VpxInterface *interface = NULL; | 502 const VpxInterface *interface = NULL; |
501 const VpxInterface *fourcc_interface = NULL; | 503 const VpxInterface *fourcc_interface = NULL; |
502 uint64_t dx_time = 0; | 504 uint64_t dx_time = 0; |
503 struct arg arg; | 505 struct arg arg; |
504 char **argv, **argi, **argj; | 506 char **argv, **argi, **argj; |
505 | 507 |
506 int single_file; | 508 int single_file; |
507 int use_y4m = 1; | 509 int use_y4m = 1; |
508 vpx_codec_dec_cfg_t cfg = {0}; | 510 vpx_codec_dec_cfg_t cfg = {0}; |
509 #if CONFIG_VP8_DECODER | 511 #if CONFIG_VP8_DECODER |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 vp8_dbg_color_b_modes = flags; | 627 vp8_dbg_color_b_modes = flags; |
626 } | 628 } |
627 } else if (arg_match(&arg, &pp_disp_mvs, argi)) { | 629 } else if (arg_match(&arg, &pp_disp_mvs, argi)) { |
628 unsigned int flags = arg_parse_int(&arg); | 630 unsigned int flags = arg_parse_int(&arg); |
629 if (flags) { | 631 if (flags) { |
630 postproc = 1; | 632 postproc = 1; |
631 vp8_dbg_display_mv = flags; | 633 vp8_dbg_display_mv = flags; |
632 } | 634 } |
633 } else if (arg_match(&arg, &error_concealment, argi)) { | 635 } else if (arg_match(&arg, &error_concealment, argi)) { |
634 ec_enabled = 1; | 636 ec_enabled = 1; |
| 637 } else if (arg_match(&arg, &continuearg, argi)) { |
| 638 keep_going = 1; |
635 } | 639 } |
636 | 640 |
637 #endif | 641 #endif |
638 else | 642 else |
639 argj++; | 643 argj++; |
640 } | 644 } |
641 | 645 |
642 /* Check for unrecognized options */ | 646 /* Check for unrecognized options */ |
643 for (argi = argv; *argi; argi++) | 647 for (argi = argv; *argi; argi++) |
644 if (argi[0][0] == '-' && strlen(argi[0]) > 1) | 648 if (argi[0][0] == '-' && strlen(argi[0]) > 1) |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 vpx_usec_timer_start(&timer); | 811 vpx_usec_timer_start(&timer); |
808 | 812 |
809 if (vpx_codec_decode(&decoder, buf, (unsigned int)bytes_in_buffer, | 813 if (vpx_codec_decode(&decoder, buf, (unsigned int)bytes_in_buffer, |
810 NULL, 0)) { | 814 NULL, 0)) { |
811 const char *detail = vpx_codec_error_detail(&decoder); | 815 const char *detail = vpx_codec_error_detail(&decoder); |
812 warn("Failed to decode frame %d: %s", | 816 warn("Failed to decode frame %d: %s", |
813 frame_in, vpx_codec_error(&decoder)); | 817 frame_in, vpx_codec_error(&decoder)); |
814 | 818 |
815 if (detail) | 819 if (detail) |
816 warn("Additional information: %s", detail); | 820 warn("Additional information: %s", detail); |
817 goto fail; | 821 if (!keep_going) |
| 822 goto fail; |
818 } | 823 } |
819 | 824 |
820 vpx_usec_timer_mark(&timer); | 825 vpx_usec_timer_mark(&timer); |
821 dx_time += vpx_usec_timer_elapsed(&timer); | 826 dx_time += vpx_usec_timer_elapsed(&timer); |
822 } | 827 } |
823 } | 828 } |
824 | 829 |
825 vpx_usec_timer_start(&timer); | 830 vpx_usec_timer_start(&timer); |
826 | 831 |
827 got_data = 0; | 832 got_data = 0; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 | 893 |
889 if (single_file) { | 894 if (single_file) { |
890 if (use_y4m) { | 895 if (use_y4m) { |
891 char buf[Y4M_BUFFER_SIZE] = {0}; | 896 char buf[Y4M_BUFFER_SIZE] = {0}; |
892 size_t len = 0; | 897 size_t len = 0; |
893 if (frame_out == 1) { | 898 if (frame_out == 1) { |
894 // Y4M file header | 899 // Y4M file header |
895 len = y4m_write_file_header(buf, sizeof(buf), | 900 len = y4m_write_file_header(buf, sizeof(buf), |
896 vpx_input_ctx.width, | 901 vpx_input_ctx.width, |
897 vpx_input_ctx.height, | 902 vpx_input_ctx.height, |
898 &vpx_input_ctx.framerate, img->fmt); | 903 &vpx_input_ctx.framerate, |
| 904 img->fmt, 8); |
899 if (do_md5) { | 905 if (do_md5) { |
900 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); | 906 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); |
901 } else { | 907 } else { |
902 fputs(buf, outfile); | 908 fputs(buf, outfile); |
903 } | 909 } |
904 } | 910 } |
905 | 911 |
906 // Y4M frame header | 912 // Y4M frame header |
907 len = y4m_write_frame_header(buf, sizeof(buf)); | 913 len = y4m_write_frame_header(buf, sizeof(buf)); |
908 if (do_md5) { | 914 if (do_md5) { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
997 if (arg_match(&arg, &looparg, argi)) { | 1003 if (arg_match(&arg, &looparg, argi)) { |
998 loops = arg_parse_uint(&arg); | 1004 loops = arg_parse_uint(&arg); |
999 break; | 1005 break; |
1000 } | 1006 } |
1001 } | 1007 } |
1002 free(argv); | 1008 free(argv); |
1003 for (i = 0; !error && i < loops; i++) | 1009 for (i = 0; !error && i < loops; i++) |
1004 error = main_loop(argc, argv_); | 1010 error = main_loop(argc, argv_); |
1005 return error; | 1011 return error; |
1006 } | 1012 } |
OLD | NEW |