annotate output-example.c @ 5504:e15a959963f1 libavformat

handler can be NULL if we did not support this dynamic format (codec). Fixes issue 1658 (the crasher), although the format itself is obviously still unsupported.
author rbultje
date Thu, 07 Jan 2010 23:05:19 +0000
parents cb7a82c74dcc
children 1cdf9bbfbc7f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
1 /*
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
2 * Libavformat API example: Output a media file in any supported
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
3 * libavformat format. The default codecs are used.
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
4 *
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
5 * Copyright (c) 2003 Fabrice Bellard
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
6 *
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
13 *
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
15 * all copies or substantial portions of the Software.
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
16 *
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
23 * THE SOFTWARE.
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
24 */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
25 #include <stdlib.h>
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
26 #include <stdio.h>
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
27 #include <string.h>
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
28 #include <math.h>
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
29
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
30 #ifndef M_PI
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
31 #define M_PI 3.14159265358979323846
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
32 #endif
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
33
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
34 #include "libavformat/avformat.h"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
35 #include "libswscale/swscale.h"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
36
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
37 #undef exit
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
38
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
39 /* 5 seconds stream duration */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
40 #define STREAM_DURATION 5.0
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
41 #define STREAM_FRAME_RATE 25 /* 25 images/s */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
42 #define STREAM_NB_FRAMES ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
43 #define STREAM_PIX_FMT PIX_FMT_YUV420P /* default pix_fmt */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
44
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
45 static int sws_flags = SWS_BICUBIC;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
46
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
47 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
48 /* audio output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
49
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
50 float t, tincr, tincr2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
51 int16_t *samples;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
52 uint8_t *audio_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
53 int audio_outbuf_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
54 int audio_input_frame_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
55
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
56 /*
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
57 * add an audio output stream
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
58 */
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
59 static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
60 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
61 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
62 AVStream *st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
63
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
64 st = av_new_stream(oc, 1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
65 if (!st) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
66 fprintf(stderr, "Could not alloc stream\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
67 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
68 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
69
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
70 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
71 c->codec_id = codec_id;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
72 c->codec_type = CODEC_TYPE_AUDIO;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
73
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
74 /* put sample parameters */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
75 c->bit_rate = 64000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
76 c->sample_rate = 44100;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
77 c->channels = 2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
78 return st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
79 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
80
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
81 static void open_audio(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
82 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
83 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
84 AVCodec *codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
85
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
86 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
87
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
88 /* find the audio encoder */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
89 codec = avcodec_find_encoder(c->codec_id);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
90 if (!codec) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
91 fprintf(stderr, "codec not found\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
92 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
93 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
94
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
95 /* open it */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
96 if (avcodec_open(c, codec) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
97 fprintf(stderr, "could not open codec\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
98 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
99 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
100
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
101 /* init signal generator */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
102 t = 0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
103 tincr = 2 * M_PI * 110.0 / c->sample_rate;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
104 /* increment frequency by 110 Hz per second */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
105 tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
106
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
107 audio_outbuf_size = 10000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
108 audio_outbuf = av_malloc(audio_outbuf_size);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
109
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
110 /* ugly hack for PCM codecs (will be removed ASAP with new PCM
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
111 support to compute the input frame size in samples */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
112 if (c->frame_size <= 1) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
113 audio_input_frame_size = audio_outbuf_size / c->channels;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
114 switch(st->codec->codec_id) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
115 case CODEC_ID_PCM_S16LE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
116 case CODEC_ID_PCM_S16BE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
117 case CODEC_ID_PCM_U16LE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
118 case CODEC_ID_PCM_U16BE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
119 audio_input_frame_size >>= 1;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
120 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
121 default:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
122 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
123 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
124 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
125 audio_input_frame_size = c->frame_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
126 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
127 samples = av_malloc(audio_input_frame_size * 2 * c->channels);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
128 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
129
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
130 /* prepare a 16 bit dummy audio frame of 'frame_size' samples and
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
131 'nb_channels' channels */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
132 static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
133 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
134 int j, i, v;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
135 int16_t *q;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
136
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
137 q = samples;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
138 for(j=0;j<frame_size;j++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
139 v = (int)(sin(t) * 10000);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
140 for(i = 0; i < nb_channels; i++)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
141 *q++ = v;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
142 t += tincr;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
143 tincr += tincr2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
144 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
145 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
146
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
147 static void write_audio_frame(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
148 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
149 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
150 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
151 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
152
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
153 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
154
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
155 get_audio_frame(samples, audio_input_frame_size, c->channels);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
156
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
157 pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, samples);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
158
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
159 if (c->coded_frame->pts != AV_NOPTS_VALUE)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
160 pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
161 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
162 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
163 pkt.data= audio_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
164
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
165 /* write the compressed frame in the media file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
166 if (av_interleaved_write_frame(oc, &pkt) != 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
167 fprintf(stderr, "Error while writing audio frame\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
168 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
169 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
170 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
171
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
172 static void close_audio(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
173 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
174 avcodec_close(st->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
175
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
176 av_free(samples);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
177 av_free(audio_outbuf);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
178 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
179
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
180 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
181 /* video output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
182
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
183 AVFrame *picture, *tmp_picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
184 uint8_t *video_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
185 int frame_count, video_outbuf_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
186
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
187 /* add a video output stream */
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
188 static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
189 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
190 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
191 AVStream *st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
192
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
193 st = av_new_stream(oc, 0);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
194 if (!st) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
195 fprintf(stderr, "Could not alloc stream\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
196 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
197 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
198
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
199 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
200 c->codec_id = codec_id;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
201 c->codec_type = CODEC_TYPE_VIDEO;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
202
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
203 /* put sample parameters */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
204 c->bit_rate = 400000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
205 /* resolution must be a multiple of two */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
206 c->width = 352;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
207 c->height = 288;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
208 /* time base: this is the fundamental unit of time (in seconds) in terms
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
209 of which frame timestamps are represented. for fixed-fps content,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
210 timebase should be 1/framerate and timestamp increments should be
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
211 identically 1. */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
212 c->time_base.den = STREAM_FRAME_RATE;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
213 c->time_base.num = 1;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
214 c->gop_size = 12; /* emit one intra frame every twelve frames at most */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
215 c->pix_fmt = STREAM_PIX_FMT;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
216 if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
217 /* just for testing, we also add B frames */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
218 c->max_b_frames = 2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
219 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
220 if (c->codec_id == CODEC_ID_MPEG1VIDEO){
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
221 /* Needed to avoid using macroblocks in which some coeffs overflow.
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
222 This does not happen with normal video, it just happens here as
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
223 the motion of the chroma plane does not match the luma plane. */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
224 c->mb_decision=2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
225 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
226 // some formats want stream headers to be separate
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
227 if(oc->oformat->flags & AVFMT_GLOBALHEADER)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
228 c->flags |= CODEC_FLAG_GLOBAL_HEADER;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
229
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
230 return st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
231 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
232
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
233 static AVFrame *alloc_picture(enum PixelFormat pix_fmt, int width, int height)
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
234 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
235 AVFrame *picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
236 uint8_t *picture_buf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
237 int size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
238
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
239 picture = avcodec_alloc_frame();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
240 if (!picture)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
241 return NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
242 size = avpicture_get_size(pix_fmt, width, height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
243 picture_buf = av_malloc(size);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
244 if (!picture_buf) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
245 av_free(picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
246 return NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
247 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
248 avpicture_fill((AVPicture *)picture, picture_buf,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
249 pix_fmt, width, height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
250 return picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
251 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
252
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
253 static void open_video(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
254 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
255 AVCodec *codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
256 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
257
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
258 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
259
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
260 /* find the video encoder */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
261 codec = avcodec_find_encoder(c->codec_id);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
262 if (!codec) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
263 fprintf(stderr, "codec not found\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
264 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
265 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
266
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
267 /* open the codec */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
268 if (avcodec_open(c, codec) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
269 fprintf(stderr, "could not open codec\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
270 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
271 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
272
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
273 video_outbuf = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
274 if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
275 /* allocate output buffer */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
276 /* XXX: API change will be done */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
277 /* buffers passed into lav* can be allocated any way you prefer,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
278 as long as they're aligned enough for the architecture, and
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
279 they're freed appropriately (such as using av_free for buffers
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
280 allocated with av_malloc) */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
281 video_outbuf_size = 200000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
282 video_outbuf = av_malloc(video_outbuf_size);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
283 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
284
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
285 /* allocate the encoded raw picture */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
286 picture = alloc_picture(c->pix_fmt, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
287 if (!picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
288 fprintf(stderr, "Could not allocate picture\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
289 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
290 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
291
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
292 /* if the output format is not YUV420P, then a temporary YUV420P
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
293 picture is needed too. It is then converted to the required
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
294 output format */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
295 tmp_picture = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
296 if (c->pix_fmt != PIX_FMT_YUV420P) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
297 tmp_picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
298 if (!tmp_picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
299 fprintf(stderr, "Could not allocate temporary picture\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
300 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
301 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
302 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
303 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
304
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
305 /* prepare a dummy image */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
306 static void fill_yuv_image(AVFrame *pict, int frame_index, int width, int height)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
307 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
308 int x, y, i;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
309
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
310 i = frame_index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
311
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
312 /* Y */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
313 for(y=0;y<height;y++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
314 for(x=0;x<width;x++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
315 pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
316 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
317 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
318
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
319 /* Cb and Cr */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
320 for(y=0;y<height/2;y++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
321 for(x=0;x<width/2;x++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
322 pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
323 pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
324 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
325 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
326 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
327
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
328 static void write_video_frame(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
329 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
330 int out_size, ret;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
331 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
332 static struct SwsContext *img_convert_ctx;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
333
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
334 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
335
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
336 if (frame_count >= STREAM_NB_FRAMES) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
337 /* no more frame to compress. The codec has a latency of a few
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
338 frames if using B frames, so we get the last frames by
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
339 passing the same picture again */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
340 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
341 if (c->pix_fmt != PIX_FMT_YUV420P) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
342 /* as we only generate a YUV420P picture, we must convert it
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
343 to the codec pixel format if needed */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
344 if (img_convert_ctx == NULL) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
345 img_convert_ctx = sws_getContext(c->width, c->height,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
346 PIX_FMT_YUV420P,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
347 c->width, c->height,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
348 c->pix_fmt,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
349 sws_flags, NULL, NULL, NULL);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
350 if (img_convert_ctx == NULL) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
351 fprintf(stderr, "Cannot initialize the conversion context\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
352 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
353 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
354 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
355 fill_yuv_image(tmp_picture, frame_count, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
356 sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
357 0, c->height, picture->data, picture->linesize);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
358 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
359 fill_yuv_image(picture, frame_count, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
360 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
361 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
362
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
363
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
364 if (oc->oformat->flags & AVFMT_RAWPICTURE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
365 /* raw video case. The API will change slightly in the near
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
366 futur for that */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
367 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
368 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
369
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
370 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
371 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
372 pkt.data= (uint8_t *)picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
373 pkt.size= sizeof(AVPicture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
374
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
375 ret = av_interleaved_write_frame(oc, &pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
376 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
377 /* encode the image */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
378 out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
379 /* if zero size, it means the image was buffered */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
380 if (out_size > 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
381 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
382 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
383
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
384 if (c->coded_frame->pts != AV_NOPTS_VALUE)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
385 pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
386 if(c->coded_frame->key_frame)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
387 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
388 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
389 pkt.data= video_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
390 pkt.size= out_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
391
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
392 /* write the compressed frame in the media file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
393 ret = av_interleaved_write_frame(oc, &pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
394 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
395 ret = 0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
396 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
397 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
398 if (ret != 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
399 fprintf(stderr, "Error while writing video frame\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
400 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
401 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
402 frame_count++;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
403 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
404
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
405 static void close_video(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
406 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
407 avcodec_close(st->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
408 av_free(picture->data[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
409 av_free(picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
410 if (tmp_picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
411 av_free(tmp_picture->data[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
412 av_free(tmp_picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
413 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
414 av_free(video_outbuf);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
415 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
416
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
417 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
418 /* media file output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
419
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
420 int main(int argc, char **argv)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
421 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
422 const char *filename;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
423 AVOutputFormat *fmt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
424 AVFormatContext *oc;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
425 AVStream *audio_st, *video_st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
426 double audio_pts, video_pts;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
427 int i;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
428
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
429 /* initialize libavcodec, and register all codecs and formats */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
430 av_register_all();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
431
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
432 if (argc != 2) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
433 printf("usage: %s output_file\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
434 "API example program to output a media file with libavformat.\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
435 "The output format is automatically guessed according to the file extension.\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
436 "Raw images can also be output by using '%%d' in the filename\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
437 "\n", argv[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
438 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
439 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
440
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
441 filename = argv[1];
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
442
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
443 /* auto detect the output format from the name. default is
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
444 mpeg. */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
445 fmt = guess_format(NULL, filename, NULL);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
446 if (!fmt) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
447 printf("Could not deduce output format from file extension: using MPEG.\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
448 fmt = guess_format("mpeg", NULL, NULL);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
449 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
450 if (!fmt) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
451 fprintf(stderr, "Could not find suitable output format\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
452 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
453 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
454
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
455 /* allocate the output media context */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
456 oc = avformat_alloc_context();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
457 if (!oc) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
458 fprintf(stderr, "Memory error\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
459 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
460 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
461 oc->oformat = fmt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
462 snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
463
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
464 /* add the audio and video streams using the default format codecs
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
465 and initialize the codecs */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
466 video_st = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
467 audio_st = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
468 if (fmt->video_codec != CODEC_ID_NONE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
469 video_st = add_video_stream(oc, fmt->video_codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
470 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
471 if (fmt->audio_codec != CODEC_ID_NONE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
472 audio_st = add_audio_stream(oc, fmt->audio_codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
473 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
474
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
475 /* set the output parameters (must be done even if no
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
476 parameters). */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
477 if (av_set_parameters(oc, NULL) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
478 fprintf(stderr, "Invalid output format parameters\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
479 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
480 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
481
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
482 dump_format(oc, 0, filename, 1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
483
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
484 /* now that all the parameters are set, we can open the audio and
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
485 video codecs and allocate the necessary encode buffers */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
486 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
487 open_video(oc, video_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
488 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
489 open_audio(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
490
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
491 /* open the output file, if needed */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
492 if (!(fmt->flags & AVFMT_NOFILE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
493 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
494 fprintf(stderr, "Could not open '%s'\n", filename);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
495 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
496 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
497 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
498
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
499 /* write the stream header, if any */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
500 av_write_header(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
501
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
502 for(;;) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
503 /* compute current audio and video time */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
504 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
505 audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
506 else
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
507 audio_pts = 0.0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
508
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
509 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
510 video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
511 else
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
512 video_pts = 0.0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
513
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
514 if ((!audio_st || audio_pts >= STREAM_DURATION) &&
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
515 (!video_st || video_pts >= STREAM_DURATION))
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
516 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
517
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
518 /* write interleaved audio and video frames */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
519 if (!video_st || (video_st && audio_st && audio_pts < video_pts)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
520 write_audio_frame(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
521 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
522 write_video_frame(oc, video_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
523 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
524 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
525
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
526 /* write the trailer, if any. the trailer must be written
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
527 * before you close the CodecContexts open when you wrote the
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
528 * header; otherwise write_trailer may try to use memory that
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
529 * was freed on av_codec_close() */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
530 av_write_trailer(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
531
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
532 /* close each codec */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
533 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
534 close_video(oc, video_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
535 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
536 close_audio(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
537
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
538 /* free the streams */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
539 for(i = 0; i < oc->nb_streams; i++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
540 av_freep(&oc->streams[i]->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
541 av_freep(&oc->streams[i]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
542 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
543
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
544 if (!(fmt->flags & AVFMT_NOFILE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
545 /* close the output file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
546 url_fclose(oc->pb);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
547 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
548
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
549 /* free the stream */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
550 av_free(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
551
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
552 return 0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
553 }