Imported Debian version 2.4.3~trusty1
[deb_ffmpeg.git] / ffmpeg / doc / examples / decoding_encoding.c
CommitLineData
2ba45a60
DM
1/*
2 * Copyright (c) 2001 Fabrice Bellard
3 *
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:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
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
20 * THE SOFTWARE.
21 */
22
23/**
24 * @file
25 * libavcodec API use example.
26 *
27 * @example decoding_encoding.c
28 * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...),
29 * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the
30 * format handling
31 */
32
33#include <math.h>
34
35#include <libavutil/opt.h>
36#include <libavcodec/avcodec.h>
37#include <libavutil/channel_layout.h>
38#include <libavutil/common.h>
39#include <libavutil/imgutils.h>
40#include <libavutil/mathematics.h>
41#include <libavutil/samplefmt.h>
42
43#define INBUF_SIZE 4096
44#define AUDIO_INBUF_SIZE 20480
45#define AUDIO_REFILL_THRESH 4096
46
47/* check that a given sample format is supported by the encoder */
48static int check_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt)
49{
50 const enum AVSampleFormat *p = codec->sample_fmts;
51
52 while (*p != AV_SAMPLE_FMT_NONE) {
53 if (*p == sample_fmt)
54 return 1;
55 p++;
56 }
57 return 0;
58}
59
60/* just pick the highest supported samplerate */
61static int select_sample_rate(AVCodec *codec)
62{
63 const int *p;
64 int best_samplerate = 0;
65
66 if (!codec->supported_samplerates)
67 return 44100;
68
69 p = codec->supported_samplerates;
70 while (*p) {
71 best_samplerate = FFMAX(*p, best_samplerate);
72 p++;
73 }
74 return best_samplerate;
75}
76
77/* select layout with the highest channel count */
78static int select_channel_layout(AVCodec *codec)
79{
80 const uint64_t *p;
81 uint64_t best_ch_layout = 0;
82 int best_nb_channels = 0;
83
84 if (!codec->channel_layouts)
85 return AV_CH_LAYOUT_STEREO;
86
87 p = codec->channel_layouts;
88 while (*p) {
89 int nb_channels = av_get_channel_layout_nb_channels(*p);
90
91 if (nb_channels > best_nb_channels) {
92 best_ch_layout = *p;
93 best_nb_channels = nb_channels;
94 }
95 p++;
96 }
97 return best_ch_layout;
98}
99
100/*
101 * Audio encoding example
102 */
103static void audio_encode_example(const char *filename)
104{
105 AVCodec *codec;
106 AVCodecContext *c= NULL;
107 AVFrame *frame;
108 AVPacket pkt;
109 int i, j, k, ret, got_output;
110 int buffer_size;
111 FILE *f;
112 uint16_t *samples;
113 float t, tincr;
114
115 printf("Encode audio file %s\n", filename);
116
117 /* find the MP2 encoder */
118 codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
119 if (!codec) {
120 fprintf(stderr, "Codec not found\n");
121 exit(1);
122 }
123
124 c = avcodec_alloc_context3(codec);
125 if (!c) {
126 fprintf(stderr, "Could not allocate audio codec context\n");
127 exit(1);
128 }
129
130 /* put sample parameters */
131 c->bit_rate = 64000;
132
133 /* check that the encoder supports s16 pcm input */
134 c->sample_fmt = AV_SAMPLE_FMT_S16;
135 if (!check_sample_fmt(codec, c->sample_fmt)) {
136 fprintf(stderr, "Encoder does not support sample format %s",
137 av_get_sample_fmt_name(c->sample_fmt));
138 exit(1);
139 }
140
141 /* select other audio parameters supported by the encoder */
142 c->sample_rate = select_sample_rate(codec);
143 c->channel_layout = select_channel_layout(codec);
144 c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
145
146 /* open it */
147 if (avcodec_open2(c, codec, NULL) < 0) {
148 fprintf(stderr, "Could not open codec\n");
149 exit(1);
150 }
151
152 f = fopen(filename, "wb");
153 if (!f) {
154 fprintf(stderr, "Could not open %s\n", filename);
155 exit(1);
156 }
157
158 /* frame containing input raw audio */
159 frame = av_frame_alloc();
160 if (!frame) {
161 fprintf(stderr, "Could not allocate audio frame\n");
162 exit(1);
163 }
164
165 frame->nb_samples = c->frame_size;
166 frame->format = c->sample_fmt;
167 frame->channel_layout = c->channel_layout;
168
169 /* the codec gives us the frame size, in samples,
170 * we calculate the size of the samples buffer in bytes */
171 buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size,
172 c->sample_fmt, 0);
173 if (buffer_size < 0) {
174 fprintf(stderr, "Could not get sample buffer size\n");
175 exit(1);
176 }
177 samples = av_malloc(buffer_size);
178 if (!samples) {
179 fprintf(stderr, "Could not allocate %d bytes for samples buffer\n",
180 buffer_size);
181 exit(1);
182 }
183 /* setup the data pointers in the AVFrame */
184 ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
185 (const uint8_t*)samples, buffer_size, 0);
186 if (ret < 0) {
187 fprintf(stderr, "Could not setup audio frame\n");
188 exit(1);
189 }
190
191 /* encode a single tone sound */
192 t = 0;
193 tincr = 2 * M_PI * 440.0 / c->sample_rate;
194 for (i = 0; i < 200; i++) {
195 av_init_packet(&pkt);
196 pkt.data = NULL; // packet data will be allocated by the encoder
197 pkt.size = 0;
198
199 for (j = 0; j < c->frame_size; j++) {
200 samples[2*j] = (int)(sin(t) * 10000);
201
202 for (k = 1; k < c->channels; k++)
203 samples[2*j + k] = samples[2*j];
204 t += tincr;
205 }
206 /* encode the samples */
207 ret = avcodec_encode_audio2(c, &pkt, frame, &got_output);
208 if (ret < 0) {
209 fprintf(stderr, "Error encoding audio frame\n");
210 exit(1);
211 }
212 if (got_output) {
213 fwrite(pkt.data, 1, pkt.size, f);
214 av_free_packet(&pkt);
215 }
216 }
217
218 /* get the delayed frames */
219 for (got_output = 1; got_output; i++) {
220 ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
221 if (ret < 0) {
222 fprintf(stderr, "Error encoding frame\n");
223 exit(1);
224 }
225
226 if (got_output) {
227 fwrite(pkt.data, 1, pkt.size, f);
228 av_free_packet(&pkt);
229 }
230 }
231 fclose(f);
232
233 av_freep(&samples);
234 av_frame_free(&frame);
235 avcodec_close(c);
236 av_free(c);
237}
238
239/*
240 * Audio decoding.
241 */
242static void audio_decode_example(const char *outfilename, const char *filename)
243{
244 AVCodec *codec;
245 AVCodecContext *c= NULL;
246 int len;
247 FILE *f, *outfile;
248 uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
249 AVPacket avpkt;
250 AVFrame *decoded_frame = NULL;
251
252 av_init_packet(&avpkt);
253
254 printf("Decode audio file %s to %s\n", filename, outfilename);
255
256 /* find the mpeg audio decoder */
257 codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
258 if (!codec) {
259 fprintf(stderr, "Codec not found\n");
260 exit(1);
261 }
262
263 c = avcodec_alloc_context3(codec);
264 if (!c) {
265 fprintf(stderr, "Could not allocate audio codec context\n");
266 exit(1);
267 }
268
269 /* open it */
270 if (avcodec_open2(c, codec, NULL) < 0) {
271 fprintf(stderr, "Could not open codec\n");
272 exit(1);
273 }
274
275 f = fopen(filename, "rb");
276 if (!f) {
277 fprintf(stderr, "Could not open %s\n", filename);
278 exit(1);
279 }
280 outfile = fopen(outfilename, "wb");
281 if (!outfile) {
282 av_free(c);
283 exit(1);
284 }
285
286 /* decode until eof */
287 avpkt.data = inbuf;
288 avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
289
290 while (avpkt.size > 0) {
291 int got_frame = 0;
292
293 if (!decoded_frame) {
294 if (!(decoded_frame = av_frame_alloc())) {
295 fprintf(stderr, "Could not allocate audio frame\n");
296 exit(1);
297 }
298 }
299
300 len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
301 if (len < 0) {
302 fprintf(stderr, "Error while decoding\n");
303 exit(1);
304 }
305 if (got_frame) {
306 /* if a frame has been decoded, output it */
307 int data_size = av_samples_get_buffer_size(NULL, c->channels,
308 decoded_frame->nb_samples,
309 c->sample_fmt, 1);
310 if (data_size < 0) {
311 /* This should not occur, checking just for paranoia */
312 fprintf(stderr, "Failed to calculate data size\n");
313 exit(1);
314 }
315 fwrite(decoded_frame->data[0], 1, data_size, outfile);
316 }
317 avpkt.size -= len;
318 avpkt.data += len;
319 avpkt.dts =
320 avpkt.pts = AV_NOPTS_VALUE;
321 if (avpkt.size < AUDIO_REFILL_THRESH) {
322 /* Refill the input buffer, to avoid trying to decode
323 * incomplete frames. Instead of this, one could also use
324 * a parser, or use a proper container format through
325 * libavformat. */
326 memmove(inbuf, avpkt.data, avpkt.size);
327 avpkt.data = inbuf;
328 len = fread(avpkt.data + avpkt.size, 1,
329 AUDIO_INBUF_SIZE - avpkt.size, f);
330 if (len > 0)
331 avpkt.size += len;
332 }
333 }
334
335 fclose(outfile);
336 fclose(f);
337
338 avcodec_close(c);
339 av_free(c);
340 av_frame_free(&decoded_frame);
341}
342
343/*
344 * Video encoding example
345 */
346static void video_encode_example(const char *filename, int codec_id)
347{
348 AVCodec *codec;
349 AVCodecContext *c= NULL;
350 int i, ret, x, y, got_output;
351 FILE *f;
352 AVFrame *frame;
353 AVPacket pkt;
354 uint8_t endcode[] = { 0, 0, 1, 0xb7 };
355
356 printf("Encode video file %s\n", filename);
357
358 /* find the mpeg1 video encoder */
359 codec = avcodec_find_encoder(codec_id);
360 if (!codec) {
361 fprintf(stderr, "Codec not found\n");
362 exit(1);
363 }
364
365 c = avcodec_alloc_context3(codec);
366 if (!c) {
367 fprintf(stderr, "Could not allocate video codec context\n");
368 exit(1);
369 }
370
371 /* put sample parameters */
372 c->bit_rate = 400000;
373 /* resolution must be a multiple of two */
374 c->width = 352;
375 c->height = 288;
376 /* frames per second */
377 c->time_base = (AVRational){1,25};
378 /* emit one intra frame every ten frames
379 * check frame pict_type before passing frame
380 * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
381 * then gop_size is ignored and the output of encoder
382 * will always be I frame irrespective to gop_size
383 */
384 c->gop_size = 10;
385 c->max_b_frames = 1;
386 c->pix_fmt = AV_PIX_FMT_YUV420P;
387
388 if (codec_id == AV_CODEC_ID_H264)
389 av_opt_set(c->priv_data, "preset", "slow", 0);
390
391 /* open it */
392 if (avcodec_open2(c, codec, NULL) < 0) {
393 fprintf(stderr, "Could not open codec\n");
394 exit(1);
395 }
396
397 f = fopen(filename, "wb");
398 if (!f) {
399 fprintf(stderr, "Could not open %s\n", filename);
400 exit(1);
401 }
402
403 frame = av_frame_alloc();
404 if (!frame) {
405 fprintf(stderr, "Could not allocate video frame\n");
406 exit(1);
407 }
408 frame->format = c->pix_fmt;
409 frame->width = c->width;
410 frame->height = c->height;
411
412 /* the image can be allocated by any means and av_image_alloc() is
413 * just the most convenient way if av_malloc() is to be used */
414 ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,
415 c->pix_fmt, 32);
416 if (ret < 0) {
417 fprintf(stderr, "Could not allocate raw picture buffer\n");
418 exit(1);
419 }
420
421 /* encode 1 second of video */
422 for (i = 0; i < 25; i++) {
423 av_init_packet(&pkt);
424 pkt.data = NULL; // packet data will be allocated by the encoder
425 pkt.size = 0;
426
427 fflush(stdout);
428 /* prepare a dummy image */
429 /* Y */
430 for (y = 0; y < c->height; y++) {
431 for (x = 0; x < c->width; x++) {
432 frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
433 }
434 }
435
436 /* Cb and Cr */
437 for (y = 0; y < c->height/2; y++) {
438 for (x = 0; x < c->width/2; x++) {
439 frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
440 frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
441 }
442 }
443
444 frame->pts = i;
445
446 /* encode the image */
447 ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
448 if (ret < 0) {
449 fprintf(stderr, "Error encoding frame\n");
450 exit(1);
451 }
452
453 if (got_output) {
454 printf("Write frame %3d (size=%5d)\n", i, pkt.size);
455 fwrite(pkt.data, 1, pkt.size, f);
456 av_free_packet(&pkt);
457 }
458 }
459
460 /* get the delayed frames */
461 for (got_output = 1; got_output; i++) {
462 fflush(stdout);
463
464 ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
465 if (ret < 0) {
466 fprintf(stderr, "Error encoding frame\n");
467 exit(1);
468 }
469
470 if (got_output) {
471 printf("Write frame %3d (size=%5d)\n", i, pkt.size);
472 fwrite(pkt.data, 1, pkt.size, f);
473 av_free_packet(&pkt);
474 }
475 }
476
477 /* add sequence end code to have a real mpeg file */
478 fwrite(endcode, 1, sizeof(endcode), f);
479 fclose(f);
480
481 avcodec_close(c);
482 av_free(c);
483 av_freep(&frame->data[0]);
484 av_frame_free(&frame);
485 printf("\n");
486}
487
488/*
489 * Video decoding example
490 */
491
492static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
493 char *filename)
494{
495 FILE *f;
496 int i;
497
498 f = fopen(filename,"w");
499 fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);
500 for (i = 0; i < ysize; i++)
501 fwrite(buf + i * wrap, 1, xsize, f);
502 fclose(f);
503}
504
505static int decode_write_frame(const char *outfilename, AVCodecContext *avctx,
506 AVFrame *frame, int *frame_count, AVPacket *pkt, int last)
507{
508 int len, got_frame;
509 char buf[1024];
510
511 len = avcodec_decode_video2(avctx, frame, &got_frame, pkt);
512 if (len < 0) {
513 fprintf(stderr, "Error while decoding frame %d\n", *frame_count);
514 return len;
515 }
516 if (got_frame) {
517 printf("Saving %sframe %3d\n", last ? "last " : "", *frame_count);
518 fflush(stdout);
519
520 /* the picture is allocated by the decoder, no need to free it */
521 snprintf(buf, sizeof(buf), outfilename, *frame_count);
522 pgm_save(frame->data[0], frame->linesize[0],
523 avctx->width, avctx->height, buf);
524 (*frame_count)++;
525 }
526 if (pkt->data) {
527 pkt->size -= len;
528 pkt->data += len;
529 }
530 return 0;
531}
532
533static void video_decode_example(const char *outfilename, const char *filename)
534{
535 AVCodec *codec;
536 AVCodecContext *c= NULL;
537 int frame_count;
538 FILE *f;
539 AVFrame *frame;
540 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
541 AVPacket avpkt;
542
543 av_init_packet(&avpkt);
544
545 /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
546 memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
547
548 printf("Decode video file %s to %s\n", filename, outfilename);
549
550 /* find the mpeg1 video decoder */
551 codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
552 if (!codec) {
553 fprintf(stderr, "Codec not found\n");
554 exit(1);
555 }
556
557 c = avcodec_alloc_context3(codec);
558 if (!c) {
559 fprintf(stderr, "Could not allocate video codec context\n");
560 exit(1);
561 }
562
563 if(codec->capabilities&CODEC_CAP_TRUNCATED)
564 c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */
565
566 /* For some codecs, such as msmpeg4 and mpeg4, width and height
567 MUST be initialized there because this information is not
568 available in the bitstream. */
569
570 /* open it */
571 if (avcodec_open2(c, codec, NULL) < 0) {
572 fprintf(stderr, "Could not open codec\n");
573 exit(1);
574 }
575
576 f = fopen(filename, "rb");
577 if (!f) {
578 fprintf(stderr, "Could not open %s\n", filename);
579 exit(1);
580 }
581
582 frame = av_frame_alloc();
583 if (!frame) {
584 fprintf(stderr, "Could not allocate video frame\n");
585 exit(1);
586 }
587
588 frame_count = 0;
589 for (;;) {
590 avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
591 if (avpkt.size == 0)
592 break;
593
594 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
595 and this is the only method to use them because you cannot
596 know the compressed data size before analysing it.
597
598 BUT some other codecs (msmpeg4, mpeg4) are inherently frame
599 based, so you must call them with all the data for one
600 frame exactly. You must also initialize 'width' and
601 'height' before initializing them. */
602
603 /* NOTE2: some codecs allow the raw parameters (frame size,
604 sample rate) to be changed at any frame. We handle this, so
605 you should also take care of it */
606
607 /* here, we use a stream based decoder (mpeg1video), so we
608 feed decoder and see if it could decode a frame */
609 avpkt.data = inbuf;
610 while (avpkt.size > 0)
611 if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0)
612 exit(1);
613 }
614
615 /* some codecs, such as MPEG, transmit the I and P frame with a
616 latency of one frame. You must do the following to have a
617 chance to get the last frame of the video */
618 avpkt.data = NULL;
619 avpkt.size = 0;
620 decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
621
622 fclose(f);
623
624 avcodec_close(c);
625 av_free(c);
626 av_frame_free(&frame);
627 printf("\n");
628}
629
630int main(int argc, char **argv)
631{
632 const char *output_type;
633
634 /* register all the codecs */
635 avcodec_register_all();
636
637 if (argc < 2) {
638 printf("usage: %s output_type\n"
639 "API example program to decode/encode a media stream with libavcodec.\n"
640 "This program generates a synthetic stream and encodes it to a file\n"
641 "named test.h264, test.mp2 or test.mpg depending on output_type.\n"
642 "The encoded stream is then decoded and written to a raw data output.\n"
643 "output_type must be chosen between 'h264', 'mp2', 'mpg'.\n",
644 argv[0]);
645 return 1;
646 }
647 output_type = argv[1];
648
649 if (!strcmp(output_type, "h264")) {
650 video_encode_example("test.h264", AV_CODEC_ID_H264);
651 } else if (!strcmp(output_type, "mp2")) {
652 audio_encode_example("test.mp2");
653 audio_decode_example("test.sw", "test.mp2");
654 } else if (!strcmp(output_type, "mpg")) {
655 video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
656 video_decode_example("test%02d.pgm", "test.mpg");
657 } else {
658 fprintf(stderr, "Invalid output type '%s', choose between 'h264', 'mp2', or 'mpg'\n",
659 output_type);
660 return 1;
661 }
662
663 return 0;
664}