comparison api-example.c @ 9382:621852d53087 libavcodec

Use the new avcodec_decode_* API. Patch by Thilo Borgmann name.surname AT googlemail.com.
author stefano
date Fri, 10 Apr 2009 11:07:52 +0000
parents b225f51903af
children b790df0d7046
comparison
equal deleted inserted replaced
9381:7dfbd59b04e5 9382:621852d53087
113 */ 113 */
114 static void audio_decode_example(const char *outfilename, const char *filename) 114 static void audio_decode_example(const char *outfilename, const char *filename)
115 { 115 {
116 AVCodec *codec; 116 AVCodec *codec;
117 AVCodecContext *c= NULL; 117 AVCodecContext *c= NULL;
118 int out_size, size, len; 118 int out_size, len;
119 FILE *f, *outfile; 119 FILE *f, *outfile;
120 uint8_t *outbuf; 120 uint8_t *outbuf;
121 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE], *inbuf_ptr; 121 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
122 AVPacket avpkt;
123
124 av_init_packet(&avpkt);
122 125
123 printf("Audio decoding\n"); 126 printf("Audio decoding\n");
124 127
125 /* find the mpeg audio decoder */ 128 /* find the mpeg audio decoder */
126 codec = avcodec_find_decoder(CODEC_ID_MP2); 129 codec = avcodec_find_decoder(CODEC_ID_MP2);
149 av_free(c); 152 av_free(c);
150 exit(1); 153 exit(1);
151 } 154 }
152 155
153 /* decode until eof */ 156 /* decode until eof */
154 inbuf_ptr = inbuf; 157 avpkt.data = inbuf;
155 for(;;) { 158 for(;;) {
156 size = fread(inbuf, 1, INBUF_SIZE, f); 159 avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
157 if (size == 0) 160 if (avpkt.size == 0)
158 break; 161 break;
159 162
160 inbuf_ptr = inbuf; 163 avpkt.data = inbuf;
161 while (size > 0) { 164 while (avpkt.size > 0) {
162 out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; 165 out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
163 len = avcodec_decode_audio2(c, (short *)outbuf, &out_size, 166 len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt);
164 inbuf_ptr, size);
165 if (len < 0) { 167 if (len < 0) {
166 fprintf(stderr, "Error while decoding\n"); 168 fprintf(stderr, "Error while decoding\n");
167 exit(1); 169 exit(1);
168 } 170 }
169 if (out_size > 0) { 171 if (out_size > 0) {
170 /* if a frame has been decoded, output it */ 172 /* if a frame has been decoded, output it */
171 fwrite(outbuf, 1, out_size, outfile); 173 fwrite(outbuf, 1, out_size, outfile);
172 } 174 }
173 size -= len; 175 avpkt.size -= len;
174 inbuf_ptr += len; 176 avpkt.data += len;
175 } 177 }
176 } 178 }
177 179
178 fclose(outfile); 180 fclose(outfile);
179 fclose(f); 181 fclose(f);
312 314
313 static void video_decode_example(const char *outfilename, const char *filename) 315 static void video_decode_example(const char *outfilename, const char *filename)
314 { 316 {
315 AVCodec *codec; 317 AVCodec *codec;
316 AVCodecContext *c= NULL; 318 AVCodecContext *c= NULL;
317 int frame, size, got_picture, len; 319 int frame, got_picture, len;
318 FILE *f; 320 FILE *f;
319 AVFrame *picture; 321 AVFrame *picture;
320 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE], *inbuf_ptr; 322 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
321 char buf[1024]; 323 char buf[1024];
324 AVPacket avpkt;
325
326 av_init_packet(&avpkt);
322 327
323 /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */ 328 /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
324 memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE); 329 memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
325 330
326 printf("Video decoding\n"); 331 printf("Video decoding\n");
356 exit(1); 361 exit(1);
357 } 362 }
358 363
359 frame = 0; 364 frame = 0;
360 for(;;) { 365 for(;;) {
361 size = fread(inbuf, 1, INBUF_SIZE, f); 366 avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
362 if (size == 0) 367 if (avpkt.size == 0)
363 break; 368 break;
364 369
365 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio) 370 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
366 and this is the only method to use them because you cannot 371 and this is the only method to use them because you cannot
367 know the compressed data size before analysing it. 372 know the compressed data size before analysing it.
375 sample rate) to be changed at any frame. We handle this, so 380 sample rate) to be changed at any frame. We handle this, so
376 you should also take care of it */ 381 you should also take care of it */
377 382
378 /* here, we use a stream based decoder (mpeg1video), so we 383 /* here, we use a stream based decoder (mpeg1video), so we
379 feed decoder and see if it could decode a frame */ 384 feed decoder and see if it could decode a frame */
380 inbuf_ptr = inbuf; 385 avpkt.data = inbuf;
381 while (size > 0) { 386 while (avpkt.size > 0) {
382 len = avcodec_decode_video(c, picture, &got_picture, 387 len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
383 inbuf_ptr, size);
384 if (len < 0) { 388 if (len < 0) {
385 fprintf(stderr, "Error while decoding frame %d\n", frame); 389 fprintf(stderr, "Error while decoding frame %d\n", frame);
386 exit(1); 390 exit(1);
387 } 391 }
388 if (got_picture) { 392 if (got_picture) {
394 snprintf(buf, sizeof(buf), outfilename, frame); 398 snprintf(buf, sizeof(buf), outfilename, frame);
395 pgm_save(picture->data[0], picture->linesize[0], 399 pgm_save(picture->data[0], picture->linesize[0],
396 c->width, c->height, buf); 400 c->width, c->height, buf);
397 frame++; 401 frame++;
398 } 402 }
399 size -= len; 403 avpkt.size -= len;
400 inbuf_ptr += len; 404 avpkt.data += len;
401 } 405 }
402 } 406 }
403 407
404 /* some codecs, such as MPEG, transmit the I and P frame with a 408 /* some codecs, such as MPEG, transmit the I and P frame with a
405 latency of one frame. You must do the following to have a 409 latency of one frame. You must do the following to have a
406 chance to get the last frame of the video */ 410 chance to get the last frame of the video */
407 len = avcodec_decode_video(c, picture, &got_picture, 411 avpkt.data = NULL;
408 NULL, 0); 412 avpkt.size = 0;
413 len = avcodec_decode_video2(c, picture, &got_picture, &avpkt);
409 if (got_picture) { 414 if (got_picture) {
410 printf("saving last frame %3d\n", frame); 415 printf("saving last frame %3d\n", frame);
411 fflush(stdout); 416 fflush(stdout);
412 417
413 /* the picture is allocated by the decoder. no need to 418 /* the picture is allocated by the decoder. no need to