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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 static const arg_def_t looparg = ARG_DEF(NULL, "loops", 1, | 48 static const arg_def_t looparg = ARG_DEF(NULL, "loops", 1, |
49 "Number of times to decode the file"); | 49 "Number of times to decode the file"); |
50 static const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, | 50 static const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, |
51 "Codec to use"); | 51 "Codec to use"); |
52 static const arg_def_t use_yv12 = ARG_DEF(NULL, "yv12", 0, | 52 static const arg_def_t use_yv12 = ARG_DEF(NULL, "yv12", 0, |
53 "Output raw YV12 frames"); | 53 "Output raw YV12 frames"); |
54 static const arg_def_t use_i420 = ARG_DEF(NULL, "i420", 0, | 54 static const arg_def_t use_i420 = ARG_DEF(NULL, "i420", 0, |
55 "Output raw I420 frames"); | 55 "Output raw I420 frames"); |
56 static const arg_def_t flipuvarg = ARG_DEF(NULL, "flipuv", 0, | 56 static const arg_def_t flipuvarg = ARG_DEF(NULL, "flipuv", 0, |
57 "Flip the chroma planes in the output
"); | 57 "Flip the chroma planes in the output
"); |
| 58 static const arg_def_t rawvideo = ARG_DEF(NULL, "rawvideo", 0, |
| 59 "Output raw YUV frames"); |
58 static const arg_def_t noblitarg = ARG_DEF(NULL, "noblit", 0, | 60 static const arg_def_t noblitarg = ARG_DEF(NULL, "noblit", 0, |
59 "Don't process the decoded frames"); | 61 "Don't process the decoded frames"); |
60 static const arg_def_t progressarg = ARG_DEF(NULL, "progress", 0, | 62 static const arg_def_t progressarg = ARG_DEF(NULL, "progress", 0, |
61 "Show progress after each frame dec
odes"); | 63 "Show progress after each frame dec
odes"); |
62 static const arg_def_t limitarg = ARG_DEF(NULL, "limit", 1, | 64 static const arg_def_t limitarg = ARG_DEF(NULL, "limit", 1, |
63 "Stop decoding after n frames"); | 65 "Stop decoding after n frames"); |
64 static const arg_def_t skiparg = ARG_DEF(NULL, "skip", 1, | 66 static const arg_def_t skiparg = ARG_DEF(NULL, "skip", 1, |
65 "Skip the first n input frames"); | 67 "Skip the first n input frames"); |
66 static const arg_def_t postprocarg = ARG_DEF(NULL, "postproc", 0, | 68 static const arg_def_t postprocarg = ARG_DEF(NULL, "postproc", 0, |
67 "Postprocess decoded frames"); | 69 "Postprocess decoded frames"); |
(...skipping 12 matching lines...) Expand all Loading... |
80 static const arg_def_t continuearg = | 82 static const arg_def_t continuearg = |
81 ARG_DEF("k", "keep-going", 0, "(debug) Continue decoding after error"); | 83 ARG_DEF("k", "keep-going", 0, "(debug) Continue decoding after error"); |
82 | 84 |
83 static const arg_def_t fb_arg = | 85 static const arg_def_t fb_arg = |
84 ARG_DEF(NULL, "frame-buffers", 1, "Number of frame buffers to use"); | 86 ARG_DEF(NULL, "frame-buffers", 1, "Number of frame buffers to use"); |
85 | 87 |
86 static const arg_def_t md5arg = ARG_DEF(NULL, "md5", 0, | 88 static const arg_def_t md5arg = ARG_DEF(NULL, "md5", 0, |
87 "Compute the MD5 sum of the decoded fram
e"); | 89 "Compute the MD5 sum of the decoded fram
e"); |
88 | 90 |
89 static const arg_def_t *all_args[] = { | 91 static const arg_def_t *all_args[] = { |
90 &codecarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg, | 92 &codecarg, &use_yv12, &use_i420, &flipuvarg, &rawvideo, &noblitarg, |
91 &progressarg, &limitarg, &skiparg, &postprocarg, &summaryarg, &outputfile, | 93 &progressarg, &limitarg, &skiparg, &postprocarg, &summaryarg, &outputfile, |
92 &threadsarg, &verbosearg, &scalearg, &fb_arg, | 94 &threadsarg, &verbosearg, &scalearg, &fb_arg, |
93 &md5arg, &error_concealment, &continuearg, | 95 &md5arg, &error_concealment, &continuearg, |
94 NULL | 96 NULL |
95 }; | 97 }; |
96 | 98 |
97 #if CONFIG_VP8_DECODER | 99 #if CONFIG_VP8_DECODER |
98 static const arg_def_t addnoise_level = ARG_DEF(NULL, "noise-level", 1, | 100 static const arg_def_t addnoise_level = ARG_DEF(NULL, "noise-level", 1, |
99 "Enable VP8 postproc add noise")
; | 101 "Enable VP8 postproc add noise")
; |
100 static const arg_def_t deblock = ARG_DEF(NULL, "deblock", 0, | 102 static const arg_def_t deblock = ARG_DEF(NULL, "deblock", 0, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 "\n\t%%<n> - Frame number, zero padded to <n> places (1..9)" | 161 "\n\t%%<n> - Frame number, zero padded to <n> places (1..9)" |
160 "\n\n Pattern arguments are only supported in conjunction " | 162 "\n\n Pattern arguments are only supported in conjunction " |
161 "with the --yv12 and\n --i420 options. If the -o option is " | 163 "with the --yv12 and\n --i420 options. If the -o option is " |
162 "not specified, the output will be\n directed to stdout.\n" | 164 "not specified, the output will be\n directed to stdout.\n" |
163 ); | 165 ); |
164 fprintf(stderr, "\nIncluded decoders:\n\n"); | 166 fprintf(stderr, "\nIncluded decoders:\n\n"); |
165 | 167 |
166 for (i = 0; i < get_vpx_decoder_count(); ++i) { | 168 for (i = 0; i < get_vpx_decoder_count(); ++i) { |
167 const VpxInterface *const decoder = get_vpx_decoder_by_index(i); | 169 const VpxInterface *const decoder = get_vpx_decoder_by_index(i); |
168 fprintf(stderr, " %-6s - %s\n", | 170 fprintf(stderr, " %-6s - %s\n", |
169 decoder->name, vpx_codec_iface_name(decoder->interface())); | 171 decoder->name, vpx_codec_iface_name(decoder->codec_interface())); |
170 } | 172 } |
171 | 173 |
172 exit(EXIT_FAILURE); | 174 exit(EXIT_FAILURE); |
173 } | 175 } |
174 | 176 |
175 static int raw_read_frame(FILE *infile, uint8_t **buffer, | 177 static int raw_read_frame(FILE *infile, uint8_t **buffer, |
176 size_t *bytes_read, size_t *buffer_size) { | 178 size_t *bytes_read, size_t *buffer_size) { |
177 char raw_hdr[RAW_FRAME_HDR_SZ]; | 179 char raw_hdr[RAW_FRAME_HDR_SZ]; |
178 size_t frame_size = 0; | 180 size_t frame_size = 0; |
179 | 181 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 vpx_codec_stream_info_t si; | 281 vpx_codec_stream_info_t si; |
280 | 282 |
281 si.sz = sizeof(si); | 283 si.sz = sizeof(si); |
282 | 284 |
283 if (fread(buf, 1, 32, input->file) == 32) { | 285 if (fread(buf, 1, 32, input->file) == 32) { |
284 int i; | 286 int i; |
285 | 287 |
286 if (mem_get_le32(buf) < 256 * 1024 * 1024) { | 288 if (mem_get_le32(buf) < 256 * 1024 * 1024) { |
287 for (i = 0; i < get_vpx_decoder_count(); ++i) { | 289 for (i = 0; i < get_vpx_decoder_count(); ++i) { |
288 const VpxInterface *const decoder = get_vpx_decoder_by_index(i); | 290 const VpxInterface *const decoder = get_vpx_decoder_by_index(i); |
289 if (!vpx_codec_peek_stream_info(decoder->interface(), | 291 if (!vpx_codec_peek_stream_info(decoder->codec_interface(), |
290 buf + 4, 32 - 4, &si)) { | 292 buf + 4, 32 - 4, &si)) { |
291 is_raw = 1; | 293 is_raw = 1; |
292 input->fourcc = decoder->fourcc; | 294 input->fourcc = decoder->fourcc; |
293 input->width = si.w; | 295 input->width = si.w; |
294 input->height = si.h; | 296 input->height = si.h; |
295 input->framerate.numerator = 30; | 297 input->framerate.numerator = 30; |
296 input->framerate.denominator = 1; | 298 input->framerate.denominator = 1; |
297 break; | 299 break; |
298 } | 300 } |
299 } | 301 } |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 int ec_enabled = 0; | 502 int ec_enabled = 0; |
501 int keep_going = 0; | 503 int keep_going = 0; |
502 const VpxInterface *interface = NULL; | 504 const VpxInterface *interface = NULL; |
503 const VpxInterface *fourcc_interface = NULL; | 505 const VpxInterface *fourcc_interface = NULL; |
504 uint64_t dx_time = 0; | 506 uint64_t dx_time = 0; |
505 struct arg arg; | 507 struct arg arg; |
506 char **argv, **argi, **argj; | 508 char **argv, **argi, **argj; |
507 | 509 |
508 int single_file; | 510 int single_file; |
509 int use_y4m = 1; | 511 int use_y4m = 1; |
| 512 int opt_yv12 = 0; |
| 513 int opt_i420 = 0; |
510 vpx_codec_dec_cfg_t cfg = {0}; | 514 vpx_codec_dec_cfg_t cfg = {0}; |
511 #if CONFIG_VP8_DECODER | 515 #if CONFIG_VP8_DECODER |
512 vp8_postproc_cfg_t vp8_pp_cfg = {0}; | 516 vp8_postproc_cfg_t vp8_pp_cfg = {0}; |
513 int vp8_dbg_color_ref_frame = 0; | 517 int vp8_dbg_color_ref_frame = 0; |
514 int vp8_dbg_color_mb_modes = 0; | 518 int vp8_dbg_color_mb_modes = 0; |
515 int vp8_dbg_color_b_modes = 0; | 519 int vp8_dbg_color_b_modes = 0; |
516 int vp8_dbg_display_mv = 0; | 520 int vp8_dbg_display_mv = 0; |
517 #endif | 521 #endif |
518 int frames_corrupted = 0; | 522 int frames_corrupted = 0; |
519 int dec_flags = 0; | 523 int dec_flags = 0; |
(...skipping 30 matching lines...) Expand all Loading... |
550 interface = get_vpx_decoder_by_name(arg.val); | 554 interface = get_vpx_decoder_by_name(arg.val); |
551 if (!interface) | 555 if (!interface) |
552 die("Error: Unrecognized argument (%s) to --codec\n", arg.val); | 556 die("Error: Unrecognized argument (%s) to --codec\n", arg.val); |
553 } else if (arg_match(&arg, &looparg, argi)) { | 557 } else if (arg_match(&arg, &looparg, argi)) { |
554 // no-op | 558 // no-op |
555 } else if (arg_match(&arg, &outputfile, argi)) | 559 } else if (arg_match(&arg, &outputfile, argi)) |
556 outfile_pattern = arg.val; | 560 outfile_pattern = arg.val; |
557 else if (arg_match(&arg, &use_yv12, argi)) { | 561 else if (arg_match(&arg, &use_yv12, argi)) { |
558 use_y4m = 0; | 562 use_y4m = 0; |
559 flipuv = 1; | 563 flipuv = 1; |
| 564 opt_yv12 = 1; |
560 } else if (arg_match(&arg, &use_i420, argi)) { | 565 } else if (arg_match(&arg, &use_i420, argi)) { |
561 use_y4m = 0; | 566 use_y4m = 0; |
562 flipuv = 0; | 567 flipuv = 0; |
| 568 opt_i420 = 1; |
| 569 } else if (arg_match(&arg, &rawvideo, argi)) { |
| 570 use_y4m = 0; |
563 } else if (arg_match(&arg, &flipuvarg, argi)) | 571 } else if (arg_match(&arg, &flipuvarg, argi)) |
564 flipuv = 1; | 572 flipuv = 1; |
565 else if (arg_match(&arg, &noblitarg, argi)) | 573 else if (arg_match(&arg, &noblitarg, argi)) |
566 noblit = 1; | 574 noblit = 1; |
567 else if (arg_match(&arg, &progressarg, argi)) | 575 else if (arg_match(&arg, &progressarg, argi)) |
568 progress = 1; | 576 progress = 1; |
569 else if (arg_match(&arg, &limitarg, argi)) | 577 else if (arg_match(&arg, &limitarg, argi)) |
570 stop_after = arg_parse_uint(&arg); | 578 stop_after = arg_parse_uint(&arg); |
571 else if (arg_match(&arg, &skiparg, argi)) | 579 else if (arg_match(&arg, &skiparg, argi)) |
572 arg_skip = arg_parse_uint(&arg); | 580 arg_skip = arg_parse_uint(&arg); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 if (interface && fourcc_interface && interface != fourcc_interface) | 729 if (interface && fourcc_interface && interface != fourcc_interface) |
722 warn("Header indicates codec: %s\n", fourcc_interface->name); | 730 warn("Header indicates codec: %s\n", fourcc_interface->name); |
723 else | 731 else |
724 interface = fourcc_interface; | 732 interface = fourcc_interface; |
725 | 733 |
726 if (!interface) | 734 if (!interface) |
727 interface = get_vpx_decoder_by_index(0); | 735 interface = get_vpx_decoder_by_index(0); |
728 | 736 |
729 dec_flags = (postproc ? VPX_CODEC_USE_POSTPROC : 0) | | 737 dec_flags = (postproc ? VPX_CODEC_USE_POSTPROC : 0) | |
730 (ec_enabled ? VPX_CODEC_USE_ERROR_CONCEALMENT : 0); | 738 (ec_enabled ? VPX_CODEC_USE_ERROR_CONCEALMENT : 0); |
731 if (vpx_codec_dec_init(&decoder, interface->interface(), &cfg, dec_flags)) { | 739 if (vpx_codec_dec_init(&decoder, interface->codec_interface(), |
| 740 &cfg, dec_flags)) { |
732 fprintf(stderr, "Failed to initialize decoder: %s\n", | 741 fprintf(stderr, "Failed to initialize decoder: %s\n", |
733 vpx_codec_error(&decoder)); | 742 vpx_codec_error(&decoder)); |
734 return EXIT_FAILURE; | 743 return EXIT_FAILURE; |
735 } | 744 } |
736 | 745 |
737 if (!quiet) | 746 if (!quiet) |
738 fprintf(stderr, "%s\n", decoder.name); | 747 fprintf(stderr, "%s\n", decoder.name); |
739 | 748 |
740 #if CONFIG_VP8_DECODER | 749 #if CONFIG_VP8_DECODER |
741 | 750 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 // As last resort use size of first frame as display size. | 877 // As last resort use size of first frame as display size. |
869 display_width = img->d_w; | 878 display_width = img->d_w; |
870 display_height = img->d_h; | 879 display_height = img->d_h; |
871 } else { | 880 } else { |
872 display_width = display_size[0]; | 881 display_width = display_size[0]; |
873 display_height = display_size[1]; | 882 display_height = display_size[1]; |
874 } | 883 } |
875 } | 884 } |
876 scaled_img = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, display_width, | 885 scaled_img = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, display_width, |
877 display_height, 16); | 886 display_height, 16); |
| 887 scaled_img->bit_depth = img->bit_depth; |
878 } | 888 } |
879 | 889 |
880 if (img->d_w != scaled_img->d_w || img->d_h != scaled_img->d_h) { | 890 if (img->d_w != scaled_img->d_w || img->d_h != scaled_img->d_h) { |
881 #if CONFIG_LIBYUV | 891 #if CONFIG_LIBYUV |
882 vpx_image_scale(img, scaled_img, kFilterBox); | 892 vpx_image_scale(img, scaled_img, kFilterBox); |
883 img = scaled_img; | 893 img = scaled_img; |
884 #else | 894 #else |
885 fprintf(stderr, "Failed to scale output frame: %s.\n" | 895 fprintf(stderr, "Failed to scale output frame: %s.\n" |
886 "Scaling is disabled in this configuration. " | 896 "Scaling is disabled in this configuration. " |
887 "To enable scaling, configure with --enable-libyuv\n", | 897 "To enable scaling, configure with --enable-libyuv\n", |
888 vpx_codec_error(&decoder)); | 898 vpx_codec_error(&decoder)); |
889 return EXIT_FAILURE; | 899 return EXIT_FAILURE; |
890 #endif | 900 #endif |
891 } | 901 } |
892 } | 902 } |
893 | 903 |
894 if (single_file) { | 904 if (single_file) { |
895 if (use_y4m) { | 905 if (use_y4m) { |
896 char buf[Y4M_BUFFER_SIZE] = {0}; | 906 char buf[Y4M_BUFFER_SIZE] = {0}; |
897 size_t len = 0; | 907 size_t len = 0; |
898 if (frame_out == 1) { | 908 if (frame_out == 1) { |
899 // Y4M file header | 909 // Y4M file header |
900 len = y4m_write_file_header(buf, sizeof(buf), | 910 len = y4m_write_file_header(buf, sizeof(buf), |
901 vpx_input_ctx.width, | 911 vpx_input_ctx.width, |
902 vpx_input_ctx.height, | 912 vpx_input_ctx.height, |
903 &vpx_input_ctx.framerate, | 913 &vpx_input_ctx.framerate, |
904 img->fmt, 8); | 914 img->fmt, img->bit_depth); |
905 if (do_md5) { | 915 if (do_md5) { |
906 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); | 916 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); |
907 } else { | 917 } else { |
908 fputs(buf, outfile); | 918 fputs(buf, outfile); |
909 } | 919 } |
910 } | 920 } |
911 | 921 |
912 // Y4M frame header | 922 // Y4M frame header |
913 len = y4m_write_frame_header(buf, sizeof(buf)); | 923 len = y4m_write_frame_header(buf, sizeof(buf)); |
914 if (do_md5) { | 924 if (do_md5) { |
915 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); | 925 MD5Update(&md5_ctx, (md5byte *)buf, (unsigned int)len); |
916 } else { | 926 } else { |
917 fputs(buf, outfile); | 927 fputs(buf, outfile); |
918 } | 928 } |
| 929 } else { |
| 930 if (frame_out == 1) { |
| 931 // Check if --yv12 or --i420 options are consistent with the |
| 932 // bit-stream decoded |
| 933 if (opt_i420) { |
| 934 if (img->fmt != VPX_IMG_FMT_I420 && |
| 935 img->fmt != VPX_IMG_FMT_I42016) { |
| 936 fprintf(stderr, "Cannot produce i420 output for bit-stream.\n"); |
| 937 goto fail; |
| 938 } |
| 939 } |
| 940 if (opt_yv12) { |
| 941 if ((img->fmt != VPX_IMG_FMT_I420 && |
| 942 img->fmt != VPX_IMG_FMT_YV12) || img->bit_depth != 8) { |
| 943 fprintf(stderr, "Cannot produce yv12 output for bit-stream.\n"); |
| 944 goto fail; |
| 945 } |
| 946 } |
| 947 } |
919 } | 948 } |
920 | 949 |
921 if (do_md5) { | 950 if (do_md5) { |
922 update_image_md5(img, planes, &md5_ctx); | 951 update_image_md5(img, planes, &md5_ctx); |
923 } else { | 952 } else { |
924 write_image_file(img, planes, outfile); | 953 write_image_file(img, planes, outfile); |
925 } | 954 } |
926 } else { | 955 } else { |
927 generate_filename(outfile_pattern, outfile_name, PATH_MAX, | 956 generate_filename(outfile_pattern, outfile_name, PATH_MAX, |
928 img->d_w, img->d_h, frame_in); | 957 img->d_w, img->d_h, frame_in); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 if (arg_match(&arg, &looparg, argi)) { | 1032 if (arg_match(&arg, &looparg, argi)) { |
1004 loops = arg_parse_uint(&arg); | 1033 loops = arg_parse_uint(&arg); |
1005 break; | 1034 break; |
1006 } | 1035 } |
1007 } | 1036 } |
1008 free(argv); | 1037 free(argv); |
1009 for (i = 0; !error && i < loops; i++) | 1038 for (i = 0; !error && i < loops; i++) |
1010 error = main_loop(argc, argv_); | 1039 error = main_loop(argc, argv_); |
1011 return error; | 1040 return error; |
1012 } | 1041 } |
OLD | NEW |