yading@11
|
1 /*
|
yading@11
|
2 * muxing functions for use within FFmpeg
|
yading@11
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
yading@11
|
4 *
|
yading@11
|
5 * This file is part of FFmpeg.
|
yading@11
|
6 *
|
yading@11
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
9 * License as published by the Free Software Foundation; either
|
yading@11
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
11 *
|
yading@11
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
15 * Lesser General Public License for more details.
|
yading@11
|
16 *
|
yading@11
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
20 */
|
yading@11
|
21
|
yading@11
|
22 /* #define DEBUG */
|
yading@11
|
23
|
yading@11
|
24 #include "avformat.h"
|
yading@11
|
25 #include "avio_internal.h"
|
yading@11
|
26 #include "internal.h"
|
yading@11
|
27 #include "libavcodec/internal.h"
|
yading@11
|
28 #include "libavcodec/bytestream.h"
|
yading@11
|
29 #include "libavutil/opt.h"
|
yading@11
|
30 #include "libavutil/dict.h"
|
yading@11
|
31 #include "libavutil/pixdesc.h"
|
yading@11
|
32 #include "libavutil/timestamp.h"
|
yading@11
|
33 #include "metadata.h"
|
yading@11
|
34 #include "id3v2.h"
|
yading@11
|
35 #include "libavutil/avassert.h"
|
yading@11
|
36 #include "libavutil/avstring.h"
|
yading@11
|
37 #include "libavutil/mathematics.h"
|
yading@11
|
38 #include "libavutil/parseutils.h"
|
yading@11
|
39 #include "libavutil/time.h"
|
yading@11
|
40 #include "riff.h"
|
yading@11
|
41 #include "audiointerleave.h"
|
yading@11
|
42 #include "url.h"
|
yading@11
|
43 #include <stdarg.h>
|
yading@11
|
44 #if CONFIG_NETWORK
|
yading@11
|
45 #include "network.h"
|
yading@11
|
46 #endif
|
yading@11
|
47
|
yading@11
|
48 #undef NDEBUG
|
yading@11
|
49 #include <assert.h>
|
yading@11
|
50
|
yading@11
|
51 /**
|
yading@11
|
52 * @file
|
yading@11
|
53 * muxing functions for use within libavformat
|
yading@11
|
54 */
|
yading@11
|
55
|
yading@11
|
56 /* fraction handling */
|
yading@11
|
57
|
yading@11
|
58 /**
|
yading@11
|
59 * f = val + (num / den) + 0.5.
|
yading@11
|
60 *
|
yading@11
|
61 * 'num' is normalized so that it is such as 0 <= num < den.
|
yading@11
|
62 *
|
yading@11
|
63 * @param f fractional number
|
yading@11
|
64 * @param val integer value
|
yading@11
|
65 * @param num must be >= 0
|
yading@11
|
66 * @param den must be >= 1
|
yading@11
|
67 */
|
yading@11
|
68 static void frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
|
yading@11
|
69 {
|
yading@11
|
70 num += (den >> 1);
|
yading@11
|
71 if (num >= den) {
|
yading@11
|
72 val += num / den;
|
yading@11
|
73 num = num % den;
|
yading@11
|
74 }
|
yading@11
|
75 f->val = val;
|
yading@11
|
76 f->num = num;
|
yading@11
|
77 f->den = den;
|
yading@11
|
78 }
|
yading@11
|
79
|
yading@11
|
80 /**
|
yading@11
|
81 * Fractional addition to f: f = f + (incr / f->den).
|
yading@11
|
82 *
|
yading@11
|
83 * @param f fractional number
|
yading@11
|
84 * @param incr increment, can be positive or negative
|
yading@11
|
85 */
|
yading@11
|
86 static void frac_add(AVFrac *f, int64_t incr)
|
yading@11
|
87 {
|
yading@11
|
88 int64_t num, den;
|
yading@11
|
89
|
yading@11
|
90 num = f->num + incr;
|
yading@11
|
91 den = f->den;
|
yading@11
|
92 if (num < 0) {
|
yading@11
|
93 f->val += num / den;
|
yading@11
|
94 num = num % den;
|
yading@11
|
95 if (num < 0) {
|
yading@11
|
96 num += den;
|
yading@11
|
97 f->val--;
|
yading@11
|
98 }
|
yading@11
|
99 } else if (num >= den) {
|
yading@11
|
100 f->val += num / den;
|
yading@11
|
101 num = num % den;
|
yading@11
|
102 }
|
yading@11
|
103 f->num = num;
|
yading@11
|
104 }
|
yading@11
|
105
|
yading@11
|
106 AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precission)
|
yading@11
|
107 {
|
yading@11
|
108 AVRational q;
|
yading@11
|
109 int j;
|
yading@11
|
110
|
yading@11
|
111 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
|
yading@11
|
112 q = (AVRational){1, st->codec->sample_rate};
|
yading@11
|
113 } else {
|
yading@11
|
114 q = st->codec->time_base;
|
yading@11
|
115 }
|
yading@11
|
116 for (j=2; j<14; j+= 1+(j>2))
|
yading@11
|
117 while (q.den / q.num < min_precission && q.num % j == 0)
|
yading@11
|
118 q.num /= j;
|
yading@11
|
119 while (q.den / q.num < min_precission && q.den < (1<<24))
|
yading@11
|
120 q.den <<= 1;
|
yading@11
|
121
|
yading@11
|
122 return q;
|
yading@11
|
123 }
|
yading@11
|
124
|
yading@11
|
125 int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
|
yading@11
|
126 const char *format, const char *filename)
|
yading@11
|
127 {
|
yading@11
|
128 AVFormatContext *s = avformat_alloc_context();
|
yading@11
|
129 int ret = 0;
|
yading@11
|
130
|
yading@11
|
131 *avctx = NULL;
|
yading@11
|
132 if (!s)
|
yading@11
|
133 goto nomem;
|
yading@11
|
134
|
yading@11
|
135 if (!oformat) {
|
yading@11
|
136 if (format) {
|
yading@11
|
137 oformat = av_guess_format(format, NULL, NULL);
|
yading@11
|
138 if (!oformat) {
|
yading@11
|
139 av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
|
yading@11
|
140 ret = AVERROR(EINVAL);
|
yading@11
|
141 goto error;
|
yading@11
|
142 }
|
yading@11
|
143 } else {
|
yading@11
|
144 oformat = av_guess_format(NULL, filename, NULL);
|
yading@11
|
145 if (!oformat) {
|
yading@11
|
146 ret = AVERROR(EINVAL);
|
yading@11
|
147 av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
|
yading@11
|
148 filename);
|
yading@11
|
149 goto error;
|
yading@11
|
150 }
|
yading@11
|
151 }
|
yading@11
|
152 }
|
yading@11
|
153
|
yading@11
|
154 s->oformat = oformat;
|
yading@11
|
155 if (s->oformat->priv_data_size > 0) {
|
yading@11
|
156 s->priv_data = av_mallocz(s->oformat->priv_data_size);
|
yading@11
|
157 if (!s->priv_data)
|
yading@11
|
158 goto nomem;
|
yading@11
|
159 if (s->oformat->priv_class) {
|
yading@11
|
160 *(const AVClass**)s->priv_data= s->oformat->priv_class;
|
yading@11
|
161 av_opt_set_defaults(s->priv_data);
|
yading@11
|
162 }
|
yading@11
|
163 } else
|
yading@11
|
164 s->priv_data = NULL;
|
yading@11
|
165
|
yading@11
|
166 if (filename)
|
yading@11
|
167 av_strlcpy(s->filename, filename, sizeof(s->filename));
|
yading@11
|
168 *avctx = s;
|
yading@11
|
169 return 0;
|
yading@11
|
170 nomem:
|
yading@11
|
171 av_log(s, AV_LOG_ERROR, "Out of memory\n");
|
yading@11
|
172 ret = AVERROR(ENOMEM);
|
yading@11
|
173 error:
|
yading@11
|
174 avformat_free_context(s);
|
yading@11
|
175 return ret;
|
yading@11
|
176 }
|
yading@11
|
177
|
yading@11
|
178 #if FF_API_ALLOC_OUTPUT_CONTEXT
|
yading@11
|
179 AVFormatContext *avformat_alloc_output_context(const char *format,
|
yading@11
|
180 AVOutputFormat *oformat, const char *filename)
|
yading@11
|
181 {
|
yading@11
|
182 AVFormatContext *avctx;
|
yading@11
|
183 int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
|
yading@11
|
184 return ret < 0 ? NULL : avctx;
|
yading@11
|
185 }
|
yading@11
|
186 #endif
|
yading@11
|
187
|
yading@11
|
188 static int validate_codec_tag(AVFormatContext *s, AVStream *st)
|
yading@11
|
189 {
|
yading@11
|
190 const AVCodecTag *avctag;
|
yading@11
|
191 int n;
|
yading@11
|
192 enum AVCodecID id = AV_CODEC_ID_NONE;
|
yading@11
|
193 unsigned int tag = 0;
|
yading@11
|
194
|
yading@11
|
195 /**
|
yading@11
|
196 * Check that tag + id is in the table
|
yading@11
|
197 * If neither is in the table -> OK
|
yading@11
|
198 * If tag is in the table with another id -> FAIL
|
yading@11
|
199 * If id is in the table with another tag -> FAIL unless strict < normal
|
yading@11
|
200 */
|
yading@11
|
201 for (n = 0; s->oformat->codec_tag[n]; n++) {
|
yading@11
|
202 avctag = s->oformat->codec_tag[n];
|
yading@11
|
203 while (avctag->id != AV_CODEC_ID_NONE) {
|
yading@11
|
204 if (avpriv_toupper4(avctag->tag) == avpriv_toupper4(st->codec->codec_tag)) {
|
yading@11
|
205 id = avctag->id;
|
yading@11
|
206 if (id == st->codec->codec_id)
|
yading@11
|
207 return 1;
|
yading@11
|
208 }
|
yading@11
|
209 if (avctag->id == st->codec->codec_id)
|
yading@11
|
210 tag = avctag->tag;
|
yading@11
|
211 avctag++;
|
yading@11
|
212 }
|
yading@11
|
213 }
|
yading@11
|
214 if (id != AV_CODEC_ID_NONE)
|
yading@11
|
215 return 0;
|
yading@11
|
216 if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
|
yading@11
|
217 return 0;
|
yading@11
|
218 return 1;
|
yading@11
|
219 }
|
yading@11
|
220
|
yading@11
|
221
|
yading@11
|
222 static int init_muxer(AVFormatContext *s, AVDictionary **options)
|
yading@11
|
223 {
|
yading@11
|
224 int ret = 0, i;
|
yading@11
|
225 AVStream *st;
|
yading@11
|
226 AVDictionary *tmp = NULL;
|
yading@11
|
227 AVCodecContext *codec = NULL;
|
yading@11
|
228 AVOutputFormat *of = s->oformat;
|
yading@11
|
229
|
yading@11
|
230 if (options)
|
yading@11
|
231 av_dict_copy(&tmp, *options, 0);
|
yading@11
|
232
|
yading@11
|
233 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
|
yading@11
|
234 goto fail;
|
yading@11
|
235 if (s->priv_data && s->oformat->priv_class && *(const AVClass**)s->priv_data==s->oformat->priv_class &&
|
yading@11
|
236 (ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
|
yading@11
|
237 goto fail;
|
yading@11
|
238
|
yading@11
|
239 // some sanity checks
|
yading@11
|
240 if (s->nb_streams == 0 && !(of->flags & AVFMT_NOSTREAMS)) {
|
yading@11
|
241 av_log(s, AV_LOG_ERROR, "no streams\n");
|
yading@11
|
242 ret = AVERROR(EINVAL);
|
yading@11
|
243 goto fail;
|
yading@11
|
244 }
|
yading@11
|
245
|
yading@11
|
246 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
247 st = s->streams[i];
|
yading@11
|
248 codec = st->codec;
|
yading@11
|
249
|
yading@11
|
250 switch (codec->codec_type) {
|
yading@11
|
251 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
252 if (codec->sample_rate <= 0) {
|
yading@11
|
253 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
|
yading@11
|
254 ret = AVERROR(EINVAL);
|
yading@11
|
255 goto fail;
|
yading@11
|
256 }
|
yading@11
|
257 if (!codec->block_align)
|
yading@11
|
258 codec->block_align = codec->channels *
|
yading@11
|
259 av_get_bits_per_sample(codec->codec_id) >> 3;
|
yading@11
|
260 break;
|
yading@11
|
261 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
262 if (codec->time_base.num <= 0 ||
|
yading@11
|
263 codec->time_base.den <= 0) { //FIXME audio too?
|
yading@11
|
264 av_log(s, AV_LOG_ERROR, "time base not set\n");
|
yading@11
|
265 ret = AVERROR(EINVAL);
|
yading@11
|
266 goto fail;
|
yading@11
|
267 }
|
yading@11
|
268
|
yading@11
|
269 if ((codec->width <= 0 || codec->height <= 0) &&
|
yading@11
|
270 !(of->flags & AVFMT_NODIMENSIONS)) {
|
yading@11
|
271 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
|
yading@11
|
272 ret = AVERROR(EINVAL);
|
yading@11
|
273 goto fail;
|
yading@11
|
274 }
|
yading@11
|
275 if (av_cmp_q(st->sample_aspect_ratio, codec->sample_aspect_ratio)
|
yading@11
|
276 && FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
|
yading@11
|
277 ) {
|
yading@11
|
278 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between muxer "
|
yading@11
|
279 "(%d/%d) and encoder layer (%d/%d)\n",
|
yading@11
|
280 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
|
yading@11
|
281 codec->sample_aspect_ratio.num,
|
yading@11
|
282 codec->sample_aspect_ratio.den);
|
yading@11
|
283 ret = AVERROR(EINVAL);
|
yading@11
|
284 goto fail;
|
yading@11
|
285 }
|
yading@11
|
286 break;
|
yading@11
|
287 }
|
yading@11
|
288
|
yading@11
|
289 if (of->codec_tag) {
|
yading@11
|
290 if ( codec->codec_tag
|
yading@11
|
291 && codec->codec_id == AV_CODEC_ID_RAWVIDEO
|
yading@11
|
292 && ( av_codec_get_tag(of->codec_tag, codec->codec_id) == 0
|
yading@11
|
293 || av_codec_get_tag(of->codec_tag, codec->codec_id) == MKTAG('r', 'a', 'w', ' '))
|
yading@11
|
294 && !validate_codec_tag(s, st)) {
|
yading@11
|
295 // the current rawvideo encoding system ends up setting
|
yading@11
|
296 // the wrong codec_tag for avi/mov, we override it here
|
yading@11
|
297 codec->codec_tag = 0;
|
yading@11
|
298 }
|
yading@11
|
299 if (codec->codec_tag) {
|
yading@11
|
300 if (!validate_codec_tag(s, st)) {
|
yading@11
|
301 char tagbuf[32], cortag[32];
|
yading@11
|
302 av_get_codec_tag_string(tagbuf, sizeof(tagbuf), codec->codec_tag);
|
yading@11
|
303 av_get_codec_tag_string(cortag, sizeof(cortag), av_codec_get_tag(s->oformat->codec_tag, codec->codec_id));
|
yading@11
|
304 av_log(s, AV_LOG_ERROR,
|
yading@11
|
305 "Tag %s/0x%08x incompatible with output codec id '%d' (%s)\n",
|
yading@11
|
306 tagbuf, codec->codec_tag, codec->codec_id, cortag);
|
yading@11
|
307 ret = AVERROR_INVALIDDATA;
|
yading@11
|
308 goto fail;
|
yading@11
|
309 }
|
yading@11
|
310 } else
|
yading@11
|
311 codec->codec_tag = av_codec_get_tag(of->codec_tag, codec->codec_id);
|
yading@11
|
312 }
|
yading@11
|
313
|
yading@11
|
314 if (of->flags & AVFMT_GLOBALHEADER &&
|
yading@11
|
315 !(codec->flags & CODEC_FLAG_GLOBAL_HEADER))
|
yading@11
|
316 av_log(s, AV_LOG_WARNING,
|
yading@11
|
317 "Codec for stream %d does not use global headers "
|
yading@11
|
318 "but container format requires global headers\n", i);
|
yading@11
|
319 }
|
yading@11
|
320
|
yading@11
|
321 if (!s->priv_data && of->priv_data_size > 0) {
|
yading@11
|
322 s->priv_data = av_mallocz(of->priv_data_size);
|
yading@11
|
323 if (!s->priv_data) {
|
yading@11
|
324 ret = AVERROR(ENOMEM);
|
yading@11
|
325 goto fail;
|
yading@11
|
326 }
|
yading@11
|
327 if (of->priv_class) {
|
yading@11
|
328 *(const AVClass **)s->priv_data = of->priv_class;
|
yading@11
|
329 av_opt_set_defaults(s->priv_data);
|
yading@11
|
330 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
|
yading@11
|
331 goto fail;
|
yading@11
|
332 }
|
yading@11
|
333 }
|
yading@11
|
334
|
yading@11
|
335 /* set muxer identification string */
|
yading@11
|
336 if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
|
yading@11
|
337 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
|
yading@11
|
338 }
|
yading@11
|
339
|
yading@11
|
340 if (options) {
|
yading@11
|
341 av_dict_free(options);
|
yading@11
|
342 *options = tmp;
|
yading@11
|
343 }
|
yading@11
|
344
|
yading@11
|
345 return 0;
|
yading@11
|
346
|
yading@11
|
347 fail:
|
yading@11
|
348 av_dict_free(&tmp);
|
yading@11
|
349 return ret;
|
yading@11
|
350 }
|
yading@11
|
351
|
yading@11
|
352 static int init_pts(AVFormatContext *s)
|
yading@11
|
353 {
|
yading@11
|
354 int i;
|
yading@11
|
355 AVStream *st;
|
yading@11
|
356
|
yading@11
|
357 /* init PTS generation */
|
yading@11
|
358 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
359 int64_t den = AV_NOPTS_VALUE;
|
yading@11
|
360 st = s->streams[i];
|
yading@11
|
361
|
yading@11
|
362 switch (st->codec->codec_type) {
|
yading@11
|
363 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
364 den = (int64_t)st->time_base.num * st->codec->sample_rate;
|
yading@11
|
365 break;
|
yading@11
|
366 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
367 den = (int64_t)st->time_base.num * st->codec->time_base.den;
|
yading@11
|
368 break;
|
yading@11
|
369 default:
|
yading@11
|
370 break;
|
yading@11
|
371 }
|
yading@11
|
372 if (den != AV_NOPTS_VALUE) {
|
yading@11
|
373 if (den <= 0)
|
yading@11
|
374 return AVERROR_INVALIDDATA;
|
yading@11
|
375
|
yading@11
|
376 frac_init(&st->pts, 0, 0, den);
|
yading@11
|
377 }
|
yading@11
|
378 }
|
yading@11
|
379
|
yading@11
|
380 return 0;
|
yading@11
|
381 }
|
yading@11
|
382
|
yading@11
|
383 int avformat_write_header(AVFormatContext *s, AVDictionary **options)
|
yading@11
|
384 {
|
yading@11
|
385 int ret = 0;
|
yading@11
|
386
|
yading@11
|
387 if (ret = init_muxer(s, options))
|
yading@11
|
388 return ret;
|
yading@11
|
389
|
yading@11
|
390 if (s->oformat->write_header) {
|
yading@11
|
391 ret = s->oformat->write_header(s);
|
yading@11
|
392 if (ret >= 0 && s->pb && s->pb->error < 0)
|
yading@11
|
393 ret = s->pb->error;
|
yading@11
|
394 if (ret < 0)
|
yading@11
|
395 return ret;
|
yading@11
|
396 }
|
yading@11
|
397
|
yading@11
|
398 if ((ret = init_pts(s)) < 0)
|
yading@11
|
399 return ret;
|
yading@11
|
400
|
yading@11
|
401 return 0;
|
yading@11
|
402 }
|
yading@11
|
403
|
yading@11
|
404 //FIXME merge with compute_pkt_fields
|
yading@11
|
405 static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
|
yading@11
|
406 {
|
yading@11
|
407 int delay = FFMAX(st->codec->has_b_frames, st->codec->max_b_frames > 0);
|
yading@11
|
408 int num, den, frame_size, i;
|
yading@11
|
409
|
yading@11
|
410 av_dlog(s, "compute_pkt_fields2: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
|
yading@11
|
411 av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), delay, pkt->size, pkt->stream_index);
|
yading@11
|
412
|
yading@11
|
413 /* duration field */
|
yading@11
|
414 if (pkt->duration == 0) {
|
yading@11
|
415 ff_compute_frame_duration(&num, &den, st, NULL, pkt);
|
yading@11
|
416 if (den && num) {
|
yading@11
|
417 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
|
yading@11
|
418 }
|
yading@11
|
419 }
|
yading@11
|
420
|
yading@11
|
421 if (pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay == 0)
|
yading@11
|
422 pkt->pts = pkt->dts;
|
yading@11
|
423
|
yading@11
|
424 //XXX/FIXME this is a temporary hack until all encoders output pts
|
yading@11
|
425 if ((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay) {
|
yading@11
|
426 static int warned;
|
yading@11
|
427 if (!warned) {
|
yading@11
|
428 av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
|
yading@11
|
429 warned = 1;
|
yading@11
|
430 }
|
yading@11
|
431 pkt->dts =
|
yading@11
|
432 // pkt->pts= st->cur_dts;
|
yading@11
|
433 pkt->pts = st->pts.val;
|
yading@11
|
434 }
|
yading@11
|
435
|
yading@11
|
436 //calculate dts from pts
|
yading@11
|
437 if (pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
|
yading@11
|
438 st->pts_buffer[0] = pkt->pts;
|
yading@11
|
439 for (i = 1; i < delay + 1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
|
yading@11
|
440 st->pts_buffer[i] = pkt->pts + (i - delay - 1) * pkt->duration;
|
yading@11
|
441 for (i = 0; i<delay && st->pts_buffer[i] > st->pts_buffer[i + 1]; i++)
|
yading@11
|
442 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i + 1]);
|
yading@11
|
443
|
yading@11
|
444 pkt->dts = st->pts_buffer[0];
|
yading@11
|
445 }
|
yading@11
|
446
|
yading@11
|
447 if (st->cur_dts && st->cur_dts != AV_NOPTS_VALUE &&
|
yading@11
|
448 ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) &&
|
yading@11
|
449 st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)) {
|
yading@11
|
450 av_log(s, AV_LOG_ERROR,
|
yading@11
|
451 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
|
yading@11
|
452 st->index, av_ts2str(st->cur_dts), av_ts2str(pkt->dts));
|
yading@11
|
453 return AVERROR(EINVAL);
|
yading@11
|
454 }
|
yading@11
|
455 if (pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts) {
|
yading@11
|
456 av_log(s, AV_LOG_ERROR, "pts (%s) < dts (%s) in stream %d\n",
|
yading@11
|
457 av_ts2str(pkt->pts), av_ts2str(pkt->dts), st->index);
|
yading@11
|
458 return AVERROR(EINVAL);
|
yading@11
|
459 }
|
yading@11
|
460
|
yading@11
|
461 av_dlog(s, "av_write_frame: pts2:%s dts2:%s\n",
|
yading@11
|
462 av_ts2str(pkt->pts), av_ts2str(pkt->dts));
|
yading@11
|
463 st->cur_dts = pkt->dts;
|
yading@11
|
464 st->pts.val = pkt->dts;
|
yading@11
|
465
|
yading@11
|
466 /* update pts */
|
yading@11
|
467 switch (st->codec->codec_type) {
|
yading@11
|
468 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
469 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 1);
|
yading@11
|
470
|
yading@11
|
471 /* HACK/FIXME, we skip the initial 0 size packets as they are most
|
yading@11
|
472 * likely equal to the encoder delay, but it would be better if we
|
yading@11
|
473 * had the real timestamps from the encoder */
|
yading@11
|
474 if (frame_size >= 0 && (pkt->size || st->pts.num != st->pts.den >> 1 || st->pts.val)) {
|
yading@11
|
475 frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
|
yading@11
|
476 }
|
yading@11
|
477 break;
|
yading@11
|
478 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
479 frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
|
yading@11
|
480 break;
|
yading@11
|
481 default:
|
yading@11
|
482 break;
|
yading@11
|
483 }
|
yading@11
|
484 return 0;
|
yading@11
|
485 }
|
yading@11
|
486
|
yading@11
|
487 /**
|
yading@11
|
488 * Move side data from payload to internal struct, call muxer, and restore
|
yading@11
|
489 * original packet.
|
yading@11
|
490 */
|
yading@11
|
491 static inline int split_write_packet(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
492 {
|
yading@11
|
493 int ret, did_split;
|
yading@11
|
494
|
yading@11
|
495 did_split = av_packet_split_side_data(pkt);
|
yading@11
|
496 ret = s->oformat->write_packet(s, pkt);
|
yading@11
|
497 if (s->flush_packets && s->pb && s->pb->error >= 0)
|
yading@11
|
498 avio_flush(s->pb);
|
yading@11
|
499 if (did_split)
|
yading@11
|
500 av_packet_merge_side_data(pkt);
|
yading@11
|
501 return ret;
|
yading@11
|
502 }
|
yading@11
|
503
|
yading@11
|
504 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
505 {
|
yading@11
|
506 int ret;
|
yading@11
|
507
|
yading@11
|
508 if (!pkt) {
|
yading@11
|
509 if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
|
yading@11
|
510 ret = s->oformat->write_packet(s, NULL);
|
yading@11
|
511 if (s->flush_packets && s->pb && s->pb->error >= 0)
|
yading@11
|
512 avio_flush(s->pb);
|
yading@11
|
513 if (ret >= 0 && s->pb && s->pb->error < 0)
|
yading@11
|
514 ret = s->pb->error;
|
yading@11
|
515 return ret;
|
yading@11
|
516 }
|
yading@11
|
517 return 1;
|
yading@11
|
518 }
|
yading@11
|
519
|
yading@11
|
520 ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
|
yading@11
|
521
|
yading@11
|
522 if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
yading@11
|
523 return ret;
|
yading@11
|
524
|
yading@11
|
525 ret = split_write_packet(s, pkt);
|
yading@11
|
526 if (ret >= 0 && s->pb && s->pb->error < 0)
|
yading@11
|
527 ret = s->pb->error;
|
yading@11
|
528
|
yading@11
|
529 if (ret >= 0)
|
yading@11
|
530 s->streams[pkt->stream_index]->nb_frames++;
|
yading@11
|
531 return ret;
|
yading@11
|
532 }
|
yading@11
|
533
|
yading@11
|
534 #define CHUNK_START 0x1000
|
yading@11
|
535
|
yading@11
|
536 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
|
yading@11
|
537 int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
|
yading@11
|
538 {
|
yading@11
|
539 AVPacketList **next_point, *this_pktl;
|
yading@11
|
540 AVStream *st = s->streams[pkt->stream_index];
|
yading@11
|
541 int chunked = s->max_chunk_size || s->max_chunk_duration;
|
yading@11
|
542
|
yading@11
|
543 this_pktl = av_mallocz(sizeof(AVPacketList));
|
yading@11
|
544 if (!this_pktl)
|
yading@11
|
545 return AVERROR(ENOMEM);
|
yading@11
|
546 this_pktl->pkt = *pkt;
|
yading@11
|
547 #if FF_API_DESTRUCT_PACKET
|
yading@11
|
548 pkt->destruct = NULL; // do not free original but only the copy
|
yading@11
|
549 #endif
|
yading@11
|
550 pkt->buf = NULL;
|
yading@11
|
551 av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-allocated memory
|
yading@11
|
552
|
yading@11
|
553 if (s->streams[pkt->stream_index]->last_in_packet_buffer) {
|
yading@11
|
554 next_point = &(st->last_in_packet_buffer->next);
|
yading@11
|
555 } else {
|
yading@11
|
556 next_point = &s->packet_buffer;
|
yading@11
|
557 }
|
yading@11
|
558
|
yading@11
|
559 if (chunked) {
|
yading@11
|
560 uint64_t max= av_rescale_q_rnd(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base, AV_ROUND_UP);
|
yading@11
|
561 st->interleaver_chunk_size += pkt->size;
|
yading@11
|
562 st->interleaver_chunk_duration += pkt->duration;
|
yading@11
|
563 if ( (s->max_chunk_size && st->interleaver_chunk_size > s->max_chunk_size)
|
yading@11
|
564 || (max && st->interleaver_chunk_duration > max)) {
|
yading@11
|
565 st->interleaver_chunk_size = 0;
|
yading@11
|
566 this_pktl->pkt.flags |= CHUNK_START;
|
yading@11
|
567 if (max && st->interleaver_chunk_duration > max) {
|
yading@11
|
568 int64_t syncoffset = (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)*max/2;
|
yading@11
|
569 int64_t syncto = av_rescale(pkt->dts + syncoffset, 1, max)*max - syncoffset;
|
yading@11
|
570
|
yading@11
|
571 st->interleaver_chunk_duration += (pkt->dts - syncto)/8 - max;
|
yading@11
|
572 } else
|
yading@11
|
573 st->interleaver_chunk_duration = 0;
|
yading@11
|
574 }
|
yading@11
|
575 }
|
yading@11
|
576 if (*next_point) {
|
yading@11
|
577 if (chunked && !(this_pktl->pkt.flags & CHUNK_START))
|
yading@11
|
578 goto next_non_null;
|
yading@11
|
579
|
yading@11
|
580 if (compare(s, &s->packet_buffer_end->pkt, pkt)) {
|
yading@11
|
581 while ( *next_point
|
yading@11
|
582 && ((chunked && !((*next_point)->pkt.flags&CHUNK_START))
|
yading@11
|
583 || !compare(s, &(*next_point)->pkt, pkt)))
|
yading@11
|
584 next_point = &(*next_point)->next;
|
yading@11
|
585 if (*next_point)
|
yading@11
|
586 goto next_non_null;
|
yading@11
|
587 } else {
|
yading@11
|
588 next_point = &(s->packet_buffer_end->next);
|
yading@11
|
589 }
|
yading@11
|
590 }
|
yading@11
|
591 av_assert1(!*next_point);
|
yading@11
|
592
|
yading@11
|
593 s->packet_buffer_end = this_pktl;
|
yading@11
|
594 next_non_null:
|
yading@11
|
595
|
yading@11
|
596 this_pktl->next = *next_point;
|
yading@11
|
597
|
yading@11
|
598 s->streams[pkt->stream_index]->last_in_packet_buffer =
|
yading@11
|
599 *next_point = this_pktl;
|
yading@11
|
600 return 0;
|
yading@11
|
601 }
|
yading@11
|
602
|
yading@11
|
603 static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
|
yading@11
|
604 {
|
yading@11
|
605 AVStream *st = s->streams[pkt->stream_index];
|
yading@11
|
606 AVStream *st2 = s->streams[next->stream_index];
|
yading@11
|
607 int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
|
yading@11
|
608 st->time_base);
|
yading@11
|
609 if (s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))) {
|
yading@11
|
610 int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
|
yading@11
|
611 int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
|
yading@11
|
612 if (ts == ts2) {
|
yading@11
|
613 ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
|
yading@11
|
614 -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
|
yading@11
|
615 ts2=0;
|
yading@11
|
616 }
|
yading@11
|
617 comp= (ts>ts2) - (ts<ts2);
|
yading@11
|
618 }
|
yading@11
|
619
|
yading@11
|
620 if (comp == 0)
|
yading@11
|
621 return pkt->stream_index < next->stream_index;
|
yading@11
|
622 return comp > 0;
|
yading@11
|
623 }
|
yading@11
|
624
|
yading@11
|
625 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
|
yading@11
|
626 AVPacket *pkt, int flush)
|
yading@11
|
627 {
|
yading@11
|
628 AVPacketList *pktl;
|
yading@11
|
629 int stream_count = 0, noninterleaved_count = 0;
|
yading@11
|
630 int64_t delta_dts_max = 0;
|
yading@11
|
631 int i, ret;
|
yading@11
|
632
|
yading@11
|
633 if (pkt) {
|
yading@11
|
634 ret = ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
|
yading@11
|
635 if (ret < 0)
|
yading@11
|
636 return ret;
|
yading@11
|
637 }
|
yading@11
|
638
|
yading@11
|
639 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
640 if (s->streams[i]->last_in_packet_buffer) {
|
yading@11
|
641 ++stream_count;
|
yading@11
|
642 } else if (s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
yading@11
|
643 ++noninterleaved_count;
|
yading@11
|
644 }
|
yading@11
|
645 }
|
yading@11
|
646
|
yading@11
|
647 if (s->nb_streams == stream_count) {
|
yading@11
|
648 flush = 1;
|
yading@11
|
649 } else if (!flush) {
|
yading@11
|
650 for (i=0; i < s->nb_streams; i++) {
|
yading@11
|
651 if (s->streams[i]->last_in_packet_buffer) {
|
yading@11
|
652 int64_t delta_dts =
|
yading@11
|
653 av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
|
yading@11
|
654 s->streams[i]->time_base,
|
yading@11
|
655 AV_TIME_BASE_Q) -
|
yading@11
|
656 av_rescale_q(s->packet_buffer->pkt.dts,
|
yading@11
|
657 s->streams[s->packet_buffer->pkt.stream_index]->time_base,
|
yading@11
|
658 AV_TIME_BASE_Q);
|
yading@11
|
659 delta_dts_max= FFMAX(delta_dts_max, delta_dts);
|
yading@11
|
660 }
|
yading@11
|
661 }
|
yading@11
|
662 if (s->nb_streams == stream_count+noninterleaved_count &&
|
yading@11
|
663 delta_dts_max > 20*AV_TIME_BASE) {
|
yading@11
|
664 av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
|
yading@11
|
665 flush = 1;
|
yading@11
|
666 }
|
yading@11
|
667 }
|
yading@11
|
668 if (stream_count && flush) {
|
yading@11
|
669 AVStream *st;
|
yading@11
|
670 pktl = s->packet_buffer;
|
yading@11
|
671 *out = pktl->pkt;
|
yading@11
|
672 st = s->streams[out->stream_index];
|
yading@11
|
673
|
yading@11
|
674 s->packet_buffer = pktl->next;
|
yading@11
|
675 if (!s->packet_buffer)
|
yading@11
|
676 s->packet_buffer_end = NULL;
|
yading@11
|
677
|
yading@11
|
678 if (st->last_in_packet_buffer == pktl)
|
yading@11
|
679 st->last_in_packet_buffer = NULL;
|
yading@11
|
680 av_freep(&pktl);
|
yading@11
|
681
|
yading@11
|
682 if (s->avoid_negative_ts > 0) {
|
yading@11
|
683 if (out->dts != AV_NOPTS_VALUE) {
|
yading@11
|
684 if (!st->mux_ts_offset && out->dts < 0) {
|
yading@11
|
685 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
686 s->streams[i]->mux_ts_offset =
|
yading@11
|
687 av_rescale_q_rnd(-out->dts,
|
yading@11
|
688 st->time_base,
|
yading@11
|
689 s->streams[i]->time_base,
|
yading@11
|
690 AV_ROUND_UP);
|
yading@11
|
691 }
|
yading@11
|
692 }
|
yading@11
|
693 out->dts += st->mux_ts_offset;
|
yading@11
|
694 }
|
yading@11
|
695 if (out->pts != AV_NOPTS_VALUE)
|
yading@11
|
696 out->pts += st->mux_ts_offset;
|
yading@11
|
697 }
|
yading@11
|
698
|
yading@11
|
699 return 1;
|
yading@11
|
700 } else {
|
yading@11
|
701 av_init_packet(out);
|
yading@11
|
702 return 0;
|
yading@11
|
703 }
|
yading@11
|
704 }
|
yading@11
|
705
|
yading@11
|
706 /**
|
yading@11
|
707 * Interleave an AVPacket correctly so it can be muxed.
|
yading@11
|
708 * @param out the interleaved packet will be output here
|
yading@11
|
709 * @param in the input packet
|
yading@11
|
710 * @param flush 1 if no further packets are available as input and all
|
yading@11
|
711 * remaining packets should be output
|
yading@11
|
712 * @return 1 if a packet was output, 0 if no packet could be output,
|
yading@11
|
713 * < 0 if an error occurred
|
yading@11
|
714 */
|
yading@11
|
715 static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush)
|
yading@11
|
716 {
|
yading@11
|
717 if (s->oformat->interleave_packet) {
|
yading@11
|
718 int ret = s->oformat->interleave_packet(s, out, in, flush);
|
yading@11
|
719 if (in)
|
yading@11
|
720 av_free_packet(in);
|
yading@11
|
721 return ret;
|
yading@11
|
722 } else
|
yading@11
|
723 return ff_interleave_packet_per_dts(s, out, in, flush);
|
yading@11
|
724 }
|
yading@11
|
725
|
yading@11
|
726 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
727 {
|
yading@11
|
728 int ret, flush = 0;
|
yading@11
|
729
|
yading@11
|
730 if (pkt) {
|
yading@11
|
731 AVStream *st = s->streams[pkt->stream_index];
|
yading@11
|
732
|
yading@11
|
733 //FIXME/XXX/HACK drop zero sized packets
|
yading@11
|
734 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size == 0)
|
yading@11
|
735 return 0;
|
yading@11
|
736
|
yading@11
|
737 av_dlog(s, "av_interleaved_write_frame size:%d dts:%s pts:%s\n",
|
yading@11
|
738 pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts));
|
yading@11
|
739 if ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
yading@11
|
740 return ret;
|
yading@11
|
741
|
yading@11
|
742 if (pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
yading@11
|
743 return AVERROR(EINVAL);
|
yading@11
|
744 } else {
|
yading@11
|
745 av_dlog(s, "av_interleaved_write_frame FLUSH\n");
|
yading@11
|
746 flush = 1;
|
yading@11
|
747 }
|
yading@11
|
748
|
yading@11
|
749 for (;; ) {
|
yading@11
|
750 AVPacket opkt;
|
yading@11
|
751 int ret = interleave_packet(s, &opkt, pkt, flush);
|
yading@11
|
752 if (ret <= 0) //FIXME cleanup needed for ret<0 ?
|
yading@11
|
753 return ret;
|
yading@11
|
754
|
yading@11
|
755 ret = split_write_packet(s, &opkt);
|
yading@11
|
756 if (ret >= 0)
|
yading@11
|
757 s->streams[opkt.stream_index]->nb_frames++;
|
yading@11
|
758
|
yading@11
|
759 av_free_packet(&opkt);
|
yading@11
|
760 pkt = NULL;
|
yading@11
|
761
|
yading@11
|
762 if (ret < 0)
|
yading@11
|
763 return ret;
|
yading@11
|
764 if(s->pb && s->pb->error)
|
yading@11
|
765 return s->pb->error;
|
yading@11
|
766 }
|
yading@11
|
767 }
|
yading@11
|
768
|
yading@11
|
769 int av_write_trailer(AVFormatContext *s)
|
yading@11
|
770 {
|
yading@11
|
771 int ret, i;
|
yading@11
|
772
|
yading@11
|
773 for (;; ) {
|
yading@11
|
774 AVPacket pkt;
|
yading@11
|
775 ret = interleave_packet(s, &pkt, NULL, 1);
|
yading@11
|
776 if (ret < 0) //FIXME cleanup needed for ret<0 ?
|
yading@11
|
777 goto fail;
|
yading@11
|
778 if (!ret)
|
yading@11
|
779 break;
|
yading@11
|
780
|
yading@11
|
781 ret = split_write_packet(s, &pkt);
|
yading@11
|
782 if (ret >= 0)
|
yading@11
|
783 s->streams[pkt.stream_index]->nb_frames++;
|
yading@11
|
784
|
yading@11
|
785 av_free_packet(&pkt);
|
yading@11
|
786
|
yading@11
|
787 if (ret < 0)
|
yading@11
|
788 goto fail;
|
yading@11
|
789 if(s->pb && s->pb->error)
|
yading@11
|
790 goto fail;
|
yading@11
|
791 }
|
yading@11
|
792
|
yading@11
|
793 if (s->oformat->write_trailer)
|
yading@11
|
794 ret = s->oformat->write_trailer(s);
|
yading@11
|
795
|
yading@11
|
796 fail:
|
yading@11
|
797 if (s->pb)
|
yading@11
|
798 avio_flush(s->pb);
|
yading@11
|
799 if (ret == 0)
|
yading@11
|
800 ret = s->pb ? s->pb->error : 0;
|
yading@11
|
801 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
802 av_freep(&s->streams[i]->priv_data);
|
yading@11
|
803 av_freep(&s->streams[i]->index_entries);
|
yading@11
|
804 }
|
yading@11
|
805 if (s->oformat->priv_class)
|
yading@11
|
806 av_opt_free(s->priv_data);
|
yading@11
|
807 av_freep(&s->priv_data);
|
yading@11
|
808 return ret;
|
yading@11
|
809 }
|
yading@11
|
810
|
yading@11
|
811 int av_get_output_timestamp(struct AVFormatContext *s, int stream,
|
yading@11
|
812 int64_t *dts, int64_t *wall)
|
yading@11
|
813 {
|
yading@11
|
814 if (!s->oformat || !s->oformat->get_output_timestamp)
|
yading@11
|
815 return AVERROR(ENOSYS);
|
yading@11
|
816 s->oformat->get_output_timestamp(s, stream, dts, wall);
|
yading@11
|
817 return 0;
|
yading@11
|
818 }
|