1 /* avcodec API use example.
3 * Note that this library only handles codecs (mpeg, mpeg4, etc...),
4 * not file formats (avi, vob, etc...). See library 'libav' for the
14 #define INBUF_SIZE 4096
17 * Audio encoding example
19 void audio_encode_example(const char *filename)
22 AVCodecContext *c= NULL;
23 int frame_size, i, j, out_size, outbuf_size;
29 printf("Audio encoding\n");
31 /* find the MP2 encoder */
32 codec = avcodec_find_encoder(CODEC_ID_MP2);
34 fprintf(stderr, "codec not found\n");
38 c= avcodec_alloc_context();
40 /* put sample parameters */
42 c->sample_rate = 44100;
46 if (avcodec_open(c, codec) < 0) {
47 fprintf(stderr, "could not open codec\n");
51 /* the codec gives us the frame size, in samples */
52 frame_size = c->frame_size;
53 samples = malloc(frame_size * 2 * c->channels);
55 outbuf = malloc(outbuf_size);
57 f = fopen(filename, "w");
59 fprintf(stderr, "could not open %s\n", filename);
63 /* encode a single tone sound */
65 tincr = 2 * M_PI * 440.0 / c->sample_rate;
67 for(j=0;j<frame_size;j++) {
68 samples[2*j] = (int)(sin(t) * 10000);
69 samples[2*j+1] = samples[2*j];
72 /* encode the samples */
73 out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples);
74 fwrite(outbuf, 1, out_size, f);
87 void audio_decode_example(const char *outfilename, const char *filename)
90 AVCodecContext *c= NULL;
91 int out_size, size, len;
94 UINT8 inbuf[INBUF_SIZE], *inbuf_ptr;
96 printf("Audio decoding\n");
98 /* find the mpeg audio decoder */
99 codec = avcodec_find_decoder(CODEC_ID_MP2);
101 fprintf(stderr, "codec not found\n");
105 c= avcodec_alloc_context();
108 if (avcodec_open(c, codec) < 0) {
109 fprintf(stderr, "could not open codec\n");
113 outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
115 f = fopen(filename, "r");
117 fprintf(stderr, "could not open %s\n", filename);
120 outfile = fopen(outfilename, "w");
126 /* decode until eof */
129 size = fread(inbuf, 1, INBUF_SIZE, f);
135 len = avcodec_decode_audio(c, (short *)outbuf, &out_size,
138 fprintf(stderr, "Error while decoding\n");
142 /* if a frame has been decoded, output it */
143 fwrite(outbuf, 1, out_size, outfile);
159 * Video encoding example
161 void video_encode_example(const char *filename)
164 AVCodecContext *c= NULL;
165 int i, out_size, size, x, y, outbuf_size;
168 UINT8 *outbuf, *picture_buf;
170 printf("Video encoding\n");
172 /* find the mpeg1 video encoder */
173 codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
175 fprintf(stderr, "codec not found\n");
179 c= avcodec_alloc_context();
181 /* put sample parameters */
182 c->bit_rate = 400000;
183 /* resolution must be a multiple of two */
186 /* frames per second */
187 c->frame_rate = 25 * FRAME_RATE_BASE;
188 c->gop_size = 10; /* emit one intra frame every ten frames */
191 if (avcodec_open(c, codec) < 0) {
192 fprintf(stderr, "could not open codec\n");
196 /* the codec gives us the frame size, in samples */
198 f = fopen(filename, "w");
200 fprintf(stderr, "could not open %s\n", filename);
204 /* alloc image and output buffer */
205 outbuf_size = 100000;
206 outbuf = malloc(outbuf_size);
207 size = c->width * c->height;
208 picture_buf = malloc((size * 3) / 2); /* size for YUV 420 */
210 picture.data[0] = picture_buf;
211 picture.data[1] = picture.data[0] + size;
212 picture.data[2] = picture.data[1] + size / 4;
213 picture.linesize[0] = c->width;
214 picture.linesize[1] = c->width / 2;
215 picture.linesize[2] = c->width / 2;
217 /* encode 1 second of video */
219 printf("encoding frame %3d\r", i);
221 /* prepare a dummy image */
223 for(y=0;y<c->height;y++) {
224 for(x=0;x<c->width;x++) {
225 picture.data[0][y * picture.linesize[0] + x] = x + y + i * 3;
230 for(y=0;y<c->height/2;y++) {
231 for(x=0;x<c->width/2;x++) {
232 picture.data[1][y * picture.linesize[1] + x] = 128 + y + i * 2;
233 picture.data[2][y * picture.linesize[2] + x] = 64 + x + i * 5;
237 /* encode the image */
238 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &picture);
239 fwrite(outbuf, 1, out_size, f);
242 /* add sequence end code to have a real mpeg file */
247 fwrite(outbuf, 1, 4, f);
258 * Video decoding example
261 void pgm_save(unsigned char *buf,int wrap, int xsize,int ysize,char *filename)
266 f=fopen(filename,"w");
267 fprintf(f,"P5\n%d %d\n%d\n",xsize,ysize,255);
269 fwrite(buf + i * wrap,1,xsize,f);
273 void video_decode_example(const char *outfilename, const char *filename)
276 AVCodecContext *c= NULL;
277 int frame, size, got_picture, len;
280 UINT8 inbuf[INBUF_SIZE], *inbuf_ptr;
283 printf("Video decoding\n");
285 /* find the mpeg1 video decoder */
286 codec = avcodec_find_decoder(CODEC_ID_MPEG1VIDEO);
288 fprintf(stderr, "codec not found\n");
292 c= avcodec_alloc_context();
294 /* for some codecs, such as msmpeg4 and mpeg4, width and height
295 MUST be initialized there because these info are not available
299 if (avcodec_open(c, codec) < 0) {
300 fprintf(stderr, "could not open codec\n");
304 /* the codec gives us the frame size, in samples */
306 f = fopen(filename, "r");
308 fprintf(stderr, "could not open %s\n", filename);
314 size = fread(inbuf, 1, INBUF_SIZE, f);
318 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
319 and this is the only method to use them because you cannot
320 know the compressed data size before analysing it.
322 BUT some other codecs (msmpeg4, mpeg4) are inherently frame
323 based, so you must call them with all the data for one
324 frame exactly. You must also initialize 'width' and
325 'height' before initializing them. */
327 /* NOTE2: some codecs allow the raw parameters (frame size,
328 sample rate) to be changed at any frame. We handle this, so
329 you should also take care of it */
331 /* here, we use a stream based decoder (mpeg1video), so we
332 feed decoder and see if it could decode a frame */
335 len = avcodec_decode_video(c, &picture, &got_picture,
338 fprintf(stderr, "Error while decoding frame %d\n", frame);
342 printf("saving frame %3d\r", frame);
345 /* the picture is allocated by the decoder. no need to
347 snprintf(buf, sizeof(buf), outfilename, frame);
348 pgm_save(picture.data[0], picture.linesize[0],
349 c->width, c->height, buf);
357 /* some codecs, such as MPEG, transmit the I and P frame with a
358 latency of one frame. You must do the following to have a
359 chance to get the last frame of the video */
360 len = avcodec_decode_video(c, &picture, &got_picture,
363 printf("saving frame %3d\r", frame);
366 /* the picture is allocated by the decoder. no need to
368 snprintf(buf, sizeof(buf), outfilename, frame);
369 pgm_save(picture.data[0], picture.linesize[0],
370 c->width, c->height, buf);
382 int main(int argc, char **argv)
384 const char *filename;
386 /* must be called before using avcodec lib */
389 /* register all the codecs (you can also register only the codec
390 you wish to have smaller code */
391 avcodec_register_all();
394 audio_encode_example("/tmp/test.mp2");
395 audio_decode_example("/tmp/test.sw", "/tmp/test.mp2");
397 video_encode_example("/tmp/test.mpg");
398 filename = "/tmp/test.mpg";
403 // audio_decode_example("/tmp/test.sw", filename);
404 video_decode_example("/tmp/test%d.pgm", filename);