annotate output-example.c @ 6158:4d1d3e0ba6d7 libavformat

Fix failure in av_read_frame on timestamp rollover. Patch by Stephen Dredge, sdredge A tpg com au
author cehoyos
date Tue, 22 Jun 2010 08:48:28 +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 }