annotate output-example.c @ 6193:da9998b48dff libavformat

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