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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 #include "./video_writer.h" | 58 #include "./video_writer.h" |
59 | 59 |
60 static const char *exec_name; | 60 static const char *exec_name; |
61 | 61 |
62 void usage_exit() { | 62 void usage_exit() { |
63 fprintf(stderr, "Usage: %s <width> <height> <infile> <outfile> <frame>\n", | 63 fprintf(stderr, "Usage: %s <width> <height> <infile> <outfile> <frame>\n", |
64 exec_name); | 64 exec_name); |
65 exit(EXIT_FAILURE); | 65 exit(EXIT_FAILURE); |
66 } | 66 } |
67 | 67 |
68 static void encode_frame(vpx_codec_ctx_t *codec, | 68 static int encode_frame(vpx_codec_ctx_t *codec, |
69 vpx_image_t *img, | 69 vpx_image_t *img, |
70 int frame_index, | 70 int frame_index, |
71 VpxVideoWriter *writer) { | 71 VpxVideoWriter *writer) { |
| 72 int got_pkts = 0; |
72 vpx_codec_iter_t iter = NULL; | 73 vpx_codec_iter_t iter = NULL; |
73 const vpx_codec_cx_pkt_t *pkt = NULL; | 74 const vpx_codec_cx_pkt_t *pkt = NULL; |
74 const vpx_codec_err_t res = vpx_codec_encode(codec, img, frame_index, 1, 0, | 75 const vpx_codec_err_t res = vpx_codec_encode(codec, img, frame_index, 1, 0, |
75 VPX_DL_GOOD_QUALITY); | 76 VPX_DL_GOOD_QUALITY); |
76 if (res != VPX_CODEC_OK) | 77 if (res != VPX_CODEC_OK) |
77 die_codec(codec, "Failed to encode frame"); | 78 die_codec(codec, "Failed to encode frame"); |
78 | 79 |
79 while ((pkt = vpx_codec_get_cx_data(codec, &iter)) != NULL) { | 80 while ((pkt = vpx_codec_get_cx_data(codec, &iter)) != NULL) { |
| 81 got_pkts = 1; |
| 82 |
80 if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) { | 83 if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) { |
81 const int keyframe = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) != 0; | 84 const int keyframe = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) != 0; |
82 if (!vpx_video_writer_write_frame(writer, | 85 if (!vpx_video_writer_write_frame(writer, |
83 pkt->data.frame.buf, | 86 pkt->data.frame.buf, |
84 pkt->data.frame.sz, | 87 pkt->data.frame.sz, |
85 pkt->data.frame.pts)) { | 88 pkt->data.frame.pts)) { |
86 die_codec(codec, "Failed to write compressed frame"); | 89 die_codec(codec, "Failed to write compressed frame"); |
87 } | 90 } |
88 | 91 |
89 printf(keyframe ? "K" : "."); | 92 printf(keyframe ? "K" : "."); |
90 fflush(stdout); | 93 fflush(stdout); |
91 } | 94 } |
92 } | 95 } |
| 96 |
| 97 return got_pkts; |
93 } | 98 } |
94 | 99 |
95 int main(int argc, char **argv) { | 100 int main(int argc, char **argv) { |
96 FILE *infile = NULL; | 101 FILE *infile = NULL; |
97 vpx_codec_ctx_t codec = {0}; | 102 vpx_codec_ctx_t codec = {0}; |
98 vpx_codec_enc_cfg_t cfg = {0}; | 103 vpx_codec_enc_cfg_t cfg = {0}; |
99 int frame_count = 0; | 104 int frame_count = 0; |
100 vpx_image_t raw; | 105 vpx_image_t raw; |
101 vpx_codec_err_t res; | 106 vpx_codec_err_t res; |
102 VpxVideoInfo info = {0}; | 107 VpxVideoInfo info = {0}; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 writer = vpx_video_writer_open(argv[4], kContainerIVF, &info); | 158 writer = vpx_video_writer_open(argv[4], kContainerIVF, &info); |
154 if (!writer) | 159 if (!writer) |
155 die("Failed to open %s for writing.", argv[4]); | 160 die("Failed to open %s for writing.", argv[4]); |
156 | 161 |
157 if (!(infile = fopen(argv[3], "rb"))) | 162 if (!(infile = fopen(argv[3], "rb"))) |
158 die("Failed to open %s for reading.", argv[3]); | 163 die("Failed to open %s for reading.", argv[3]); |
159 | 164 |
160 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) | 165 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) |
161 die_codec(&codec, "Failed to initialize encoder"); | 166 die_codec(&codec, "Failed to initialize encoder"); |
162 | 167 |
| 168 // Encode frames. |
163 while (vpx_img_read(&raw, infile)) { | 169 while (vpx_img_read(&raw, infile)) { |
164 if (frame_count + 1 == update_frame_num) { | 170 if (frame_count + 1 == update_frame_num) { |
165 vpx_ref_frame_t ref; | 171 vpx_ref_frame_t ref; |
166 ref.frame_type = VP8_LAST_FRAME; | 172 ref.frame_type = VP8_LAST_FRAME; |
167 ref.img = raw; | 173 ref.img = raw; |
168 if (vpx_codec_control(&codec, VP8_SET_REFERENCE, &ref)) | 174 if (vpx_codec_control(&codec, VP8_SET_REFERENCE, &ref)) |
169 die_codec(&codec, "Failed to set reference frame"); | 175 die_codec(&codec, "Failed to set reference frame"); |
170 } | 176 } |
171 | 177 |
172 encode_frame(&codec, &raw, frame_count++, writer); | 178 encode_frame(&codec, &raw, frame_count++, writer); |
173 } | 179 } |
174 encode_frame(&codec, NULL, -1, writer); | 180 |
| 181 // Flush encoder. |
| 182 while (encode_frame(&codec, NULL, -1, writer)) {}; |
175 | 183 |
176 printf("\n"); | 184 printf("\n"); |
177 fclose(infile); | 185 fclose(infile); |
178 printf("Processed %d frames.\n", frame_count); | 186 printf("Processed %d frames.\n", frame_count); |
179 | 187 |
180 vpx_img_free(&raw); | 188 vpx_img_free(&raw); |
181 if (vpx_codec_destroy(&codec)) | 189 if (vpx_codec_destroy(&codec)) |
182 die_codec(&codec, "Failed to destroy codec."); | 190 die_codec(&codec, "Failed to destroy codec."); |
183 | 191 |
184 vpx_video_writer_close(writer); | 192 vpx_video_writer_close(writer); |
185 | 193 |
186 return EXIT_SUCCESS; | 194 return EXIT_SUCCESS; |
187 } | 195 } |
OLD | NEW |