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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 111 |
112 void usage_exit() { | 112 void usage_exit() { |
113 fprintf(stderr, | 113 fprintf(stderr, |
114 "Usage: %s <codec> <width> <height> <infile> <outfile> " | 114 "Usage: %s <codec> <width> <height> <infile> <outfile> " |
115 "<keyframe-interval> [<error-resilient>]\nSee comments in " | 115 "<keyframe-interval> [<error-resilient>]\nSee comments in " |
116 "simple_encoder.c for more information.\n", | 116 "simple_encoder.c for more information.\n", |
117 exec_name); | 117 exec_name); |
118 exit(EXIT_FAILURE); | 118 exit(EXIT_FAILURE); |
119 } | 119 } |
120 | 120 |
121 static void encode_frame(vpx_codec_ctx_t *codec, | 121 static int encode_frame(vpx_codec_ctx_t *codec, |
122 vpx_image_t *img, | 122 vpx_image_t *img, |
123 int frame_index, | 123 int frame_index, |
124 int flags, | 124 int flags, |
125 VpxVideoWriter *writer) { | 125 VpxVideoWriter *writer) { |
| 126 int got_pkts = 0; |
126 vpx_codec_iter_t iter = NULL; | 127 vpx_codec_iter_t iter = NULL; |
127 const vpx_codec_cx_pkt_t *pkt = NULL; | 128 const vpx_codec_cx_pkt_t *pkt = NULL; |
128 const vpx_codec_err_t res = vpx_codec_encode(codec, img, frame_index, 1, | 129 const vpx_codec_err_t res = vpx_codec_encode(codec, img, frame_index, 1, |
129 flags, VPX_DL_GOOD_QUALITY); | 130 flags, VPX_DL_GOOD_QUALITY); |
130 if (res != VPX_CODEC_OK) | 131 if (res != VPX_CODEC_OK) |
131 die_codec(codec, "Failed to encode frame"); | 132 die_codec(codec, "Failed to encode frame"); |
132 | 133 |
133 while ((pkt = vpx_codec_get_cx_data(codec, &iter)) != NULL) { | 134 while ((pkt = vpx_codec_get_cx_data(codec, &iter)) != NULL) { |
| 135 got_pkts = 1; |
| 136 |
134 if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) { | 137 if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) { |
135 const int keyframe = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) != 0; | 138 const int keyframe = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) != 0; |
136 if (!vpx_video_writer_write_frame(writer, | 139 if (!vpx_video_writer_write_frame(writer, |
137 pkt->data.frame.buf, | 140 pkt->data.frame.buf, |
138 pkt->data.frame.sz, | 141 pkt->data.frame.sz, |
139 pkt->data.frame.pts)) { | 142 pkt->data.frame.pts)) { |
140 die_codec(codec, "Failed to write compressed frame"); | 143 die_codec(codec, "Failed to write compressed frame"); |
141 } | 144 } |
142 | |
143 printf(keyframe ? "K" : "."); | 145 printf(keyframe ? "K" : "."); |
144 fflush(stdout); | 146 fflush(stdout); |
145 } | 147 } |
146 } | 148 } |
| 149 |
| 150 return got_pkts; |
147 } | 151 } |
148 | 152 |
149 int main(int argc, char **argv) { | 153 int main(int argc, char **argv) { |
150 FILE *infile = NULL; | 154 FILE *infile = NULL; |
151 vpx_codec_ctx_t codec; | 155 vpx_codec_ctx_t codec; |
152 vpx_codec_enc_cfg_t cfg; | 156 vpx_codec_enc_cfg_t cfg; |
153 int frame_count = 0; | 157 int frame_count = 0; |
154 vpx_image_t raw; | 158 vpx_image_t raw; |
155 vpx_codec_err_t res; | 159 vpx_codec_err_t res; |
156 VpxVideoInfo info = {0}; | 160 VpxVideoInfo info = {0}; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 writer = vpx_video_writer_open(outfile_arg, kContainerIVF, &info); | 227 writer = vpx_video_writer_open(outfile_arg, kContainerIVF, &info); |
224 if (!writer) | 228 if (!writer) |
225 die("Failed to open %s for writing.", outfile_arg); | 229 die("Failed to open %s for writing.", outfile_arg); |
226 | 230 |
227 if (!(infile = fopen(infile_arg, "rb"))) | 231 if (!(infile = fopen(infile_arg, "rb"))) |
228 die("Failed to open %s for reading.", infile_arg); | 232 die("Failed to open %s for reading.", infile_arg); |
229 | 233 |
230 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) | 234 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) |
231 die_codec(&codec, "Failed to initialize encoder"); | 235 die_codec(&codec, "Failed to initialize encoder"); |
232 | 236 |
| 237 // Encode frames. |
233 while (vpx_img_read(&raw, infile)) { | 238 while (vpx_img_read(&raw, infile)) { |
234 int flags = 0; | 239 int flags = 0; |
235 if (keyframe_interval > 0 && frame_count % keyframe_interval == 0) | 240 if (keyframe_interval > 0 && frame_count % keyframe_interval == 0) |
236 flags |= VPX_EFLAG_FORCE_KF; | 241 flags |= VPX_EFLAG_FORCE_KF; |
237 encode_frame(&codec, &raw, frame_count++, flags, writer); | 242 encode_frame(&codec, &raw, frame_count++, flags, writer); |
238 } | 243 } |
239 encode_frame(&codec, NULL, -1, 0, writer); // flush the encoder | 244 |
| 245 // Flush encoder. |
| 246 while (encode_frame(&codec, NULL, -1, 0, writer)) {}; |
240 | 247 |
241 printf("\n"); | 248 printf("\n"); |
242 fclose(infile); | 249 fclose(infile); |
243 printf("Processed %d frames.\n", frame_count); | 250 printf("Processed %d frames.\n", frame_count); |
244 | 251 |
245 vpx_img_free(&raw); | 252 vpx_img_free(&raw); |
246 if (vpx_codec_destroy(&codec)) | 253 if (vpx_codec_destroy(&codec)) |
247 die_codec(&codec, "Failed to destroy codec."); | 254 die_codec(&codec, "Failed to destroy codec."); |
248 | 255 |
249 vpx_video_writer_close(writer); | 256 vpx_video_writer_close(writer); |
250 | 257 |
251 return EXIT_SUCCESS; | 258 return EXIT_SUCCESS; |
252 } | 259 } |
OLD | NEW |