annotate output-example.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents e892e44a0b6b
children 11bb10c37225
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 #include "libavformat/avformat.h"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
31 #include "libswscale/swscale.h"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
32
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
33 #undef exit
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
34
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
35 /* 5 seconds stream duration */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
36 #define STREAM_DURATION 5.0
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
37 #define STREAM_FRAME_RATE 25 /* 25 images/s */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
38 #define STREAM_NB_FRAMES ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
39 #define STREAM_PIX_FMT PIX_FMT_YUV420P /* default pix_fmt */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
40
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
41 static int sws_flags = SWS_BICUBIC;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
42
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
43 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
44 /* audio output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
45
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
46 float t, tincr, tincr2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
47 int16_t *samples;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
48 uint8_t *audio_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
49 int audio_outbuf_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
50 int audio_input_frame_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
51
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
52 /*
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
53 * add an audio output stream
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
54 */
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
55 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
56 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
57 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
58 AVStream *st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
59
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
60 st = av_new_stream(oc, 1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
61 if (!st) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
62 fprintf(stderr, "Could not alloc stream\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
63 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
64 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
65
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
66 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
67 c->codec_id = codec_id;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5578
diff changeset
68 c->codec_type = AVMEDIA_TYPE_AUDIO;
4794
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 /* put sample parameters */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
71 c->bit_rate = 64000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
72 c->sample_rate = 44100;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
73 c->channels = 2;
5568
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
74
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
75 // some formats want stream headers to be separate
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
76 if(oc->oformat->flags & AVFMT_GLOBALHEADER)
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
77 c->flags |= CODEC_FLAG_GLOBAL_HEADER;
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
78
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
79 return st;
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
82 static void open_audio(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
83 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
84 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
85 AVCodec *codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
86
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
87 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
88
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
89 /* find the audio encoder */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
90 codec = avcodec_find_encoder(c->codec_id);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
91 if (!codec) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
92 fprintf(stderr, "codec not found\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
93 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
96 /* open it */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
97 if (avcodec_open(c, codec) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
98 fprintf(stderr, "could not open codec\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
99 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
102 /* init signal generator */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
103 t = 0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
104 tincr = 2 * M_PI * 110.0 / c->sample_rate;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
105 /* increment frequency by 110 Hz per second */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
106 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
107
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
108 audio_outbuf_size = 10000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
109 audio_outbuf = av_malloc(audio_outbuf_size);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
110
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
111 /* 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
112 support to compute the input frame size in samples */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
113 if (c->frame_size <= 1) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
114 audio_input_frame_size = audio_outbuf_size / c->channels;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
115 switch(st->codec->codec_id) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
116 case CODEC_ID_PCM_S16LE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
117 case CODEC_ID_PCM_S16BE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
118 case CODEC_ID_PCM_U16LE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
119 case CODEC_ID_PCM_U16BE:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
120 audio_input_frame_size >>= 1;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
121 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
122 default:
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
123 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
124 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
125 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
126 audio_input_frame_size = c->frame_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
127 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
128 samples = av_malloc(audio_input_frame_size * 2 * c->channels);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
131 /* 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
132 'nb_channels' channels */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
133 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
134 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
135 int j, i, v;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
136 int16_t *q;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
137
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
138 q = samples;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
139 for(j=0;j<frame_size;j++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
140 v = (int)(sin(t) * 10000);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
141 for(i = 0; i < nb_channels; i++)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
142 *q++ = v;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
143 t += tincr;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
144 tincr += tincr2;
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
148 static void write_audio_frame(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
149 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
150 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
151 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
152 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
153
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
154 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
155
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
156 get_audio_frame(samples, audio_input_frame_size, c->channels);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
157
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
158 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
159
5568
1cdf9bbfbc7f Make output-example.c handle AAC audio.
benoit
parents: 5124
diff changeset
160 if (c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
161 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
162 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
163 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
164 pkt.data= audio_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
165
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
166 /* write the compressed frame in the media file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
167 if (av_interleaved_write_frame(oc, &pkt) != 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
168 fprintf(stderr, "Error while writing audio frame\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
169 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
173 static void close_audio(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
174 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
175 avcodec_close(st->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
176
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
177 av_free(samples);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
178 av_free(audio_outbuf);
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 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
182 /* video output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
183
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
184 AVFrame *picture, *tmp_picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
185 uint8_t *video_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
186 int frame_count, video_outbuf_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
187
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
188 /* add a video output stream */
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
189 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
190 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
191 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
192 AVStream *st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
193
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
194 st = av_new_stream(oc, 0);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
195 if (!st) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
196 fprintf(stderr, "Could not alloc stream\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
197 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
200 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
201 c->codec_id = codec_id;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5578
diff changeset
202 c->codec_type = AVMEDIA_TYPE_VIDEO;
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
203
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
204 /* put sample parameters */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
205 c->bit_rate = 400000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
206 /* resolution must be a multiple of two */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
207 c->width = 352;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
208 c->height = 288;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
209 /* 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
210 of which frame timestamps are represented. for fixed-fps content,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
211 timebase should be 1/framerate and timestamp increments should be
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
212 identically 1. */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
213 c->time_base.den = STREAM_FRAME_RATE;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
214 c->time_base.num = 1;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
215 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
216 c->pix_fmt = STREAM_PIX_FMT;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
217 if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
218 /* just for testing, we also add B frames */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
219 c->max_b_frames = 2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
220 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
221 if (c->codec_id == CODEC_ID_MPEG1VIDEO){
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
222 /* Needed to avoid using macroblocks in which some coeffs overflow.
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
223 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
224 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
225 c->mb_decision=2;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
226 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
227 // some formats want stream headers to be separate
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
228 if(oc->oformat->flags & AVFMT_GLOBALHEADER)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
229 c->flags |= CODEC_FLAG_GLOBAL_HEADER;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
230
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
231 return st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
232 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
233
5124
cb7a82c74dcc Use enums instead of int.
ramiro
parents: 4794
diff changeset
234 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
235 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
236 AVFrame *picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
237 uint8_t *picture_buf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
238 int size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
239
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
240 picture = avcodec_alloc_frame();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
241 if (!picture)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
242 return NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
243 size = avpicture_get_size(pix_fmt, width, height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
244 picture_buf = av_malloc(size);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
245 if (!picture_buf) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
246 av_free(picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
247 return NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
248 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
249 avpicture_fill((AVPicture *)picture, picture_buf,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
250 pix_fmt, width, height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
251 return picture;
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
254 static void open_video(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
255 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
256 AVCodec *codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
257 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
258
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
259 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
260
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
261 /* find the video encoder */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
262 codec = avcodec_find_encoder(c->codec_id);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
263 if (!codec) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
264 fprintf(stderr, "codec not found\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
265 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
268 /* open the codec */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
269 if (avcodec_open(c, codec) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
270 fprintf(stderr, "could not open codec\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
271 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
274 video_outbuf = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
275 if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
276 /* allocate output buffer */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
277 /* XXX: API change will be done */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
278 /* buffers passed into lav* can be allocated any way you prefer,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
279 as long as they're aligned enough for the architecture, and
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
280 they're freed appropriately (such as using av_free for buffers
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
281 allocated with av_malloc) */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
282 video_outbuf_size = 200000;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
283 video_outbuf = av_malloc(video_outbuf_size);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
286 /* allocate the encoded raw picture */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
287 picture = alloc_picture(c->pix_fmt, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
288 if (!picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
289 fprintf(stderr, "Could not allocate picture\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
290 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
293 /* if the output format is not YUV420P, then a temporary YUV420P
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
294 picture is needed too. It is then converted to the required
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
295 output format */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
296 tmp_picture = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
297 if (c->pix_fmt != PIX_FMT_YUV420P) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
298 tmp_picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
299 if (!tmp_picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
300 fprintf(stderr, "Could not allocate temporary picture\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
301 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
306 /* prepare a dummy image */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
307 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
308 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
309 int x, y, i;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
310
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
311 i = frame_index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
312
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
313 /* Y */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
314 for(y=0;y<height;y++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
315 for(x=0;x<width;x++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
316 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
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
320 /* Cb and Cr */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
321 for(y=0;y<height/2;y++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
322 for(x=0;x<width/2;x++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
323 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
324 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
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
329 static void write_video_frame(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
330 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
331 int out_size, ret;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
332 AVCodecContext *c;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
333 static struct SwsContext *img_convert_ctx;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
334
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
335 c = st->codec;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
336
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
337 if (frame_count >= STREAM_NB_FRAMES) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
338 /* 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
339 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
340 passing the same picture again */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
341 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
342 if (c->pix_fmt != PIX_FMT_YUV420P) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
343 /* as we only generate a YUV420P picture, we must convert it
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
344 to the codec pixel format if needed */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
345 if (img_convert_ctx == NULL) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
346 img_convert_ctx = sws_getContext(c->width, c->height,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
347 PIX_FMT_YUV420P,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
348 c->width, c->height,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
349 c->pix_fmt,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
350 sws_flags, NULL, NULL, NULL);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
351 if (img_convert_ctx == NULL) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
352 fprintf(stderr, "Cannot initialize the conversion context\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
353 exit(1);
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 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
356 fill_yuv_image(tmp_picture, frame_count, c->width, c->height);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
357 sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize,
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
358 0, c->height, picture->data, picture->linesize);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
359 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
360 fill_yuv_image(picture, frame_count, c->width, c->height);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
365 if (oc->oformat->flags & AVFMT_RAWPICTURE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
366 /* raw video case. The API will change slightly in the near
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
367 futur for that */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
368 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
369 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
370
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
371 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
372 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
373 pkt.data= (uint8_t *)picture;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
374 pkt.size= sizeof(AVPicture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
375
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
376 ret = av_interleaved_write_frame(oc, &pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
377 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
378 /* encode the image */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
379 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
380 /* if zero size, it means the image was buffered */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
381 if (out_size > 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
382 AVPacket pkt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
383 av_init_packet(&pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
384
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
385 if (c->coded_frame->pts != AV_NOPTS_VALUE)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
386 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
387 if(c->coded_frame->key_frame)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
388 pkt.flags |= PKT_FLAG_KEY;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
389 pkt.stream_index= st->index;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
390 pkt.data= video_outbuf;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
391 pkt.size= out_size;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
392
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
393 /* write the compressed frame in the media file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
394 ret = av_interleaved_write_frame(oc, &pkt);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
395 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
396 ret = 0;
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 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
399 if (ret != 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
400 fprintf(stderr, "Error while writing video frame\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
401 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
402 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
403 frame_count++;
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
406 static void close_video(AVFormatContext *oc, AVStream *st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
407 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
408 avcodec_close(st->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
409 av_free(picture->data[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
410 av_free(picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
411 if (tmp_picture) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
412 av_free(tmp_picture->data[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
413 av_free(tmp_picture);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
414 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
415 av_free(video_outbuf);
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 /**************************************************************/
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
419 /* media file output */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
420
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
421 int main(int argc, char **argv)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
422 {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
423 const char *filename;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
424 AVOutputFormat *fmt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
425 AVFormatContext *oc;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
426 AVStream *audio_st, *video_st;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
427 double audio_pts, video_pts;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
428 int i;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
429
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
430 /* initialize libavcodec, and register all codecs and formats */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
431 av_register_all();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
432
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
433 if (argc != 2) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
434 printf("usage: %s output_file\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
435 "API example program to output a media file with libavformat.\n"
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
436 "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
437 "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
438 "\n", argv[0]);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
439 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
442 filename = argv[1];
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
443
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
444 /* auto detect the output format from the name. default is
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
445 mpeg. */
5577
21c98b55a800 Replace deprecated guess_format() with av_guess_format().
stefano
parents: 5568
diff changeset
446 fmt = av_guess_format(NULL, filename, NULL);
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
447 if (!fmt) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
448 printf("Could not deduce output format from file extension: using MPEG.\n");
5577
21c98b55a800 Replace deprecated guess_format() with av_guess_format().
stefano
parents: 5568
diff changeset
449 fmt = av_guess_format("mpeg", NULL, NULL);
4794
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
450 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
451 if (!fmt) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
452 fprintf(stderr, "Could not find suitable output format\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
453 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
456 /* allocate the output media context */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
457 oc = avformat_alloc_context();
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
458 if (!oc) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
459 fprintf(stderr, "Memory error\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
460 exit(1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
461 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
462 oc->oformat = fmt;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
463 snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
464
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
465 /* add the audio and video streams using the default format codecs
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
466 and initialize the codecs */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
467 video_st = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
468 audio_st = NULL;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
469 if (fmt->video_codec != CODEC_ID_NONE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
470 video_st = add_video_stream(oc, fmt->video_codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
471 }
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
472 if (fmt->audio_codec != CODEC_ID_NONE) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
473 audio_st = add_audio_stream(oc, fmt->audio_codec);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
476 /* set the output parameters (must be done even if no
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
477 parameters). */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
478 if (av_set_parameters(oc, NULL) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
479 fprintf(stderr, "Invalid output format parameters\n");
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
480 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
483 dump_format(oc, 0, filename, 1);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
484
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
485 /* 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
486 video codecs and allocate the necessary encode buffers */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
487 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
488 open_video(oc, video_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
489 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
490 open_audio(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
491
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
492 /* open the output file, if needed */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
493 if (!(fmt->flags & AVFMT_NOFILE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
494 if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
495 fprintf(stderr, "Could not open '%s'\n", filename);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
496 exit(1);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
500 /* write the stream header, if any */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
501 av_write_header(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
502
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
503 for(;;) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
504 /* compute current audio and video time */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
505 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
506 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
507 else
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
508 audio_pts = 0.0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
509
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
510 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
511 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
512 else
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
513 video_pts = 0.0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
514
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
515 if ((!audio_st || audio_pts >= STREAM_DURATION) &&
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
516 (!video_st || video_pts >= STREAM_DURATION))
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
517 break;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
518
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
519 /* write interleaved audio and video frames */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
520 if (!video_st || (video_st && audio_st && audio_pts < video_pts)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
521 write_audio_frame(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
522 } else {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
523 write_video_frame(oc, video_st);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
527 /* write the trailer, if any. the trailer must be written
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
528 * before you close the CodecContexts open when you wrote the
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
529 * header; otherwise write_trailer may try to use memory that
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
530 * was freed on av_codec_close() */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
531 av_write_trailer(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
532
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
533 /* close each codec */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
534 if (video_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
535 close_video(oc, video_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
536 if (audio_st)
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
537 close_audio(oc, audio_st);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
538
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
539 /* free the streams */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
540 for(i = 0; i < oc->nb_streams; i++) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
541 av_freep(&oc->streams[i]->codec);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
542 av_freep(&oc->streams[i]);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
545 if (!(fmt->flags & AVFMT_NOFILE)) {
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
546 /* close the output file */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
547 url_fclose(oc->pb);
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
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
550 /* free the stream */
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
551 av_free(oc);
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
552
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
553 return 0;
50591c943aa3 Move output_example.c --> libavformat/output-example.c.
diego
parents:
diff changeset
554 }