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();
180 picture
= avcodec_alloc_frame();
182 /* put sample parameters */
183 c
->bit_rate
= 400000;
184 /* resolution must be a multiple of two */
187 /* frames per second */
188 c
->frame_rate
= 25 * FRAME_RATE_BASE
;
189 c
->gop_size
= 10; /* emit one intra frame every ten frames */
192 if (avcodec_open(c
, codec
) < 0) {
193 fprintf(stderr
, "could not open codec\n");
197 /* the codec gives us the frame size, in samples */
199 f
= fopen(filename
, "w");
201 fprintf(stderr
, "could not open %s\n", filename
);
205 /* alloc image and output buffer */
206 outbuf_size
= 100000;
207 outbuf
= malloc(outbuf_size
);
208 size
= c
->width
* c
->height
;
209 picture_buf
= malloc((size
* 3) / 2); /* size for YUV 420 */
211 picture
->data
[0] = picture_buf
;
212 picture
->data
[1] = picture
->data
[0] + size
;
213 picture
->data
[2] = picture
->data
[1] + size
/ 4;
214 picture
->linesize
[0] = c
->width
;
215 picture
->linesize
[1] = c
->width
/ 2;
216 picture
->linesize
[2] = c
->width
/ 2;
218 /* encode 1 second of video */
220 printf("encoding frame %3d\r", i
);
222 /* prepare a dummy image */
224 for(y
=0;y
<c
->height
;y
++) {
225 for(x
=0;x
<c
->width
;x
++) {
226 picture
->data
[0][y
* picture
->linesize
[0] + x
] = x
+ y
+ i
* 3;
231 for(y
=0;y
<c
->height
/2;y
++) {
232 for(x
=0;x
<c
->width
/2;x
++) {
233 picture
->data
[1][y
* picture
->linesize
[1] + x
] = 128 + y
+ i
* 2;
234 picture
->data
[2][y
* picture
->linesize
[2] + x
] = 64 + x
+ i
* 5;
238 /* encode the image */
239 out_size
= avcodec_encode_video(c
, outbuf
, outbuf_size
, picture
);
240 fwrite(outbuf
, 1, out_size
, f
);
243 /* add sequence end code to have a real mpeg file */
248 fwrite(outbuf
, 1, 4, f
);
260 * Video decoding example
263 void pgm_save(unsigned char *buf
,int wrap
, int xsize
,int ysize
,char *filename
)
268 f
=fopen(filename
,"w");
269 fprintf(f
,"P5\n%d %d\n%d\n",xsize
,ysize
,255);
271 fwrite(buf
+ i
* wrap
,1,xsize
,f
);
275 void video_decode_example(const char *outfilename
, const char *filename
)
278 AVCodecContext
*c
= NULL
;
279 int frame
, size
, got_picture
, len
;
282 UINT8 inbuf
[INBUF_SIZE
], *inbuf_ptr
;
285 printf("Video decoding\n");
287 /* find the mpeg1 video decoder */
288 codec
= avcodec_find_decoder(CODEC_ID_MPEG1VIDEO
);
290 fprintf(stderr
, "codec not found\n");
294 c
= avcodec_alloc_context();
295 picture
= avcodec_alloc_frame();
297 if(codec
->capabilities
&CODEC_CAP_TRUNCATED
)
298 c
->flags
|= CODEC_FLAG_TRUNCATED
; /* we dont send complete frames */
300 /* for some codecs, such as msmpeg4 and mpeg4, width and height
301 MUST be initialized there because these info are not available
305 if (avcodec_open(c
, codec
) < 0) {
306 fprintf(stderr
, "could not open codec\n");
310 /* the codec gives us the frame size, in samples */
312 f
= fopen(filename
, "r");
314 fprintf(stderr
, "could not open %s\n", filename
);
320 size
= fread(inbuf
, 1, INBUF_SIZE
, f
);
324 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
325 and this is the only method to use them because you cannot
326 know the compressed data size before analysing it.
328 BUT some other codecs (msmpeg4, mpeg4) are inherently frame
329 based, so you must call them with all the data for one
330 frame exactly. You must also initialize 'width' and
331 'height' before initializing them. */
333 /* NOTE2: some codecs allow the raw parameters (frame size,
334 sample rate) to be changed at any frame. We handle this, so
335 you should also take care of it */
337 /* here, we use a stream based decoder (mpeg1video), so we
338 feed decoder and see if it could decode a frame */
341 len
= avcodec_decode_video(c
, picture
, &got_picture
,
344 fprintf(stderr
, "Error while decoding frame %d\n", frame
);
348 printf("saving frame %3d\r", frame
);
351 /* the picture is allocated by the decoder. no need to
353 snprintf(buf
, sizeof(buf
), outfilename
, frame
);
354 pgm_save(picture
->data
[0], picture
->linesize
[0],
355 c
->width
, c
->height
, buf
);
363 /* some codecs, such as MPEG, transmit the I and P frame with a
364 latency of one frame. You must do the following to have a
365 chance to get the last frame of the video */
366 len
= avcodec_decode_video(c
, picture
, &got_picture
,
369 printf("saving frame %3d\r", frame
);
372 /* the picture is allocated by the decoder. no need to
374 snprintf(buf
, sizeof(buf
), outfilename
, frame
);
375 pgm_save(picture
->data
[0], picture
->linesize
[0],
376 c
->width
, c
->height
, buf
);
389 int main(int argc
, char **argv
)
391 const char *filename
;
393 /* must be called before using avcodec lib */
396 /* register all the codecs (you can also register only the codec
397 you wish to have smaller code */
398 avcodec_register_all();
401 audio_encode_example("/tmp/test.mp2");
402 audio_decode_example("/tmp/test.sw", "/tmp/test.mp2");
404 video_encode_example("/tmp/test.mpg");
405 filename
= "/tmp/test.mpg";
410 // audio_decode_example("/tmp/test.sw", filename);
411 video_decode_example("/tmp/test%d.pgm", filename
);