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 10 matching lines...) Expand all Loading... |
21 // statistics packets. | 21 // statistics packets. |
22 // | 22 // |
23 // Updating The Configuration | 23 // Updating The Configuration |
24 // --------------------------------- | 24 // --------------------------------- |
25 // In two pass mode, the configuration has to be updated on each pass. The | 25 // In two pass mode, the configuration has to be updated on each pass. The |
26 // statistics buffer is passed on the last pass. | 26 // statistics buffer is passed on the last pass. |
27 // | 27 // |
28 // Encoding A Frame | 28 // Encoding A Frame |
29 // ---------------- | 29 // ---------------- |
30 // Encoding a frame in two pass mode is identical to the simple encoder | 30 // Encoding a frame in two pass mode is identical to the simple encoder |
31 // example, except the deadline is set to VPX_DL_BEST_QUALITY to get the | 31 // example. To increase the quality while sacrificing encoding speed, |
32 // best quality possible. VPX_DL_GOOD_QUALITY could also be used. | 32 // VPX_DL_BEST_QUALITY can be used in place of VPX_DL_GOOD_QUALITY. |
33 // | |
34 // | 33 // |
35 // Processing Statistics Packets | 34 // Processing Statistics Packets |
36 // ----------------------------- | 35 // ----------------------------- |
37 // Each packet of type `VPX_CODEC_CX_FRAME_PKT` contains the encoded data | 36 // Each packet of type `VPX_CODEC_CX_FRAME_PKT` contains the encoded data |
38 // for this frame. We write a IVF frame header, followed by the raw data. | 37 // for this frame. We write a IVF frame header, followed by the raw data. |
39 // | 38 // |
40 // | 39 // |
41 // Pass Progress Reporting | 40 // Pass Progress Reporting |
42 // ----------------------------- | 41 // ----------------------------- |
43 // It's sometimes helpful to see when each pass completes. | 42 // It's sometimes helpful to see when each pass completes. |
44 // | 43 // |
45 // | 44 // |
46 // Clean-up | 45 // Clean-up |
47 // ----------------------------- | 46 // ----------------------------- |
48 // Destruction of the encoder instance must be done on each pass. The | 47 // Destruction of the encoder instance must be done on each pass. The |
49 // raw image should be destroyed at the end as usual. | 48 // raw image should be destroyed at the end as usual. |
50 | 49 |
51 #include <stdio.h> | 50 #include <stdio.h> |
52 #include <stdlib.h> | 51 #include <stdlib.h> |
53 #include <string.h> | 52 #include <string.h> |
54 | 53 |
55 #define VPX_CODEC_DISABLE_COMPAT 1 | |
56 #include "vpx/vpx_encoder.h" | 54 #include "vpx/vpx_encoder.h" |
57 | 55 |
58 #include "./tools_common.h" | 56 #include "./tools_common.h" |
59 #include "./video_writer.h" | 57 #include "./video_writer.h" |
60 | 58 |
61 static const char *exec_name; | 59 static const char *exec_name; |
62 | 60 |
63 void usage_exit() { | 61 void usage_exit() { |
64 fprintf(stderr, "Usage: %s <codec> <width> <height> <infile> <outfile>\n", | 62 fprintf(stderr, "Usage: %s <codec> <width> <height> <infile> <outfile>\n", |
65 exec_name); | 63 exec_name); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 vpx_codec_ctx_t codec; | 133 vpx_codec_ctx_t codec; |
136 int frame_count = 0; | 134 int frame_count = 0; |
137 vpx_fixed_buf_t stats = {NULL, 0}; | 135 vpx_fixed_buf_t stats = {NULL, 0}; |
138 | 136 |
139 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) | 137 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) |
140 die_codec(&codec, "Failed to initialize encoder"); | 138 die_codec(&codec, "Failed to initialize encoder"); |
141 | 139 |
142 // Calculate frame statistics. | 140 // Calculate frame statistics. |
143 while (vpx_img_read(raw, infile)) { | 141 while (vpx_img_read(raw, infile)) { |
144 ++frame_count; | 142 ++frame_count; |
145 get_frame_stats(&codec, raw, frame_count, 1, 0, VPX_DL_BEST_QUALITY, | 143 get_frame_stats(&codec, raw, frame_count, 1, 0, VPX_DL_GOOD_QUALITY, |
146 &stats); | 144 &stats); |
147 } | 145 } |
148 | 146 |
149 // Flush encoder. | 147 // Flush encoder. |
150 while (get_frame_stats(&codec, NULL, frame_count, 1, 0, | 148 while (get_frame_stats(&codec, NULL, frame_count, 1, 0, |
151 VPX_DL_BEST_QUALITY, &stats)) {} | 149 VPX_DL_GOOD_QUALITY, &stats)) {} |
152 | 150 |
153 printf("Pass 0 complete. Processed %d frames.\n", frame_count); | 151 printf("Pass 0 complete. Processed %d frames.\n", frame_count); |
154 if (vpx_codec_destroy(&codec)) | 152 if (vpx_codec_destroy(&codec)) |
155 die_codec(&codec, "Failed to destroy codec."); | 153 die_codec(&codec, "Failed to destroy codec."); |
156 | 154 |
157 return stats; | 155 return stats; |
158 } | 156 } |
159 | 157 |
160 static void pass1(vpx_image_t *raw, | 158 static void pass1(vpx_image_t *raw, |
161 FILE *infile, | 159 FILE *infile, |
(...skipping 13 matching lines...) Expand all Loading... |
175 writer = vpx_video_writer_open(outfile_name, kContainerIVF, &info); | 173 writer = vpx_video_writer_open(outfile_name, kContainerIVF, &info); |
176 if (!writer) | 174 if (!writer) |
177 die("Failed to open %s for writing", outfile_name); | 175 die("Failed to open %s for writing", outfile_name); |
178 | 176 |
179 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) | 177 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) |
180 die_codec(&codec, "Failed to initialize encoder"); | 178 die_codec(&codec, "Failed to initialize encoder"); |
181 | 179 |
182 // Encode frames. | 180 // Encode frames. |
183 while (vpx_img_read(raw, infile)) { | 181 while (vpx_img_read(raw, infile)) { |
184 ++frame_count; | 182 ++frame_count; |
185 encode_frame(&codec, raw, frame_count, 1, 0, VPX_DL_BEST_QUALITY, writer); | 183 encode_frame(&codec, raw, frame_count, 1, 0, VPX_DL_GOOD_QUALITY, writer); |
186 } | 184 } |
187 | 185 |
188 // Flush encoder. | 186 // Flush encoder. |
189 while (encode_frame(&codec, NULL, -1, 1, 0, VPX_DL_BEST_QUALITY, writer)) {} | 187 while (encode_frame(&codec, NULL, -1, 1, 0, VPX_DL_GOOD_QUALITY, writer)) {} |
190 | 188 |
191 printf("\n"); | 189 printf("\n"); |
192 | 190 |
193 if (vpx_codec_destroy(&codec)) | 191 if (vpx_codec_destroy(&codec)) |
194 die_codec(&codec, "Failed to destroy codec."); | 192 die_codec(&codec, "Failed to destroy codec."); |
195 | 193 |
196 vpx_video_writer_close(writer); | 194 vpx_video_writer_close(writer); |
197 | 195 |
198 printf("Pass 1 complete. Processed %d frames.\n", frame_count); | 196 printf("Pass 1 complete. Processed %d frames.\n", frame_count); |
199 } | 197 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 cfg.g_pass = VPX_RC_LAST_PASS; | 256 cfg.g_pass = VPX_RC_LAST_PASS; |
259 cfg.rc_twopass_stats_in = stats; | 257 cfg.rc_twopass_stats_in = stats; |
260 pass1(&raw, infile, outfile_arg, encoder, &cfg); | 258 pass1(&raw, infile, outfile_arg, encoder, &cfg); |
261 free(stats.buf); | 259 free(stats.buf); |
262 | 260 |
263 vpx_img_free(&raw); | 261 vpx_img_free(&raw); |
264 fclose(infile); | 262 fclose(infile); |
265 | 263 |
266 return EXIT_SUCCESS; | 264 return EXIT_SUCCESS; |
267 } | 265 } |
OLD | NEW |