2 * Copyright (c) 2001 Fabrice Bellard
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * video encoding with libavcodec API example
27 * @example encode_video.c
34 #include <libavcodec/avcodec.h>
36 #include <libavutil/opt.h>
37 #include <libavutil/imgutils.h>
39 int main(int argc, char **argv)
41 const char *filename, *codec_name;
43 AVCodecContext *c= NULL;
44 int i, ret, x, y, got_output;
48 uint8_t endcode[] = { 0, 0, 1, 0xb7 };
51 fprintf(stderr, "Usage: %s <output file> <codec name>\n", argv[0]);
57 avcodec_register_all();
59 /* find the mpeg1video encoder */
60 codec = avcodec_find_encoder_by_name(codec_name);
62 fprintf(stderr, "Codec not found\n");
66 c = avcodec_alloc_context3(codec);
68 fprintf(stderr, "Could not allocate video codec context\n");
72 /* put sample parameters */
74 /* resolution must be a multiple of two */
77 /* frames per second */
78 c->time_base = (AVRational){1, 25};
79 c->framerate = (AVRational){25, 1};
81 /* emit one intra frame every ten frames
82 * check frame pict_type before passing frame
83 * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
84 * then gop_size is ignored and the output of encoder
85 * will always be I frame irrespective to gop_size
89 c->pix_fmt = AV_PIX_FMT_YUV420P;
91 if (codec->id == AV_CODEC_ID_H264)
92 av_opt_set(c->priv_data, "preset", "slow", 0);
95 if (avcodec_open2(c, codec, NULL) < 0) {
96 fprintf(stderr, "Could not open codec\n");
100 f = fopen(filename, "wb");
102 fprintf(stderr, "Could not open %s\n", filename);
106 frame = av_frame_alloc();
108 fprintf(stderr, "Could not allocate video frame\n");
111 frame->format = c->pix_fmt;
112 frame->width = c->width;
113 frame->height = c->height;
115 ret = av_frame_get_buffer(frame, 32);
117 fprintf(stderr, "Could not allocate the video frame data\n");
121 /* encode 1 second of video */
122 for (i = 0; i < 25; i++) {
123 av_init_packet(&pkt);
124 pkt.data = NULL; // packet data will be allocated by the encoder
129 /* make sure the frame data is writable */
130 ret = av_frame_make_writable(frame);
134 /* prepare a dummy image */
136 for (y = 0; y < c->height; y++) {
137 for (x = 0; x < c->width; x++) {
138 frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
143 for (y = 0; y < c->height/2; y++) {
144 for (x = 0; x < c->width/2; x++) {
145 frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
146 frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
152 /* encode the image */
153 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
155 fprintf(stderr, "Error encoding frame\n");
160 printf("Write frame %3d (size=%5d)\n", i, pkt.size);
161 fwrite(pkt.data, 1, pkt.size, f);
162 av_packet_unref(&pkt);
166 /* get the delayed frames */
167 for (got_output = 1; got_output; i++) {
170 ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
172 fprintf(stderr, "Error encoding frame\n");
177 printf("Write frame %3d (size=%5d)\n", i, pkt.size);
178 fwrite(pkt.data, 1, pkt.size, f);
179 av_packet_unref(&pkt);
183 /* add sequence end code to have a real MPEG file */
184 fwrite(endcode, 1, sizeof(endcode), f);
187 avcodec_free_context(&c);
188 av_frame_free(&frame);