Mercurial > libavcodec.hg
annotate api-example.c @ 12104:2a6873ee2fc9 libavcodec
ARM: hide a .size directive on non-ELF targets
author | mru |
---|---|
date | Wed, 07 Jul 2010 20:09:37 +0000 |
parents | 01408f7d629c |
children |
rev | line source |
---|---|
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
1 /* |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
2 * copyright (c) 2001 Fabrice Bellard |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
3 * |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
4 * This file is part of FFmpeg. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
5 * |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
8 * License as published by the Free Software Foundation; either |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
10 * |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
14 * Lesser General Public License for more details. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
15 * |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
16 * You should have received a copy of the GNU Lesser General Public |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
19 */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
20 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
21 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
10367
diff
changeset
|
22 * @file |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
23 * avcodec API use example. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
24 * |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
25 * Note that this library only handles codecs (mpeg, mpeg4, etc...), |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
26 * not file formats (avi, vob, etc...). See library 'libavformat' for the |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
27 * format handling |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
28 */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
29 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
30 #include <stdlib.h> |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
31 #include <stdio.h> |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
32 #include <string.h> |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
33 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
34 #ifdef HAVE_AV_CONFIG_H |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
35 #undef HAVE_AV_CONFIG_H |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
36 #endif |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
37 |
10367
b790df0d7046
Allow building api-example from outside of libavcodec and also
jai_menon
parents:
9382
diff
changeset
|
38 #include "libavcodec/avcodec.h" |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
39 #include "libavutil/mathematics.h" |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
40 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
41 #define INBUF_SIZE 4096 |
11765
c96e649c4e0a
api-example: Try to avoid decoding incomplete frames
mstorsjo
parents:
11644
diff
changeset
|
42 #define AUDIO_INBUF_SIZE 20480 |
c96e649c4e0a
api-example: Try to avoid decoding incomplete frames
mstorsjo
parents:
11644
diff
changeset
|
43 #define AUDIO_REFILL_THRESH 4096 |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
44 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
45 /* |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
46 * Audio encoding example |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
47 */ |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
48 static void audio_encode_example(const char *filename) |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
49 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
50 AVCodec *codec; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
51 AVCodecContext *c= NULL; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
52 int frame_size, i, j, out_size, outbuf_size; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
53 FILE *f; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
54 short *samples; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
55 float t, tincr; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
56 uint8_t *outbuf; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
57 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
58 printf("Audio encoding\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
59 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
60 /* find the MP2 encoder */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
61 codec = avcodec_find_encoder(CODEC_ID_MP2); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
62 if (!codec) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
63 fprintf(stderr, "codec not found\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
64 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
65 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
66 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
67 c= avcodec_alloc_context(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
68 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
69 /* put sample parameters */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
70 c->bit_rate = 64000; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
71 c->sample_rate = 44100; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
72 c->channels = 2; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
73 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
74 /* open it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
75 if (avcodec_open(c, codec) < 0) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
76 fprintf(stderr, "could not open codec\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
77 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
78 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
79 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
80 /* the codec gives us the frame size, in samples */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
81 frame_size = c->frame_size; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
82 samples = malloc(frame_size * 2 * c->channels); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
83 outbuf_size = 10000; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
84 outbuf = malloc(outbuf_size); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
85 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
86 f = fopen(filename, "wb"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
87 if (!f) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
88 fprintf(stderr, "could not open %s\n", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
89 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
90 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
91 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
92 /* encode a single tone sound */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
93 t = 0; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
94 tincr = 2 * M_PI * 440.0 / c->sample_rate; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
95 for(i=0;i<200;i++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
96 for(j=0;j<frame_size;j++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
97 samples[2*j] = (int)(sin(t) * 10000); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
98 samples[2*j+1] = samples[2*j]; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
99 t += tincr; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
100 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
101 /* encode the samples */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
102 out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
103 fwrite(outbuf, 1, out_size, f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
104 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
105 fclose(f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
106 free(outbuf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
107 free(samples); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
108 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
109 avcodec_close(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
110 av_free(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
111 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
112 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
113 /* |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
114 * Audio decoding. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
115 */ |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
116 static void audio_decode_example(const char *outfilename, const char *filename) |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
117 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
118 AVCodec *codec; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
119 AVCodecContext *c= NULL; |
9382 | 120 int out_size, len; |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
121 FILE *f, *outfile; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
122 uint8_t *outbuf; |
11765
c96e649c4e0a
api-example: Try to avoid decoding incomplete frames
mstorsjo
parents:
11644
diff
changeset
|
123 uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; |
9382 | 124 AVPacket avpkt; |
125 | |
126 av_init_packet(&avpkt); | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
127 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
128 printf("Audio decoding\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
129 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
130 /* find the mpeg audio decoder */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
131 codec = avcodec_find_decoder(CODEC_ID_MP2); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
132 if (!codec) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
133 fprintf(stderr, "codec not found\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
134 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
135 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
136 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
137 c= avcodec_alloc_context(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
138 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
139 /* open it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
140 if (avcodec_open(c, codec) < 0) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
141 fprintf(stderr, "could not open codec\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
142 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
143 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
144 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
145 outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
146 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
147 f = fopen(filename, "rb"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
148 if (!f) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
149 fprintf(stderr, "could not open %s\n", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
150 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
151 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
152 outfile = fopen(outfilename, "wb"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
153 if (!outfile) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
154 av_free(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
155 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
156 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
157 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
158 /* decode until eof */ |
9382 | 159 avpkt.data = inbuf; |
11766 | 160 avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
161 |
11766 | 162 while (avpkt.size > 0) { |
163 out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; | |
164 len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt); | |
165 if (len < 0) { | |
166 fprintf(stderr, "Error while decoding\n"); | |
167 exit(1); | |
168 } | |
169 if (out_size > 0) { | |
170 /* if a frame has been decoded, output it */ | |
171 fwrite(outbuf, 1, out_size, outfile); | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
172 } |
11766 | 173 avpkt.size -= len; |
174 avpkt.data += len; | |
175 if (avpkt.size < AUDIO_REFILL_THRESH) { | |
176 /* Refill the input buffer, to avoid trying to decode | |
177 * incomplete frames. Instead of this, one could also use | |
178 * a parser, or use a proper container format through | |
179 * libavformat. */ | |
180 memmove(inbuf, avpkt.data, avpkt.size); | |
181 avpkt.data = inbuf; | |
182 len = fread(avpkt.data + avpkt.size, 1, | |
183 AUDIO_INBUF_SIZE - avpkt.size, f); | |
184 if (len > 0) | |
185 avpkt.size += len; | |
186 } | |
187 } | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
188 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
189 fclose(outfile); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
190 fclose(f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
191 free(outbuf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
192 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
193 avcodec_close(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
194 av_free(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
195 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
196 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
197 /* |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
198 * Video encoding example |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
199 */ |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
200 static void video_encode_example(const char *filename) |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
201 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
202 AVCodec *codec; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
203 AVCodecContext *c= NULL; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
204 int i, out_size, size, x, y, outbuf_size; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
205 FILE *f; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
206 AVFrame *picture; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
207 uint8_t *outbuf, *picture_buf; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
208 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
209 printf("Video encoding\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
210 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
211 /* find the mpeg1 video encoder */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
212 codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
213 if (!codec) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
214 fprintf(stderr, "codec not found\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
215 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
216 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
217 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
218 c= avcodec_alloc_context(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
219 picture= avcodec_alloc_frame(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
220 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
221 /* put sample parameters */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
222 c->bit_rate = 400000; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
223 /* resolution must be a multiple of two */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
224 c->width = 352; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
225 c->height = 288; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
226 /* frames per second */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
227 c->time_base= (AVRational){1,25}; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
228 c->gop_size = 10; /* emit one intra frame every ten frames */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
229 c->max_b_frames=1; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
230 c->pix_fmt = PIX_FMT_YUV420P; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
231 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
232 /* open it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
233 if (avcodec_open(c, codec) < 0) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
234 fprintf(stderr, "could not open codec\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
235 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
236 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
237 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
238 f = fopen(filename, "wb"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
239 if (!f) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
240 fprintf(stderr, "could not open %s\n", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
241 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
242 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
243 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
244 /* alloc image and output buffer */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
245 outbuf_size = 100000; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
246 outbuf = malloc(outbuf_size); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
247 size = c->width * c->height; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
248 picture_buf = malloc((size * 3) / 2); /* size for YUV 420 */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
249 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
250 picture->data[0] = picture_buf; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
251 picture->data[1] = picture->data[0] + size; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
252 picture->data[2] = picture->data[1] + size / 4; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
253 picture->linesize[0] = c->width; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
254 picture->linesize[1] = c->width / 2; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
255 picture->linesize[2] = c->width / 2; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
256 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
257 /* encode 1 second of video */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
258 for(i=0;i<25;i++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
259 fflush(stdout); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
260 /* prepare a dummy image */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
261 /* Y */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
262 for(y=0;y<c->height;y++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
263 for(x=0;x<c->width;x++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
264 picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
265 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
266 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
267 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
268 /* Cb and Cr */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
269 for(y=0;y<c->height/2;y++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
270 for(x=0;x<c->width/2;x++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
271 picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
272 picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
273 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
274 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
275 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
276 /* encode the image */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
277 out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
278 printf("encoding frame %3d (size=%5d)\n", i, out_size); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
279 fwrite(outbuf, 1, out_size, f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
280 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
281 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
282 /* get the delayed frames */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
283 for(; out_size; i++) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
284 fflush(stdout); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
285 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
286 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
287 printf("write frame %3d (size=%5d)\n", i, out_size); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
288 fwrite(outbuf, 1, out_size, f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
289 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
290 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
291 /* add sequence end code to have a real mpeg file */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
292 outbuf[0] = 0x00; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
293 outbuf[1] = 0x00; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
294 outbuf[2] = 0x01; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
295 outbuf[3] = 0xb7; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
296 fwrite(outbuf, 1, 4, f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
297 fclose(f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
298 free(picture_buf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
299 free(outbuf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
300 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
301 avcodec_close(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
302 av_free(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
303 av_free(picture); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
304 printf("\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
305 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
306 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
307 /* |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
308 * Video decoding example |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
309 */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
310 |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
311 static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize, |
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
312 char *filename) |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
313 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
314 FILE *f; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
315 int i; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
316 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
317 f=fopen(filename,"w"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
318 fprintf(f,"P5\n%d %d\n%d\n",xsize,ysize,255); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
319 for(i=0;i<ysize;i++) |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
320 fwrite(buf + i * wrap,1,xsize,f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
321 fclose(f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
322 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
323 |
9295
b225f51903af
Mark non-exported functions in test and example programs as static.
diego
parents:
9269
diff
changeset
|
324 static void video_decode_example(const char *outfilename, const char *filename) |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
325 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
326 AVCodec *codec; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
327 AVCodecContext *c= NULL; |
9382 | 328 int frame, got_picture, len; |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
329 FILE *f; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
330 AVFrame *picture; |
9382 | 331 uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
332 char buf[1024]; |
9382 | 333 AVPacket avpkt; |
334 | |
335 av_init_packet(&avpkt); | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
336 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
337 /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
338 memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
339 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
340 printf("Video decoding\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
341 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
342 /* find the mpeg1 video decoder */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
343 codec = avcodec_find_decoder(CODEC_ID_MPEG1VIDEO); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
344 if (!codec) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
345 fprintf(stderr, "codec not found\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
346 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
347 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
348 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
349 c= avcodec_alloc_context(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
350 picture= avcodec_alloc_frame(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
351 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
352 if(codec->capabilities&CODEC_CAP_TRUNCATED) |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
353 c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
354 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
355 /* For some codecs, such as msmpeg4 and mpeg4, width and height |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
356 MUST be initialized there because this information is not |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
357 available in the bitstream. */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
358 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
359 /* open it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
360 if (avcodec_open(c, codec) < 0) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
361 fprintf(stderr, "could not open codec\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
362 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
363 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
364 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
365 /* the codec gives us the frame size, in samples */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
366 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
367 f = fopen(filename, "rb"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
368 if (!f) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
369 fprintf(stderr, "could not open %s\n", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
370 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
371 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
372 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
373 frame = 0; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
374 for(;;) { |
9382 | 375 avpkt.size = fread(inbuf, 1, INBUF_SIZE, f); |
376 if (avpkt.size == 0) | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
377 break; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
378 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
379 /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio) |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
380 and this is the only method to use them because you cannot |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
381 know the compressed data size before analysing it. |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
382 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
383 BUT some other codecs (msmpeg4, mpeg4) are inherently frame |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
384 based, so you must call them with all the data for one |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
385 frame exactly. You must also initialize 'width' and |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
386 'height' before initializing them. */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
387 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
388 /* NOTE2: some codecs allow the raw parameters (frame size, |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
389 sample rate) to be changed at any frame. We handle this, so |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
390 you should also take care of it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
391 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
392 /* here, we use a stream based decoder (mpeg1video), so we |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
393 feed decoder and see if it could decode a frame */ |
9382 | 394 avpkt.data = inbuf; |
395 while (avpkt.size > 0) { | |
396 len = avcodec_decode_video2(c, picture, &got_picture, &avpkt); | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
397 if (len < 0) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
398 fprintf(stderr, "Error while decoding frame %d\n", frame); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
399 exit(1); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
400 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
401 if (got_picture) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
402 printf("saving frame %3d\n", frame); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
403 fflush(stdout); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
404 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
405 /* the picture is allocated by the decoder. no need to |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
406 free it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
407 snprintf(buf, sizeof(buf), outfilename, frame); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
408 pgm_save(picture->data[0], picture->linesize[0], |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
409 c->width, c->height, buf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
410 frame++; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
411 } |
9382 | 412 avpkt.size -= len; |
413 avpkt.data += len; | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
414 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
415 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
416 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
417 /* some codecs, such as MPEG, transmit the I and P frame with a |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
418 latency of one frame. You must do the following to have a |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
419 chance to get the last frame of the video */ |
9382 | 420 avpkt.data = NULL; |
421 avpkt.size = 0; | |
422 len = avcodec_decode_video2(c, picture, &got_picture, &avpkt); | |
9269
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
423 if (got_picture) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
424 printf("saving last frame %3d\n", frame); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
425 fflush(stdout); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
426 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
427 /* the picture is allocated by the decoder. no need to |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
428 free it */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
429 snprintf(buf, sizeof(buf), outfilename, frame); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
430 pgm_save(picture->data[0], picture->linesize[0], |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
431 c->width, c->height, buf); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
432 frame++; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
433 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
434 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
435 fclose(f); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
436 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
437 avcodec_close(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
438 av_free(c); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
439 av_free(picture); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
440 printf("\n"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
441 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
442 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
443 int main(int argc, char **argv) |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
444 { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
445 const char *filename; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
446 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
447 /* must be called before using avcodec lib */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
448 avcodec_init(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
449 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
450 /* register all the codecs */ |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
451 avcodec_register_all(); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
452 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
453 if (argc <= 1) { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
454 audio_encode_example("/tmp/test.mp2"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
455 audio_decode_example("/tmp/test.sw", "/tmp/test.mp2"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
456 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
457 video_encode_example("/tmp/test.mpg"); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
458 filename = "/tmp/test.mpg"; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
459 } else { |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
460 filename = argv[1]; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
461 } |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
462 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
463 // audio_decode_example("/tmp/test.sw", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
464 video_decode_example("/tmp/test%d.pgm", filename); |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
465 |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
466 return 0; |
bd89b50b48fc
Rename apiexample.c --> api-example.c to be consistent with other example files.
diego
parents:
diff
changeset
|
467 } |