2
* various utility functions for use within Libav
3
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5
* This file is part of Libav.
7
* Libav is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
12
* Libav is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
#include "avio_internal.h"
27
#include "libavcodec/internal.h"
28
#include "libavutil/opt.h"
29
#include "libavutil/dict.h"
30
#include "libavutil/pixdesc.h"
33
#include "libavutil/avstring.h"
35
#include "audiointerleave.h"
50
* various utility functions for use within Libav
53
unsigned avformat_version(void)
55
return LIBAVFORMAT_VERSION_INT;
58
const char *avformat_configuration(void)
60
return LIBAV_CONFIGURATION;
63
const char *avformat_license(void)
65
#define LICENSE_PREFIX "libavformat license: "
66
return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
69
/* fraction handling */
72
* f = val + (num / den) + 0.5.
74
* 'num' is normalized so that it is such as 0 <= num < den.
76
* @param f fractional number
77
* @param val integer value
78
* @param num must be >= 0
79
* @param den must be >= 1
81
static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
94
* Fractional addition to f: f = f + (incr / f->den).
96
* @param f fractional number
97
* @param incr increment, can be positive or negative
99
static void av_frac_add(AVFrac *f, int64_t incr)
112
} else if (num >= den) {
119
/** head of registered input format linked list */
120
static AVInputFormat *first_iformat = NULL;
121
/** head of registered output format linked list */
122
static AVOutputFormat *first_oformat = NULL;
124
AVInputFormat *av_iformat_next(AVInputFormat *f)
126
if(f) return f->next;
127
else return first_iformat;
130
AVOutputFormat *av_oformat_next(AVOutputFormat *f)
132
if(f) return f->next;
133
else return first_oformat;
136
void av_register_input_format(AVInputFormat *format)
140
while (*p != NULL) p = &(*p)->next;
145
void av_register_output_format(AVOutputFormat *format)
149
while (*p != NULL) p = &(*p)->next;
154
int av_match_ext(const char *filename, const char *extensions)
162
ext = strrchr(filename, '.');
168
while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
171
if (!strcasecmp(ext1, ext))
181
static int match_format(const char *name, const char *names)
189
namelen = strlen(name);
190
while ((p = strchr(names, ','))) {
191
len = FFMAX(p - names, namelen);
192
if (!strncasecmp(name, names, len))
196
return !strcasecmp(name, names);
199
AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
200
const char *mime_type)
202
AVOutputFormat *fmt = NULL, *fmt_found;
203
int score_max, score;
205
/* specific test for image sequences */
206
#if CONFIG_IMAGE2_MUXER
207
if (!short_name && filename &&
208
av_filename_number_test(filename) &&
209
ff_guess_image2_codec(filename) != CODEC_ID_NONE) {
210
return av_guess_format("image2", NULL, NULL);
213
/* Find the proper file type. */
216
while ((fmt = av_oformat_next(fmt))) {
218
if (fmt->name && short_name && !strcmp(fmt->name, short_name))
220
if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
222
if (filename && fmt->extensions &&
223
av_match_ext(filename, fmt->extensions)) {
226
if (score > score_max) {
234
enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
235
const char *filename, const char *mime_type, enum AVMediaType type){
236
if(type == AVMEDIA_TYPE_VIDEO){
237
enum CodecID codec_id= CODEC_ID_NONE;
239
#if CONFIG_IMAGE2_MUXER
240
if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
241
codec_id= ff_guess_image2_codec(filename);
244
if(codec_id == CODEC_ID_NONE)
245
codec_id= fmt->video_codec;
247
}else if(type == AVMEDIA_TYPE_AUDIO)
248
return fmt->audio_codec;
249
else if (type == AVMEDIA_TYPE_SUBTITLE)
250
return fmt->subtitle_codec;
252
return CODEC_ID_NONE;
255
AVInputFormat *av_find_input_format(const char *short_name)
257
AVInputFormat *fmt = NULL;
258
while ((fmt = av_iformat_next(fmt))) {
259
if (match_format(short_name, fmt->name))
266
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
268
int ret= av_new_packet(pkt, size);
273
pkt->pos= avio_tell(s);
275
ret= avio_read(s, pkt->data, size);
279
av_shrink_packet(pkt, ret);
284
int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
289
return av_get_packet(s, pkt, size);
290
old_size = pkt->size;
291
ret = av_grow_packet(pkt, size);
294
ret = avio_read(s, pkt->data + old_size, size);
295
av_shrink_packet(pkt, old_size + FFMAX(ret, 0));
300
int av_filename_number_test(const char *filename)
303
return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
306
AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
308
AVProbeData lpd = *pd;
309
AVInputFormat *fmt1 = NULL, *fmt;
312
if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
313
int id3len = ff_id3v2_tag_len(lpd.buf);
314
if (lpd.buf_size > id3len + 16) {
316
lpd.buf_size -= id3len;
322
while ((fmt1 = av_iformat_next(fmt1))) {
323
if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
326
if (fmt1->read_probe) {
327
score = fmt1->read_probe(&lpd);
328
} else if (fmt1->extensions) {
329
if (av_match_ext(lpd.filename, fmt1->extensions)) {
333
if (score > *score_max) {
336
}else if (score == *score_max)
340
/* a hack for files with huge id3v2 tags -- try to guess by file extension. */
341
if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
342
while ((fmt = av_iformat_next(fmt)))
343
if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
344
*score_max = AVPROBE_SCORE_MAX/4;
352
AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
354
return av_probe_input_format2(pd, is_opened, &score);
357
static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
359
static const struct {
360
const char *name; enum CodecID id; enum AVMediaType type;
362
{ "aac" , CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
363
{ "ac3" , CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
364
{ "dts" , CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
365
{ "eac3" , CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
366
{ "h264" , CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
367
{ "m4v" , CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
368
{ "mp3" , CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
369
{ "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
372
AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
376
av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
377
pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
378
for (i = 0; fmt_id_type[i].name; i++) {
379
if (!strcmp(fmt->name, fmt_id_type[i].name)) {
380
st->codec->codec_id = fmt_id_type[i].id;
381
st->codec->codec_type = fmt_id_type[i].type;
389
/************************************************************/
390
/* input media file */
392
#if FF_API_FORMAT_PARAMETERS
393
static AVDictionary *convert_format_parameters(AVFormatParameters *ap)
396
AVDictionary *opts = NULL;
401
if (ap->time_base.num) {
402
snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
403
av_dict_set(&opts, "framerate", buf, 0);
405
if (ap->sample_rate) {
406
snprintf(buf, sizeof(buf), "%d", ap->sample_rate);
407
av_dict_set(&opts, "sample_rate", buf, 0);
410
snprintf(buf, sizeof(buf), "%d", ap->channels);
411
av_dict_set(&opts, "channels", buf, 0);
413
if (ap->width || ap->height) {
414
snprintf(buf, sizeof(buf), "%dx%d", ap->width, ap->height);
415
av_dict_set(&opts, "video_size", buf, 0);
417
if (ap->pix_fmt != PIX_FMT_NONE) {
418
av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(ap->pix_fmt), 0);
421
snprintf(buf, sizeof(buf), "%d", ap->channel);
422
av_dict_set(&opts, "channel", buf, 0);
425
av_dict_set(&opts, "standard", ap->standard, 0);
427
if (ap->mpeg2ts_compute_pcr) {
428
av_dict_set(&opts, "mpeg2ts_compute_pcr", "1", 0);
430
if (ap->initial_pause) {
431
av_dict_set(&opts, "initial_pause", "1", 0);
437
* Open a media file from an IO stream. 'fmt' must be specified.
439
int av_open_input_stream(AVFormatContext **ic_ptr,
440
AVIOContext *pb, const char *filename,
441
AVInputFormat *fmt, AVFormatParameters *ap)
446
AVFormatParameters default_ap;
450
memset(ap, 0, sizeof(default_ap));
452
opts = convert_format_parameters(ap);
454
if(!ap->prealloced_context)
455
ic = avformat_alloc_context();
459
err = AVERROR(ENOMEM);
462
if (pb && fmt && fmt->flags & AVFMT_NOFILE)
463
av_log(ic, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
464
"will be ignored with AVFMT_NOFILE format.\n");
468
err = avformat_open_input(&ic, filename, fmt, &opts);
469
ic->pb = ic->pb ? ic->pb : pb; // don't leak custom pb if it wasn't set above
478
/** size of probe buffer, for guessing file type from file contents */
479
#define PROBE_BUF_MIN 2048
480
#define PROBE_BUF_MAX (1<<20)
482
int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
483
const char *filename, void *logctx,
484
unsigned int offset, unsigned int max_probe_size)
486
AVProbeData pd = { filename ? filename : "", NULL, -offset };
487
unsigned char *buf = NULL;
488
int ret = 0, probe_size;
490
if (!max_probe_size) {
491
max_probe_size = PROBE_BUF_MAX;
492
} else if (max_probe_size > PROBE_BUF_MAX) {
493
max_probe_size = PROBE_BUF_MAX;
494
} else if (max_probe_size < PROBE_BUF_MIN) {
495
return AVERROR(EINVAL);
498
if (offset >= max_probe_size) {
499
return AVERROR(EINVAL);
502
for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt && ret >= 0;
503
probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
504
int ret, score = probe_size < max_probe_size ? AVPROBE_SCORE_MAX/4 : 0;
505
int buf_offset = (probe_size == PROBE_BUF_MIN) ? 0 : probe_size>>1;
507
if (probe_size < offset) {
511
/* read probe data */
512
buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
513
if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
514
/* fail if error was not end of file, otherwise, lower score */
515
if (ret != AVERROR_EOF) {
520
ret = 0; /* error was end of file, nothing read */
523
pd.buf = &buf[offset];
525
memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
527
/* guess file format */
528
*fmt = av_probe_input_format2(&pd, 1, &score);
530
if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
531
av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
533
av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
539
return AVERROR_INVALIDDATA;
542
/* rewind. reuse probe buffer to avoid seeking */
543
if ((ret = ffio_rewind_with_probe_data(pb, buf, pd.buf_size)) < 0)
549
#if FF_API_FORMAT_PARAMETERS
550
int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
553
AVFormatParameters *ap)
556
AVDictionary *opts = convert_format_parameters(ap);
558
if (!ap || !ap->prealloced_context)
561
err = avformat_open_input(ic_ptr, filename, fmt, &opts);
568
/* open input file and probe the format if necessary */
569
static int init_input(AVFormatContext *s, const char *filename)
572
AVProbeData pd = {filename, NULL, 0};
575
s->flags |= AVFMT_FLAG_CUSTOM_IO;
577
return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
578
else if (s->iformat->flags & AVFMT_NOFILE)
579
return AVERROR(EINVAL);
583
if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
584
(!s->iformat && (s->iformat = av_probe_input_format(&pd, 0))))
587
if ((ret = avio_open(&s->pb, filename, AVIO_FLAG_READ)) < 0)
591
return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, 0);
594
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
596
AVFormatContext *s = *ps;
598
AVFormatParameters ap = { 0 };
599
AVDictionary *tmp = NULL;
601
if (!s && !(s = avformat_alloc_context()))
602
return AVERROR(ENOMEM);
607
av_dict_copy(&tmp, *options, 0);
609
if ((ret = av_opt_set_dict(s, &tmp)) < 0)
612
if ((ret = init_input(s, filename)) < 0)
615
/* check filename in case an image number is expected */
616
if (s->iformat->flags & AVFMT_NEEDNUMBER) {
617
if (!av_filename_number_test(filename)) {
618
ret = AVERROR(EINVAL);
623
s->duration = s->start_time = AV_NOPTS_VALUE;
624
av_strlcpy(s->filename, filename, sizeof(s->filename));
626
/* allocate private data */
627
if (s->iformat->priv_data_size > 0) {
628
if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
629
ret = AVERROR(ENOMEM);
632
if (s->iformat->priv_class) {
633
*(const AVClass**)s->priv_data = s->iformat->priv_class;
634
av_opt_set_defaults(s->priv_data);
635
if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
640
/* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
642
ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
644
if (s->iformat->read_header)
645
if ((ret = s->iformat->read_header(s, &ap)) < 0)
648
if (s->pb && !s->data_offset)
649
s->data_offset = avio_tell(s->pb);
651
s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
654
av_dict_free(options);
662
if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
664
avformat_free_context(s);
669
/*******************************************************/
671
static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
672
AVPacketList **plast_pktl){
673
AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
678
(*plast_pktl)->next = pktl;
680
*packet_buffer = pktl;
682
/* add the packet in the buffered packet list */
688
int av_read_packet(AVFormatContext *s, AVPacket *pkt)
694
AVPacketList *pktl = s->raw_packet_buffer;
698
if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
699
!s->streams[pkt->stream_index]->probe_packets ||
700
s->raw_packet_buffer_remaining_size < pkt->size){
701
AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
704
s->raw_packet_buffer = pktl->next;
705
s->raw_packet_buffer_remaining_size += pkt->size;
712
ret= s->iformat->read_packet(s, pkt);
714
if (!pktl || ret == AVERROR(EAGAIN))
716
for (i = 0; i < s->nb_streams; i++)
717
s->streams[i]->probe_packets = 0;
720
st= s->streams[pkt->stream_index];
722
switch(st->codec->codec_type){
723
case AVMEDIA_TYPE_VIDEO:
724
if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
726
case AVMEDIA_TYPE_AUDIO:
727
if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
729
case AVMEDIA_TYPE_SUBTITLE:
730
if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
734
if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
738
add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
739
s->raw_packet_buffer_remaining_size -= pkt->size;
741
if(st->codec->codec_id == CODEC_ID_PROBE){
742
AVProbeData *pd = &st->probe_data;
743
av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
746
pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
747
memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
748
pd->buf_size += pkt->size;
749
memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
751
if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
752
//FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
753
set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
754
if(st->codec->codec_id != CODEC_ID_PROBE){
757
av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
764
/**********************************************************/
767
* Get the number of samples of an audio frame. Return -1 on error.
769
static int get_audio_frame_size(AVCodecContext *enc, int size)
773
if(enc->codec_id == CODEC_ID_VORBIS)
776
if (enc->frame_size <= 1) {
777
int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
779
if (bits_per_sample) {
780
if (enc->channels == 0)
782
frame_size = (size << 3) / (bits_per_sample * enc->channels);
784
/* used for example by ADPCM codecs */
785
if (enc->bit_rate == 0)
787
frame_size = ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
790
frame_size = enc->frame_size;
797
* Return the frame duration in seconds. Return 0 if not available.
799
static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
800
AVCodecParserContext *pc, AVPacket *pkt)
806
switch(st->codec->codec_type) {
807
case AVMEDIA_TYPE_VIDEO:
808
if(st->time_base.num*1000LL > st->time_base.den){
809
*pnum = st->time_base.num;
810
*pden = st->time_base.den;
811
}else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
812
*pnum = st->codec->time_base.num;
813
*pden = st->codec->time_base.den;
814
if (pc && pc->repeat_pict) {
815
*pnum = (*pnum) * (1 + pc->repeat_pict);
817
//If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
818
//Thus if we have no parser in such case leave duration undefined.
819
if(st->codec->ticks_per_frame>1 && !pc){
824
case AVMEDIA_TYPE_AUDIO:
825
frame_size = get_audio_frame_size(st->codec, pkt->size);
826
if (frame_size <= 0 || st->codec->sample_rate <= 0)
829
*pden = st->codec->sample_rate;
836
static int is_intra_only(AVCodecContext *enc){
837
if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
839
}else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
840
switch(enc->codec_id){
842
case CODEC_ID_MJPEGB:
844
case CODEC_ID_RAWVIDEO:
845
case CODEC_ID_DVVIDEO:
846
case CODEC_ID_HUFFYUV:
847
case CODEC_ID_FFVHUFF:
852
case CODEC_ID_JPEG2000:
860
static void update_initial_timestamps(AVFormatContext *s, int stream_index,
861
int64_t dts, int64_t pts)
863
AVStream *st= s->streams[stream_index];
864
AVPacketList *pktl= s->packet_buffer;
866
if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
869
st->first_dts= dts - st->cur_dts;
872
for(; pktl; pktl= pktl->next){
873
if(pktl->pkt.stream_index != stream_index)
875
//FIXME think more about this check
876
if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
877
pktl->pkt.pts += st->first_dts;
879
if(pktl->pkt.dts != AV_NOPTS_VALUE)
880
pktl->pkt.dts += st->first_dts;
882
if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
883
st->start_time= pktl->pkt.pts;
885
if (st->start_time == AV_NOPTS_VALUE)
886
st->start_time = pts;
889
static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
891
AVPacketList *pktl= s->packet_buffer;
894
if(st->first_dts != AV_NOPTS_VALUE){
895
cur_dts= st->first_dts;
896
for(; pktl; pktl= pktl->next){
897
if(pktl->pkt.stream_index == pkt->stream_index){
898
if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
900
cur_dts -= pkt->duration;
903
pktl= s->packet_buffer;
904
st->first_dts = cur_dts;
905
}else if(st->cur_dts)
908
for(; pktl; pktl= pktl->next){
909
if(pktl->pkt.stream_index != pkt->stream_index)
911
if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
912
&& !pktl->pkt.duration){
913
pktl->pkt.dts= cur_dts;
914
if(!st->codec->has_b_frames)
915
pktl->pkt.pts= cur_dts;
916
cur_dts += pkt->duration;
917
pktl->pkt.duration= pkt->duration;
921
if(st->first_dts == AV_NOPTS_VALUE)
922
st->cur_dts= cur_dts;
925
static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
926
AVCodecParserContext *pc, AVPacket *pkt)
928
int num, den, presentation_delayed, delay, i;
931
if (s->flags & AVFMT_FLAG_NOFILLIN)
934
if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
935
pkt->dts= AV_NOPTS_VALUE;
937
if (st->codec->codec_id != CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
938
//FIXME Set low_delay = 0 when has_b_frames = 1
939
st->codec->has_b_frames = 1;
941
/* do we have a video B-frame ? */
942
delay= st->codec->has_b_frames;
943
presentation_delayed = 0;
945
// ignore delay caused by frame threading so that the mpeg2-without-dts
946
// warning will not trigger
947
if (delay && st->codec->active_thread_type&FF_THREAD_FRAME)
948
delay -= st->codec->thread_count-1;
950
/* XXX: need has_b_frame, but cannot get it if the codec is
953
pc && pc->pict_type != AV_PICTURE_TYPE_B)
954
presentation_delayed = 1;
956
if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
957
/*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
958
pkt->dts -= 1LL<<st->pts_wrap_bits;
961
// some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
962
// we take the conservative approach and discard both
963
// Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
964
if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
965
av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination\n");
966
pkt->dts= pkt->pts= AV_NOPTS_VALUE;
969
if (pkt->duration == 0) {
970
compute_frame_duration(&num, &den, st, pc, pkt);
972
pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
974
if(pkt->duration != 0 && s->packet_buffer)
975
update_initial_durations(s, st, pkt);
979
/* correct timestamps with byte offset if demuxers only have timestamps
980
on packet boundaries */
981
if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
982
/* this will estimate bitrate based on this frame's duration and size */
983
offset = av_rescale(pc->offset, pkt->duration, pkt->size);
984
if(pkt->pts != AV_NOPTS_VALUE)
986
if(pkt->dts != AV_NOPTS_VALUE)
990
if (pc && pc->dts_sync_point >= 0) {
991
// we have synchronization info from the parser
992
int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
994
int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
995
if (pkt->dts != AV_NOPTS_VALUE) {
996
// got DTS from the stream, update reference timestamp
997
st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
998
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
999
} else if (st->reference_dts != AV_NOPTS_VALUE) {
1000
// compute DTS based on reference timestamp
1001
pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
1002
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
1004
if (pc->dts_sync_point > 0)
1005
st->reference_dts = pkt->dts; // new reference
1009
/* This may be redundant, but it should not hurt. */
1010
if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
1011
presentation_delayed = 1;
1013
// av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc);
1014
/* interpolate PTS and DTS if they are not present */
1015
//We skip H264 currently because delay and has_b_frames are not reliably set
1016
if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != CODEC_ID_H264){
1017
if (presentation_delayed) {
1018
/* DTS = decompression timestamp */
1019
/* PTS = presentation timestamp */
1020
if (pkt->dts == AV_NOPTS_VALUE)
1021
pkt->dts = st->last_IP_pts;
1022
update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
1023
if (pkt->dts == AV_NOPTS_VALUE)
1024
pkt->dts = st->cur_dts;
1026
/* this is tricky: the dts must be incremented by the duration
1027
of the frame we are displaying, i.e. the last I- or P-frame */
1028
if (st->last_IP_duration == 0)
1029
st->last_IP_duration = pkt->duration;
1030
if(pkt->dts != AV_NOPTS_VALUE)
1031
st->cur_dts = pkt->dts + st->last_IP_duration;
1032
st->last_IP_duration = pkt->duration;
1033
st->last_IP_pts= pkt->pts;
1034
/* cannot compute PTS if not present (we can compute it only
1035
by knowing the future */
1036
} else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
1037
if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
1038
int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
1039
int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
1040
if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
1041
pkt->pts += pkt->duration;
1042
// av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size);
1046
/* presentation is not delayed : PTS and DTS are the same */
1047
if(pkt->pts == AV_NOPTS_VALUE)
1048
pkt->pts = pkt->dts;
1049
update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
1050
if(pkt->pts == AV_NOPTS_VALUE)
1051
pkt->pts = st->cur_dts;
1052
pkt->dts = pkt->pts;
1053
if(pkt->pts != AV_NOPTS_VALUE)
1054
st->cur_dts = pkt->pts + pkt->duration;
1058
if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
1059
st->pts_buffer[0]= pkt->pts;
1060
for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
1061
FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
1062
if(pkt->dts == AV_NOPTS_VALUE)
1063
pkt->dts= st->pts_buffer[0];
1064
if(st->codec->codec_id == CODEC_ID_H264){ //we skiped it above so we try here
1065
update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
1067
if(pkt->dts > st->cur_dts)
1068
st->cur_dts = pkt->dts;
1071
// av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts);
1074
if(is_intra_only(st->codec))
1075
pkt->flags |= AV_PKT_FLAG_KEY;
1078
/* keyframe computation */
1079
if (pc->key_frame == 1)
1080
pkt->flags |= AV_PKT_FLAG_KEY;
1081
else if (pc->key_frame == -1 && pc->pict_type == AV_PICTURE_TYPE_I)
1082
pkt->flags |= AV_PKT_FLAG_KEY;
1085
pkt->convergence_duration = pc->convergence_duration;
1089
static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
1094
av_init_packet(pkt);
1097
/* select current input stream component */
1100
if (!st->need_parsing || !st->parser) {
1101
/* no parsing needed: we just output the packet as is */
1102
/* raw data support */
1103
*pkt = st->cur_pkt; st->cur_pkt.data= NULL;
1104
compute_pkt_fields(s, st, NULL, pkt);
1106
if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
1107
(pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
1108
ff_reduce_index(s, st->index);
1109
av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
1112
} else if (st->cur_len > 0 && st->discard < AVDISCARD_ALL) {
1113
len = av_parser_parse2(st->parser, st->codec, &pkt->data, &pkt->size,
1114
st->cur_ptr, st->cur_len,
1115
st->cur_pkt.pts, st->cur_pkt.dts,
1117
st->cur_pkt.pts = AV_NOPTS_VALUE;
1118
st->cur_pkt.dts = AV_NOPTS_VALUE;
1119
/* increment read pointer */
1123
/* return packet if any */
1127
pkt->stream_index = st->index;
1128
pkt->pts = st->parser->pts;
1129
pkt->dts = st->parser->dts;
1130
pkt->pos = st->parser->pos;
1131
if(pkt->data == st->cur_pkt.data && pkt->size == st->cur_pkt.size){
1133
pkt->destruct= st->cur_pkt.destruct;
1134
st->cur_pkt.destruct= NULL;
1135
st->cur_pkt.data = NULL;
1136
assert(st->cur_len == 0);
1138
pkt->destruct = NULL;
1140
compute_pkt_fields(s, st, st->parser, pkt);
1142
if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
1143
ff_reduce_index(s, st->index);
1144
av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
1145
0, 0, AVINDEX_KEYFRAME);
1152
av_free_packet(&st->cur_pkt);
1157
/* read next packet */
1158
ret = av_read_packet(s, &cur_pkt);
1160
if (ret == AVERROR(EAGAIN))
1162
/* return the last frames, if any */
1163
for(i = 0; i < s->nb_streams; i++) {
1165
if (st->parser && st->need_parsing) {
1166
av_parser_parse2(st->parser, st->codec,
1167
&pkt->data, &pkt->size,
1169
AV_NOPTS_VALUE, AV_NOPTS_VALUE,
1175
/* no more packets: really terminate parsing */
1178
st = s->streams[cur_pkt.stream_index];
1179
st->cur_pkt= cur_pkt;
1181
if(st->cur_pkt.pts != AV_NOPTS_VALUE &&
1182
st->cur_pkt.dts != AV_NOPTS_VALUE &&
1183
st->cur_pkt.pts < st->cur_pkt.dts){
1184
av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
1185
st->cur_pkt.stream_index,
1189
// av_free_packet(&st->cur_pkt);
1193
if(s->debug & FF_FDEBUG_TS)
1194
av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1195
st->cur_pkt.stream_index,
1199
st->cur_pkt.duration,
1203
st->cur_ptr = st->cur_pkt.data;
1204
st->cur_len = st->cur_pkt.size;
1205
if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
1206
st->parser = av_parser_init(st->codec->codec_id);
1208
/* no parser available: just output the raw packets */
1209
st->need_parsing = AVSTREAM_PARSE_NONE;
1210
}else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1211
st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1212
}else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
1213
st->parser->flags |= PARSER_FLAG_ONCE;
1218
if(s->debug & FF_FDEBUG_TS)
1219
av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, duration=%d, flags=%d\n",
1230
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1234
const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1237
pktl = s->packet_buffer;
1239
AVPacket *next_pkt= &pktl->pkt;
1241
if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1242
int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
1243
while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1244
if( pktl->pkt.stream_index == next_pkt->stream_index
1245
&& (0 > av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)))
1246
&& av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
1247
next_pkt->pts= pktl->pkt.dts;
1251
pktl = s->packet_buffer;
1254
if( next_pkt->pts != AV_NOPTS_VALUE
1255
|| next_pkt->dts == AV_NOPTS_VALUE
1257
/* read packet from packet buffer, if there is data */
1259
s->packet_buffer = pktl->next;
1265
int ret= av_read_frame_internal(s, pkt);
1267
if(pktl && ret != AVERROR(EAGAIN)){
1274
if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1275
&s->packet_buffer_end)) < 0)
1276
return AVERROR(ENOMEM);
1278
assert(!s->packet_buffer);
1279
return av_read_frame_internal(s, pkt);
1284
/* XXX: suppress the packet queue */
1285
static void flush_packet_queue(AVFormatContext *s)
1290
pktl = s->packet_buffer;
1293
s->packet_buffer = pktl->next;
1294
av_free_packet(&pktl->pkt);
1297
while(s->raw_packet_buffer){
1298
pktl = s->raw_packet_buffer;
1299
s->raw_packet_buffer = pktl->next;
1300
av_free_packet(&pktl->pkt);
1303
s->packet_buffer_end=
1304
s->raw_packet_buffer_end= NULL;
1305
s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
1308
/*******************************************************/
1311
int av_find_default_stream_index(AVFormatContext *s)
1313
int first_audio_index = -1;
1317
if (s->nb_streams <= 0)
1319
for(i = 0; i < s->nb_streams; i++) {
1321
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1324
if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1325
first_audio_index = i;
1327
return first_audio_index >= 0 ? first_audio_index : 0;
1331
* Flush the frame reader.
1333
void ff_read_frame_flush(AVFormatContext *s)
1338
flush_packet_queue(s);
1342
/* for each stream, reset read state */
1343
for(i = 0; i < s->nb_streams; i++) {
1347
av_parser_close(st->parser);
1349
av_free_packet(&st->cur_pkt);
1351
st->last_IP_pts = AV_NOPTS_VALUE;
1352
st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1353
st->reference_dts = AV_NOPTS_VALUE;
1358
st->probe_packets = MAX_PROBE_PACKETS;
1360
for(j=0; j<MAX_REORDER_DELAY+1; j++)
1361
st->pts_buffer[j]= AV_NOPTS_VALUE;
1365
void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1368
for(i = 0; i < s->nb_streams; i++) {
1369
AVStream *st = s->streams[i];
1371
st->cur_dts = av_rescale(timestamp,
1372
st->time_base.den * (int64_t)ref_st->time_base.num,
1373
st->time_base.num * (int64_t)ref_st->time_base.den);
1377
void ff_reduce_index(AVFormatContext *s, int stream_index)
1379
AVStream *st= s->streams[stream_index];
1380
unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1382
if((unsigned)st->nb_index_entries >= max_entries){
1384
for(i=0; 2*i<st->nb_index_entries; i++)
1385
st->index_entries[i]= st->index_entries[2*i];
1386
st->nb_index_entries= i;
1390
int ff_add_index_entry(AVIndexEntry **index_entries,
1391
int *nb_index_entries,
1392
unsigned int *index_entries_allocated_size,
1393
int64_t pos, int64_t timestamp, int size, int distance, int flags)
1395
AVIndexEntry *entries, *ie;
1398
if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1401
entries = av_fast_realloc(*index_entries,
1402
index_entries_allocated_size,
1403
(*nb_index_entries + 1) *
1404
sizeof(AVIndexEntry));
1408
*index_entries= entries;
1410
index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
1413
index= (*nb_index_entries)++;
1414
ie= &entries[index];
1415
assert(index==0 || ie[-1].timestamp < timestamp);
1417
ie= &entries[index];
1418
if(ie->timestamp != timestamp){
1419
if(ie->timestamp <= timestamp)
1421
memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
1422
(*nb_index_entries)++;
1423
}else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1424
distance= ie->min_distance;
1428
ie->timestamp = timestamp;
1429
ie->min_distance= distance;
1436
int av_add_index_entry(AVStream *st,
1437
int64_t pos, int64_t timestamp, int size, int distance, int flags)
1439
return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
1440
&st->index_entries_allocated_size, pos,
1441
timestamp, size, distance, flags);
1444
int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
1445
int64_t wanted_timestamp, int flags)
1453
//optimize appending index entries at the end
1454
if(b && entries[b-1].timestamp < wanted_timestamp)
1459
timestamp = entries[m].timestamp;
1460
if(timestamp >= wanted_timestamp)
1462
if(timestamp <= wanted_timestamp)
1465
m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1467
if(!(flags & AVSEEK_FLAG_ANY)){
1468
while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1469
m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1478
int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1481
return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
1482
wanted_timestamp, flags);
1485
int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1486
AVInputFormat *avif= s->iformat;
1487
int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
1488
int64_t ts_min, ts_max, ts;
1493
if (stream_index < 0)
1496
av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1499
ts_min= AV_NOPTS_VALUE;
1500
pos_limit= -1; //gcc falsely says it may be uninitialized
1502
st= s->streams[stream_index];
1503
if(st->index_entries){
1506
index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non-keyframe entries in index case, especially read_timestamp()
1507
index= FFMAX(index, 0);
1508
e= &st->index_entries[index];
1510
if(e->timestamp <= target_ts || e->pos == e->min_distance){
1512
ts_min= e->timestamp;
1513
av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1519
index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1520
assert(index < st->nb_index_entries);
1522
e= &st->index_entries[index];
1523
assert(e->timestamp >= target_ts);
1525
ts_max= e->timestamp;
1526
pos_limit= pos_max - e->min_distance;
1527
av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1528
pos_max,pos_limit, ts_max);
1532
pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1537
if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
1540
av_update_cur_dts(s, st, ts);
1545
int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){
1547
int64_t start_pos, filesize;
1550
av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1552
if(ts_min == AV_NOPTS_VALUE){
1553
pos_min = s->data_offset;
1554
ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1555
if (ts_min == AV_NOPTS_VALUE)
1559
if(ts_max == AV_NOPTS_VALUE){
1561
filesize = avio_size(s->pb);
1562
pos_max = filesize - 1;
1565
ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1567
}while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1568
if (ts_max == AV_NOPTS_VALUE)
1572
int64_t tmp_pos= pos_max + 1;
1573
int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1574
if(tmp_ts == AV_NOPTS_VALUE)
1578
if(tmp_pos >= filesize)
1584
if(ts_min > ts_max){
1586
}else if(ts_min == ts_max){
1591
while (pos_min < pos_limit) {
1592
av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1593
pos_min, pos_max, ts_min, ts_max);
1594
assert(pos_limit <= pos_max);
1597
int64_t approximate_keyframe_distance= pos_max - pos_limit;
1598
// interpolate position (better than dichotomy)
1599
pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1600
+ pos_min - approximate_keyframe_distance;
1601
}else if(no_change==1){
1602
// bisection, if interpolation failed to change min or max pos last time
1603
pos = (pos_min + pos_limit)>>1;
1605
/* linear search if bisection failed, can only happen if there
1606
are very few or no keyframes between min/max */
1611
else if(pos > pos_limit)
1615
ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1620
av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
1621
pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
1622
pos_limit, start_pos, no_change);
1623
if(ts == AV_NOPTS_VALUE){
1624
av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1627
assert(ts != AV_NOPTS_VALUE);
1628
if (target_ts <= ts) {
1629
pos_limit = start_pos - 1;
1633
if (target_ts >= ts) {
1639
pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1640
ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1642
ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1644
ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1645
av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1646
pos, ts_min, target_ts, ts_max);
1651
static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1652
int64_t pos_min, pos_max;
1656
if (stream_index < 0)
1659
st= s->streams[stream_index];
1662
pos_min = s->data_offset;
1663
pos_max = avio_size(s->pb) - 1;
1665
if (pos < pos_min) pos= pos_min;
1666
else if(pos > pos_max) pos= pos_max;
1668
avio_seek(s->pb, pos, SEEK_SET);
1671
av_update_cur_dts(s, st, ts);
1676
static int av_seek_frame_generic(AVFormatContext *s,
1677
int stream_index, int64_t timestamp, int flags)
1684
st = s->streams[stream_index];
1686
index = av_index_search_timestamp(st, timestamp, flags);
1688
if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
1691
if(index < 0 || index==st->nb_index_entries-1){
1695
if(st->nb_index_entries){
1696
assert(st->index_entries);
1697
ie= &st->index_entries[st->nb_index_entries-1];
1698
if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1700
av_update_cur_dts(s, st, ie->timestamp);
1702
if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
1708
ret = av_read_frame(s, &pkt);
1709
}while(ret == AVERROR(EAGAIN));
1712
av_free_packet(&pkt);
1713
if(stream_index == pkt.stream_index){
1714
if((pkt.flags & AV_PKT_FLAG_KEY) && pkt.dts > timestamp)
1718
index = av_index_search_timestamp(st, timestamp, flags);
1723
ff_read_frame_flush(s);
1724
if (s->iformat->read_seek){
1725
if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1728
ie = &st->index_entries[index];
1729
if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
1731
av_update_cur_dts(s, st, ie->timestamp);
1736
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1741
ff_read_frame_flush(s);
1743
if(flags & AVSEEK_FLAG_BYTE)
1744
return av_seek_frame_byte(s, stream_index, timestamp, flags);
1746
if(stream_index < 0){
1747
stream_index= av_find_default_stream_index(s);
1748
if(stream_index < 0)
1751
st= s->streams[stream_index];
1752
/* timestamp for default must be expressed in AV_TIME_BASE units */
1753
timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1756
/* first, we try the format specific seek */
1757
if (s->iformat->read_seek)
1758
ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1765
if(s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH))
1766
return av_seek_frame_binary(s, stream_index, timestamp, flags);
1767
else if (!(s->iformat->flags & AVFMT_NOGENSEARCH))
1768
return av_seek_frame_generic(s, stream_index, timestamp, flags);
1773
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1775
if(min_ts > ts || max_ts < ts)
1778
ff_read_frame_flush(s);
1780
if (s->iformat->read_seek2)
1781
return s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
1783
if(s->iformat->read_timestamp){
1784
//try to seek via read_timestamp()
1787
//Fallback to old API if new is not implemented but old is
1788
//Note the old has somewat different sematics
1789
if(s->iformat->read_seek || 1)
1790
return av_seek_frame(s, stream_index, ts, flags | (ts - min_ts > (uint64_t)(max_ts - ts) ? AVSEEK_FLAG_BACKWARD : 0));
1792
// try some generic seek like av_seek_frame_generic() but with new ts semantics
1795
/*******************************************************/
1798
* Return TRUE if the stream has accurate duration in any stream.
1800
* @return TRUE if the stream has accurate duration for at least one component.
1802
static int av_has_duration(AVFormatContext *ic)
1807
for(i = 0;i < ic->nb_streams; i++) {
1808
st = ic->streams[i];
1809
if (st->duration != AV_NOPTS_VALUE)
1816
* Estimate the stream timings from the one of each components.
1818
* Also computes the global bitrate if possible.
1820
static void av_update_stream_timings(AVFormatContext *ic)
1822
int64_t start_time, start_time1, end_time, end_time1;
1823
int64_t duration, duration1;
1827
start_time = INT64_MAX;
1828
end_time = INT64_MIN;
1829
duration = INT64_MIN;
1830
for(i = 0;i < ic->nb_streams; i++) {
1831
st = ic->streams[i];
1832
if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1833
start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1834
if (start_time1 < start_time)
1835
start_time = start_time1;
1836
if (st->duration != AV_NOPTS_VALUE) {
1837
end_time1 = start_time1
1838
+ av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1839
if (end_time1 > end_time)
1840
end_time = end_time1;
1843
if (st->duration != AV_NOPTS_VALUE) {
1844
duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1845
if (duration1 > duration)
1846
duration = duration1;
1849
if (start_time != INT64_MAX) {
1850
ic->start_time = start_time;
1851
if (end_time != INT64_MIN) {
1852
if (end_time - start_time > duration)
1853
duration = end_time - start_time;
1856
if (duration != INT64_MIN) {
1857
ic->duration = duration;
1858
if (ic->file_size > 0) {
1859
/* compute the bitrate */
1860
ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1861
(double)ic->duration;
1866
static void fill_all_stream_timings(AVFormatContext *ic)
1871
av_update_stream_timings(ic);
1872
for(i = 0;i < ic->nb_streams; i++) {
1873
st = ic->streams[i];
1874
if (st->start_time == AV_NOPTS_VALUE) {
1875
if(ic->start_time != AV_NOPTS_VALUE)
1876
st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1877
if(ic->duration != AV_NOPTS_VALUE)
1878
st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1883
static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1885
int64_t filesize, duration;
1889
/* if bit_rate is already set, we believe it */
1890
if (ic->bit_rate <= 0) {
1892
for(i=0;i<ic->nb_streams;i++) {
1893
st = ic->streams[i];
1894
if (st->codec->bit_rate > 0)
1895
bit_rate += st->codec->bit_rate;
1897
ic->bit_rate = bit_rate;
1900
/* if duration is already set, we believe it */
1901
if (ic->duration == AV_NOPTS_VALUE &&
1902
ic->bit_rate != 0 &&
1903
ic->file_size != 0) {
1904
filesize = ic->file_size;
1906
for(i = 0; i < ic->nb_streams; i++) {
1907
st = ic->streams[i];
1908
duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1909
if (st->duration == AV_NOPTS_VALUE)
1910
st->duration = duration;
1916
#define DURATION_MAX_READ_SIZE 250000
1917
#define DURATION_MAX_RETRY 3
1919
/* only usable for MPEG-PS streams */
1920
static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1922
AVPacket pkt1, *pkt = &pkt1;
1924
int read_size, i, ret;
1926
int64_t filesize, offset, duration;
1931
/* flush packet queue */
1932
flush_packet_queue(ic);
1934
for (i=0; i<ic->nb_streams; i++) {
1935
st = ic->streams[i];
1936
if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
1937
av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
1940
av_parser_close(st->parser);
1942
av_free_packet(&st->cur_pkt);
1946
/* estimate the end time (duration) */
1947
/* XXX: may need to support wrapping */
1948
filesize = ic->file_size;
1949
end_time = AV_NOPTS_VALUE;
1951
offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
1955
avio_seek(ic->pb, offset, SEEK_SET);
1958
if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
1962
ret = av_read_packet(ic, pkt);
1963
}while(ret == AVERROR(EAGAIN));
1966
read_size += pkt->size;
1967
st = ic->streams[pkt->stream_index];
1968
if (pkt->pts != AV_NOPTS_VALUE &&
1969
(st->start_time != AV_NOPTS_VALUE ||
1970
st->first_dts != AV_NOPTS_VALUE)) {
1971
duration = end_time = pkt->pts;
1972
if (st->start_time != AV_NOPTS_VALUE) duration -= st->start_time;
1973
else duration -= st->first_dts;
1975
duration += 1LL<<st->pts_wrap_bits;
1977
if (st->duration == AV_NOPTS_VALUE ||
1978
st->duration < duration)
1979
st->duration = duration;
1982
av_free_packet(pkt);
1984
}while( end_time==AV_NOPTS_VALUE
1985
&& filesize > (DURATION_MAX_READ_SIZE<<retry)
1986
&& ++retry <= DURATION_MAX_RETRY);
1988
fill_all_stream_timings(ic);
1990
avio_seek(ic->pb, old_offset, SEEK_SET);
1991
for (i=0; i<ic->nb_streams; i++) {
1993
st->cur_dts= st->first_dts;
1994
st->last_IP_pts = AV_NOPTS_VALUE;
1995
st->reference_dts = AV_NOPTS_VALUE;
1999
static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
2003
/* get the file size, if possible */
2004
if (ic->iformat->flags & AVFMT_NOFILE) {
2007
file_size = avio_size(ic->pb);
2011
ic->file_size = file_size;
2013
if ((!strcmp(ic->iformat->name, "mpeg") ||
2014
!strcmp(ic->iformat->name, "mpegts")) &&
2015
file_size && ic->pb->seekable) {
2016
/* get accurate estimate from the PTSes */
2017
av_estimate_timings_from_pts(ic, old_offset);
2018
} else if (av_has_duration(ic)) {
2019
/* at least one component has timings - we use them for all
2021
fill_all_stream_timings(ic);
2023
av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
2024
/* less precise: use bitrate info */
2025
av_estimate_timings_from_bit_rate(ic);
2027
av_update_stream_timings(ic);
2031
AVStream av_unused *st;
2032
for(i = 0;i < ic->nb_streams; i++) {
2033
st = ic->streams[i];
2034
av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
2035
(double) st->start_time / AV_TIME_BASE,
2036
(double) st->duration / AV_TIME_BASE);
2038
av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
2039
(double) ic->start_time / AV_TIME_BASE,
2040
(double) ic->duration / AV_TIME_BASE,
2041
ic->bit_rate / 1000);
2045
static int has_codec_parameters(AVCodecContext *enc)
2048
switch(enc->codec_type) {
2049
case AVMEDIA_TYPE_AUDIO:
2050
val = enc->sample_rate && enc->channels && enc->sample_fmt != AV_SAMPLE_FMT_NONE;
2051
if(!enc->frame_size &&
2052
(enc->codec_id == CODEC_ID_VORBIS ||
2053
enc->codec_id == CODEC_ID_AAC ||
2054
enc->codec_id == CODEC_ID_MP1 ||
2055
enc->codec_id == CODEC_ID_MP2 ||
2056
enc->codec_id == CODEC_ID_MP3 ||
2057
enc->codec_id == CODEC_ID_SPEEX))
2060
case AVMEDIA_TYPE_VIDEO:
2061
val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
2067
return enc->codec_id != CODEC_ID_NONE && val != 0;
2070
static int has_decode_delay_been_guessed(AVStream *st)
2072
return st->codec->codec_id != CODEC_ID_H264 ||
2073
st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
2076
static int try_decode_frame(AVStream *st, AVPacket *avpkt)
2080
int got_picture, data_size, ret=0;
2083
if(!st->codec->codec){
2084
codec = avcodec_find_decoder(st->codec->codec_id);
2087
ret = avcodec_open(st->codec, codec);
2092
if(!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st)){
2093
switch(st->codec->codec_type) {
2094
case AVMEDIA_TYPE_VIDEO:
2095
avcodec_get_frame_defaults(&picture);
2096
ret = avcodec_decode_video2(st->codec, &picture,
2097
&got_picture, avpkt);
2099
case AVMEDIA_TYPE_AUDIO:
2100
data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
2101
samples = av_malloc(data_size);
2104
ret = avcodec_decode_audio3(st->codec, samples,
2116
unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum CodecID id)
2118
while (tags->id != CODEC_ID_NONE) {
2126
enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
2129
for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
2130
if(tag == tags[i].tag)
2133
for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
2134
if (ff_toupper4(tag) == ff_toupper4(tags[i].tag))
2137
return CODEC_ID_NONE;
2140
unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
2143
for(i=0; tags && tags[i]; i++){
2144
int tag= ff_codec_get_tag(tags[i], id);
2150
enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
2153
for(i=0; tags && tags[i]; i++){
2154
enum CodecID id= ff_codec_get_id(tags[i], tag);
2155
if(id!=CODEC_ID_NONE) return id;
2157
return CODEC_ID_NONE;
2160
static void compute_chapters_end(AVFormatContext *s)
2163
int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
2165
for (i = 0; i < s->nb_chapters; i++)
2166
if (s->chapters[i]->end == AV_NOPTS_VALUE) {
2167
AVChapter *ch = s->chapters[i];
2168
int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
2171
for (j = 0; j < s->nb_chapters; j++) {
2172
AVChapter *ch1 = s->chapters[j];
2173
int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
2174
if (j != i && next_start > ch->start && next_start < end)
2177
ch->end = (end == INT64_MAX) ? ch->start : end;
2181
static int get_std_framerate(int i){
2182
if(i<60*12) return i*1001;
2183
else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
2187
* Is the time base unreliable.
2188
* This is a heuristic to balance between quick acceptance of the values in
2189
* the headers vs. some extra checks.
2190
* Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
2191
* MPEG-2 commonly misuses field repeat flags to store different framerates.
2192
* And there are "variable" fps files this needs to detect as well.
2194
static int tb_unreliable(AVCodecContext *c){
2195
if( c->time_base.den >= 101L*c->time_base.num
2196
|| c->time_base.den < 5L*c->time_base.num
2197
/* || c->codec_tag == AV_RL32("DIVX")
2198
|| c->codec_tag == AV_RL32("XVID")*/
2199
|| c->codec_id == CODEC_ID_MPEG2VIDEO
2200
|| c->codec_id == CODEC_ID_H264
2206
int av_find_stream_info(AVFormatContext *ic)
2208
int i, count, ret, read_size, j;
2210
AVPacket pkt1, *pkt;
2211
int64_t old_offset = avio_tell(ic->pb);
2213
for(i=0;i<ic->nb_streams;i++) {
2215
st = ic->streams[i];
2216
if (st->codec->codec_id == CODEC_ID_AAC) {
2217
st->codec->sample_rate = 0;
2218
st->codec->frame_size = 0;
2219
st->codec->channels = 0;
2221
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2222
st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2223
/* if(!st->time_base.num)
2225
if(!st->codec->time_base.num)
2226
st->codec->time_base= st->time_base;
2228
//only for the split stuff
2229
if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
2230
st->parser = av_parser_init(st->codec->codec_id);
2231
if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
2232
st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
2235
assert(!st->codec->codec);
2236
codec = avcodec_find_decoder(st->codec->codec_id);
2238
/* Force decoding of at least one frame of codec data
2239
* this makes sure the codec initializes the channel configuration
2240
* and does not trust the values from the container.
2242
if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
2243
st->codec->channels = 0;
2245
/* Ensure that subtitle_header is properly set. */
2246
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
2247
&& codec && !st->codec->codec)
2248
avcodec_open(st->codec, codec);
2250
//try to just open decoders, in case this is enough to get parameters
2251
if(!has_codec_parameters(st->codec)){
2252
if (codec && !st->codec->codec)
2253
avcodec_open(st->codec, codec);
2257
for (i=0; i<ic->nb_streams; i++) {
2258
ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
2264
if(url_interrupt_cb()){
2266
av_log(ic, AV_LOG_DEBUG, "interrupted\n");
2270
/* check if one codec still needs to be handled */
2271
for(i=0;i<ic->nb_streams;i++) {
2272
int fps_analyze_framecount = 20;
2274
st = ic->streams[i];
2275
if (!has_codec_parameters(st->codec))
2277
/* if the timebase is coarse (like the usual millisecond precision
2278
of mkv), we need to analyze more frames to reliably arrive at
2280
if (av_q2d(st->time_base) > 0.0005)
2281
fps_analyze_framecount *= 2;
2282
if (ic->fps_probe_size >= 0)
2283
fps_analyze_framecount = ic->fps_probe_size;
2284
/* variable fps and no guess at the real fps */
2285
if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
2286
&& st->info->duration_count < fps_analyze_framecount
2287
&& st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2289
if(st->parser && st->parser->parser->split && !st->codec->extradata)
2291
if(st->first_dts == AV_NOPTS_VALUE)
2294
if (i == ic->nb_streams) {
2295
/* NOTE: if the format has no header, then we need to read
2296
some packets to get most of the streams, so we cannot
2298
if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2299
/* if we found the info for all the codecs, we can stop */
2301
av_log(ic, AV_LOG_DEBUG, "All info found\n");
2305
/* we did not get all the codec info, but we read too much data */
2306
if (read_size >= ic->probesize) {
2308
av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit %d reached\n", ic->probesize);
2312
/* NOTE: a new stream can be added there if no header in file
2313
(AVFMTCTX_NOHEADER) */
2314
ret = av_read_frame_internal(ic, &pkt1);
2315
if (ret < 0 && ret != AVERROR(EAGAIN)) {
2317
ret = -1; /* we could not have all the codec parameters before EOF */
2318
for(i=0;i<ic->nb_streams;i++) {
2319
st = ic->streams[i];
2320
if (!has_codec_parameters(st->codec)){
2322
avcodec_string(buf, sizeof(buf), st->codec, 0);
2323
av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
2331
if (ret == AVERROR(EAGAIN))
2334
pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2335
if ((ret = av_dup_packet(pkt)) < 0)
2336
goto find_stream_info_err;
2338
read_size += pkt->size;
2340
st = ic->streams[pkt->stream_index];
2341
if (st->codec_info_nb_frames>1) {
2342
if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2343
av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
2346
st->info->codec_info_duration += pkt->duration;
2349
int64_t last = st->info->last_dts;
2350
int64_t duration= pkt->dts - last;
2352
if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2353
double dur= duration * av_q2d(st->time_base);
2355
// if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2356
// av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2357
if (st->info->duration_count < 2)
2358
memset(st->info->duration_error, 0, sizeof(st->info->duration_error));
2359
for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
2360
int framerate= get_std_framerate(i);
2361
int ticks= lrintf(dur*framerate/(1001*12));
2362
double error= dur - ticks*1001*12/(double)framerate;
2363
st->info->duration_error[i] += error*error;
2365
st->info->duration_count++;
2366
// ignore the first 4 values, they might have some random jitter
2367
if (st->info->duration_count > 3)
2368
st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
2370
if (last == AV_NOPTS_VALUE || st->info->duration_count <= 1)
2371
st->info->last_dts = pkt->dts;
2373
if(st->parser && st->parser->parser->split && !st->codec->extradata){
2374
int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2376
st->codec->extradata_size= i;
2377
st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2378
memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2379
memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2383
/* if still no information, we try to open the codec and to
2384
decompress the frame. We try to avoid that in most cases as
2385
it takes longer and uses more memory. For MPEG-4, we need to
2386
decompress for QuickTime. */
2387
if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
2388
try_decode_frame(st, pkt);
2390
st->codec_info_nb_frames++;
2394
// close codecs which were opened in try_decode_frame()
2395
for(i=0;i<ic->nb_streams;i++) {
2396
st = ic->streams[i];
2397
if(st->codec->codec)
2398
avcodec_close(st->codec);
2400
for(i=0;i<ic->nb_streams;i++) {
2401
st = ic->streams[i];
2402
if (st->codec_info_nb_frames>2 && !st->avg_frame_rate.num && st->info->codec_info_duration)
2403
av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
2404
(st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
2405
st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
2406
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2407
if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2408
st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2410
// the check for tb_unreliable() is not completely correct, since this is not about handling
2411
// a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
2412
// ipmovie.c produces.
2413
if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
2414
av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
2415
if (st->info->duration_count && !st->r_frame_rate.num
2416
&& tb_unreliable(st->codec) /*&&
2417
//FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2418
st->time_base.num*duration_sum[i]/st->info->duration_count*101LL > st->time_base.den*/){
2420
double best_error= 2*av_q2d(st->time_base);
2421
best_error = best_error*best_error*st->info->duration_count*1000*12*30;
2423
for (j=1; j<FF_ARRAY_ELEMS(st->info->duration_error); j++) {
2424
double error = st->info->duration_error[j] * get_std_framerate(j);
2425
// if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2426
// av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2427
if(error < best_error){
2429
num = get_std_framerate(j);
2432
// do not increase frame rate by more than 1 % in order to match a standard rate.
2433
if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
2434
av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
2437
if (!st->r_frame_rate.num){
2438
if( st->codec->time_base.den * (int64_t)st->time_base.num
2439
<= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
2440
st->r_frame_rate.num = st->codec->time_base.den;
2441
st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
2443
st->r_frame_rate.num = st->time_base.den;
2444
st->r_frame_rate.den = st->time_base.num;
2447
}else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
2448
if(!st->codec->bits_per_coded_sample)
2449
st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2450
// set stream disposition based on audio service type
2451
switch (st->codec->audio_service_type) {
2452
case AV_AUDIO_SERVICE_TYPE_EFFECTS:
2453
st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
2454
case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
2455
st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
2456
case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
2457
st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
2458
case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
2459
st->disposition = AV_DISPOSITION_COMMENT; break;
2460
case AV_AUDIO_SERVICE_TYPE_KARAOKE:
2461
st->disposition = AV_DISPOSITION_KARAOKE; break;
2466
av_estimate_timings(ic, old_offset);
2468
compute_chapters_end(ic);
2471
/* correct DTS for B-frame streams with no timestamps */
2472
for(i=0;i<ic->nb_streams;i++) {
2473
st = ic->streams[i];
2474
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2476
ppktl = &ic->packet_buffer;
2478
if(ppkt1->stream_index != i)
2480
if(ppkt1->pkt->dts < 0)
2482
if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2484
ppkt1->pkt->dts -= delta;
2489
st->cur_dts -= delta;
2495
find_stream_info_err:
2496
for (i=0; i < ic->nb_streams; i++)
2497
av_freep(&ic->streams[i]->info);
2501
static AVProgram *find_program_from_stream(AVFormatContext *ic, int s)
2505
for (i = 0; i < ic->nb_programs; i++)
2506
for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
2507
if (ic->programs[i]->stream_index[j] == s)
2508
return ic->programs[i];
2512
int av_find_best_stream(AVFormatContext *ic,
2513
enum AVMediaType type,
2514
int wanted_stream_nb,
2516
AVCodec **decoder_ret,
2519
int i, nb_streams = ic->nb_streams;
2520
int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1;
2521
unsigned *program = NULL;
2522
AVCodec *decoder = NULL, *best_decoder = NULL;
2524
if (related_stream >= 0 && wanted_stream_nb < 0) {
2525
AVProgram *p = find_program_from_stream(ic, related_stream);
2527
program = p->stream_index;
2528
nb_streams = p->nb_stream_indexes;
2531
for (i = 0; i < nb_streams; i++) {
2532
int real_stream_index = program ? program[i] : i;
2533
AVStream *st = ic->streams[real_stream_index];
2534
AVCodecContext *avctx = st->codec;
2535
if (avctx->codec_type != type)
2537
if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
2539
if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
2542
decoder = avcodec_find_decoder(st->codec->codec_id);
2545
ret = AVERROR_DECODER_NOT_FOUND;
2549
if (best_count >= st->codec_info_nb_frames)
2551
best_count = st->codec_info_nb_frames;
2552
ret = real_stream_index;
2553
best_decoder = decoder;
2554
if (program && i == nb_streams - 1 && ret < 0) {
2556
nb_streams = ic->nb_streams;
2557
i = 0; /* no related stream found, try again with everything */
2561
*decoder_ret = best_decoder;
2565
/*******************************************************/
2567
int av_read_play(AVFormatContext *s)
2569
if (s->iformat->read_play)
2570
return s->iformat->read_play(s);
2572
return avio_pause(s->pb, 0);
2573
return AVERROR(ENOSYS);
2576
int av_read_pause(AVFormatContext *s)
2578
if (s->iformat->read_pause)
2579
return s->iformat->read_pause(s);
2581
return avio_pause(s->pb, 1);
2582
return AVERROR(ENOSYS);
2585
void av_close_input_stream(AVFormatContext *s)
2587
flush_packet_queue(s);
2588
if (s->iformat->read_close)
2589
s->iformat->read_close(s);
2590
avformat_free_context(s);
2593
void avformat_free_context(AVFormatContext *s)
2599
if (s->iformat && s->iformat->priv_class && s->priv_data)
2600
av_opt_free(s->priv_data);
2602
for(i=0;i<s->nb_streams;i++) {
2603
/* free all data in a stream component */
2606
av_parser_close(st->parser);
2607
av_free_packet(&st->cur_pkt);
2609
av_dict_free(&st->metadata);
2610
av_free(st->index_entries);
2611
av_free(st->codec->extradata);
2612
av_free(st->codec->subtitle_header);
2614
av_free(st->priv_data);
2618
for(i=s->nb_programs-1; i>=0; i--) {
2619
av_dict_free(&s->programs[i]->metadata);
2620
av_freep(&s->programs[i]->stream_index);
2621
av_freep(&s->programs[i]);
2623
av_freep(&s->programs);
2624
av_freep(&s->priv_data);
2625
while(s->nb_chapters--) {
2626
av_dict_free(&s->chapters[s->nb_chapters]->metadata);
2627
av_free(s->chapters[s->nb_chapters]);
2629
av_freep(&s->chapters);
2630
av_dict_free(&s->metadata);
2631
av_freep(&s->streams);
2635
void av_close_input_file(AVFormatContext *s)
2637
AVIOContext *pb = (s->iformat->flags & AVFMT_NOFILE) || (s->flags & AVFMT_FLAG_CUSTOM_IO) ?
2639
av_close_input_stream(s);
2644
AVStream *av_new_stream(AVFormatContext *s, int id)
2650
if (s->nb_streams >= INT_MAX/sizeof(*streams))
2652
streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
2655
s->streams = streams;
2657
st = av_mallocz(sizeof(AVStream));
2660
if (!(st->info = av_mallocz(sizeof(*st->info)))) {
2665
st->codec= avcodec_alloc_context();
2667
/* no default bitrate if decoding */
2668
st->codec->bit_rate = 0;
2670
st->index = s->nb_streams;
2672
st->start_time = AV_NOPTS_VALUE;
2673
st->duration = AV_NOPTS_VALUE;
2674
/* we set the current DTS to 0 so that formats without any timestamps
2675
but durations get some timestamps, formats with some unknown
2676
timestamps have their first few packets buffered and the
2677
timestamps corrected before they are returned to the user */
2679
st->first_dts = AV_NOPTS_VALUE;
2680
st->probe_packets = MAX_PROBE_PACKETS;
2682
/* default pts setting is MPEG-like */
2683
av_set_pts_info(st, 33, 1, 90000);
2684
st->last_IP_pts = AV_NOPTS_VALUE;
2685
for(i=0; i<MAX_REORDER_DELAY+1; i++)
2686
st->pts_buffer[i]= AV_NOPTS_VALUE;
2687
st->reference_dts = AV_NOPTS_VALUE;
2689
st->sample_aspect_ratio = (AVRational){0,1};
2691
s->streams[s->nb_streams++] = st;
2695
AVProgram *av_new_program(AVFormatContext *ac, int id)
2697
AVProgram *program=NULL;
2700
av_dlog(ac, "new_program: id=0x%04x\n", id);
2702
for(i=0; i<ac->nb_programs; i++)
2703
if(ac->programs[i]->id == id)
2704
program = ac->programs[i];
2707
program = av_mallocz(sizeof(AVProgram));
2710
dynarray_add(&ac->programs, &ac->nb_programs, program);
2711
program->discard = AVDISCARD_NONE;
2718
AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2720
AVChapter *chapter = NULL;
2723
for(i=0; i<s->nb_chapters; i++)
2724
if(s->chapters[i]->id == id)
2725
chapter = s->chapters[i];
2728
chapter= av_mallocz(sizeof(AVChapter));
2731
dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2733
av_dict_set(&chapter->metadata, "title", title, 0);
2735
chapter->time_base= time_base;
2736
chapter->start = start;
2742
/************************************************************/
2743
/* output media file */
2745
#if FF_API_FORMAT_PARAMETERS
2746
int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2750
if (s->oformat->priv_data_size > 0) {
2751
s->priv_data = av_mallocz(s->oformat->priv_data_size);
2753
return AVERROR(ENOMEM);
2754
if (s->oformat->priv_class) {
2755
*(const AVClass**)s->priv_data= s->oformat->priv_class;
2756
av_opt_set_defaults(s->priv_data);
2759
s->priv_data = NULL;
2761
if (s->oformat->set_parameters) {
2762
ret = s->oformat->set_parameters(s, ap);
2770
static int validate_codec_tag(AVFormatContext *s, AVStream *st)
2772
const AVCodecTag *avctag;
2774
enum CodecID id = CODEC_ID_NONE;
2775
unsigned int tag = 0;
2778
* Check that tag + id is in the table
2779
* If neither is in the table -> OK
2780
* If tag is in the table with another id -> FAIL
2781
* If id is in the table with another tag -> FAIL unless strict < normal
2783
for (n = 0; s->oformat->codec_tag[n]; n++) {
2784
avctag = s->oformat->codec_tag[n];
2785
while (avctag->id != CODEC_ID_NONE) {
2786
if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
2788
if (id == st->codec->codec_id)
2791
if (avctag->id == st->codec->codec_id)
2796
if (id != CODEC_ID_NONE)
2798
if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
2803
#if FF_API_FORMAT_PARAMETERS
2804
int av_write_header(AVFormatContext *s)
2806
return avformat_write_header(s, NULL);
2810
int avformat_write_header(AVFormatContext *s, AVDictionary **options)
2814
AVDictionary *tmp = NULL;
2817
av_dict_copy(&tmp, *options, 0);
2818
if ((ret = av_opt_set_dict(s, &tmp)) < 0)
2821
// some sanity checks
2822
if (s->nb_streams == 0 && !(s->oformat->flags & AVFMT_NOSTREAMS)) {
2823
av_log(s, AV_LOG_ERROR, "no streams\n");
2824
ret = AVERROR(EINVAL);
2828
for(i=0;i<s->nb_streams;i++) {
2831
switch (st->codec->codec_type) {
2832
case AVMEDIA_TYPE_AUDIO:
2833
if(st->codec->sample_rate<=0){
2834
av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2835
ret = AVERROR(EINVAL);
2838
if(!st->codec->block_align)
2839
st->codec->block_align = st->codec->channels *
2840
av_get_bits_per_sample(st->codec->codec_id) >> 3;
2842
case AVMEDIA_TYPE_VIDEO:
2843
if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2844
av_log(s, AV_LOG_ERROR, "time base not set\n");
2845
ret = AVERROR(EINVAL);
2848
if((st->codec->width<=0 || st->codec->height<=0) && !(s->oformat->flags & AVFMT_NODIMENSIONS)){
2849
av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2850
ret = AVERROR(EINVAL);
2853
if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2854
av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2855
ret = AVERROR(EINVAL);
2861
if(s->oformat->codec_tag){
2862
if(st->codec->codec_tag && st->codec->codec_id == CODEC_ID_RAWVIDEO && av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id) == 0 && !validate_codec_tag(s, st)){
2863
//the current rawvideo encoding system ends up setting the wrong codec_tag for avi, we override it here
2864
st->codec->codec_tag= 0;
2866
if(st->codec->codec_tag){
2867
if (!validate_codec_tag(s, st)) {
2869
av_get_codec_tag_string(tagbuf, sizeof(tagbuf), st->codec->codec_tag);
2870
av_log(s, AV_LOG_ERROR,
2871
"Tag %s/0x%08x incompatible with output codec id '%d'\n",
2872
tagbuf, st->codec->codec_tag, st->codec->codec_id);
2873
ret = AVERROR_INVALIDDATA;
2877
st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2880
if(s->oformat->flags & AVFMT_GLOBALHEADER &&
2881
!(st->codec->flags & CODEC_FLAG_GLOBAL_HEADER))
2882
av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers but container format requires global headers\n", i);
2885
if (!s->priv_data && s->oformat->priv_data_size > 0) {
2886
s->priv_data = av_mallocz(s->oformat->priv_data_size);
2887
if (!s->priv_data) {
2888
ret = AVERROR(ENOMEM);
2891
if (s->oformat->priv_class) {
2892
*(const AVClass**)s->priv_data= s->oformat->priv_class;
2893
av_opt_set_defaults(s->priv_data);
2894
if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
2899
/* set muxer identification string */
2900
if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2901
av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
2904
if(s->oformat->write_header){
2905
ret = s->oformat->write_header(s);
2910
/* init PTS generation */
2911
for(i=0;i<s->nb_streams;i++) {
2912
int64_t den = AV_NOPTS_VALUE;
2915
switch (st->codec->codec_type) {
2916
case AVMEDIA_TYPE_AUDIO:
2917
den = (int64_t)st->time_base.num * st->codec->sample_rate;
2919
case AVMEDIA_TYPE_VIDEO:
2920
den = (int64_t)st->time_base.num * st->codec->time_base.den;
2925
if (den != AV_NOPTS_VALUE) {
2927
ret = AVERROR_INVALIDDATA;
2930
av_frac_init(&st->pts, 0, 0, den);
2935
av_dict_free(options);
2944
//FIXME merge with compute_pkt_fields
2945
static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt){
2946
int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2947
int num, den, frame_size, i;
2949
av_dlog(s, "compute_pkt_fields2: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n",
2950
pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2952
/* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2953
return AVERROR(EINVAL);*/
2955
/* duration field */
2956
if (pkt->duration == 0) {
2957
compute_frame_duration(&num, &den, st, NULL, pkt);
2959
pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
2963
if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2966
//XXX/FIXME this is a temporary hack until all encoders output pts
2967
if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2969
// pkt->pts= st->cur_dts;
2970
pkt->pts= st->pts.val;
2973
//calculate dts from pts
2974
if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2975
st->pts_buffer[0]= pkt->pts;
2976
for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2977
st->pts_buffer[i]= pkt->pts + (i-delay-1) * pkt->duration;
2978
for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2979
FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2981
pkt->dts= st->pts_buffer[0];
2984
if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2985
av_log(s, AV_LOG_ERROR,
2986
"Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
2987
st->index, st->cur_dts, pkt->dts);
2988
return AVERROR(EINVAL);
2990
if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2991
av_log(s, AV_LOG_ERROR, "pts < dts in stream %d\n", st->index);
2992
return AVERROR(EINVAL);
2995
// av_log(s, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2996
st->cur_dts= pkt->dts;
2997
st->pts.val= pkt->dts;
3000
switch (st->codec->codec_type) {
3001
case AVMEDIA_TYPE_AUDIO:
3002
frame_size = get_audio_frame_size(st->codec, pkt->size);
3004
/* HACK/FIXME, we skip the initial 0 size packets as they are most
3005
likely equal to the encoder delay, but it would be better if we
3006
had the real timestamps from the encoder */
3007
if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
3008
av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
3011
case AVMEDIA_TYPE_VIDEO:
3012
av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
3020
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
3022
int ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt);
3024
if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3027
ret= s->oformat->write_packet(s, pkt);
3031
void ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
3032
int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
3034
AVPacketList **next_point, *this_pktl;
3036
this_pktl = av_mallocz(sizeof(AVPacketList));
3037
this_pktl->pkt= *pkt;
3038
pkt->destruct= NULL; // do not free original but only the copy
3039
av_dup_packet(&this_pktl->pkt); // duplicate the packet if it uses non-alloced memory
3041
if(s->streams[pkt->stream_index]->last_in_packet_buffer){
3042
next_point = &(s->streams[pkt->stream_index]->last_in_packet_buffer->next);
3044
next_point = &s->packet_buffer;
3047
if(compare(s, &s->packet_buffer_end->pkt, pkt)){
3048
while(!compare(s, &(*next_point)->pkt, pkt)){
3049
next_point= &(*next_point)->next;
3053
next_point = &(s->packet_buffer_end->next);
3056
assert(!*next_point);
3058
s->packet_buffer_end= this_pktl;
3061
this_pktl->next= *next_point;
3063
s->streams[pkt->stream_index]->last_in_packet_buffer=
3064
*next_point= this_pktl;
3067
static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
3069
AVStream *st = s->streams[ pkt ->stream_index];
3070
AVStream *st2= s->streams[ next->stream_index];
3071
int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
3075
return pkt->stream_index < next->stream_index;
3079
int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
3085
ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
3088
for(i=0; i < s->nb_streams; i++)
3089
stream_count+= !!s->streams[i]->last_in_packet_buffer;
3091
if(stream_count && (s->nb_streams == stream_count || flush)){
3092
pktl= s->packet_buffer;
3095
s->packet_buffer= pktl->next;
3096
if(!s->packet_buffer)
3097
s->packet_buffer_end= NULL;
3099
if(s->streams[out->stream_index]->last_in_packet_buffer == pktl)
3100
s->streams[out->stream_index]->last_in_packet_buffer= NULL;
3104
av_init_packet(out);
3110
* Interleave an AVPacket correctly so it can be muxed.
3111
* @param out the interleaved packet will be output here
3112
* @param in the input packet
3113
* @param flush 1 if no further packets are available as input and all
3114
* remaining packets should be output
3115
* @return 1 if a packet was output, 0 if no packet could be output,
3116
* < 0 if an error occurred
3118
static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
3119
if(s->oformat->interleave_packet)
3120
return s->oformat->interleave_packet(s, out, in, flush);
3122
return av_interleave_packet_per_dts(s, out, in, flush);
3125
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
3126
AVStream *st= s->streams[ pkt->stream_index];
3129
//FIXME/XXX/HACK drop zero sized packets
3130
if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
3133
av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
3134
pkt->size, pkt->dts, pkt->pts);
3135
if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3138
if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
3139
return AVERROR(EINVAL);
3143
int ret= av_interleave_packet(s, &opkt, pkt, 0);
3144
if(ret<=0) //FIXME cleanup needed for ret<0 ?
3147
ret= s->oformat->write_packet(s, &opkt);
3149
av_free_packet(&opkt);
3157
int av_write_trailer(AVFormatContext *s)
3163
ret= av_interleave_packet(s, &pkt, NULL, 1);
3164
if(ret<0) //FIXME cleanup needed for ret<0 ?
3169
ret= s->oformat->write_packet(s, &pkt);
3171
av_free_packet(&pkt);
3177
if(s->oformat->write_trailer)
3178
ret = s->oformat->write_trailer(s);
3180
for(i=0;i<s->nb_streams;i++) {
3181
av_freep(&s->streams[i]->priv_data);
3182
av_freep(&s->streams[i]->index_entries);
3184
if (s->iformat && s->iformat->priv_class)
3185
av_opt_free(s->priv_data);
3186
av_freep(&s->priv_data);
3190
void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
3193
AVProgram *program=NULL;
3196
if (idx >= ac->nb_streams) {
3197
av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
3201
for(i=0; i<ac->nb_programs; i++){
3202
if(ac->programs[i]->id != progid)
3204
program = ac->programs[i];
3205
for(j=0; j<program->nb_stream_indexes; j++)
3206
if(program->stream_index[j] == idx)
3209
tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
3212
program->stream_index = tmp;
3213
program->stream_index[program->nb_stream_indexes++] = idx;
3218
static void print_fps(double d, const char *postfix){
3219
uint64_t v= lrintf(d*100);
3220
if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
3221
else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
3222
else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
3225
static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
3227
if(m && !(m->count == 1 && av_dict_get(m, "language", NULL, 0))){
3228
AVDictionaryEntry *tag=NULL;
3230
av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
3231
while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
3232
if(strcmp("language", tag->key))
3233
av_log(ctx, AV_LOG_INFO, "%s %-16s: %s\n", indent, tag->key, tag->value);
3238
/* "user interface" functions */
3239
static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
3242
int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
3243
AVStream *st = ic->streams[i];
3244
int g = av_gcd(st->time_base.num, st->time_base.den);
3245
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
3246
avcodec_string(buf, sizeof(buf), st->codec, is_output);
3247
av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
3248
/* the pid is an important information, so we display it */
3249
/* XXX: add a generic system */
3250
if (flags & AVFMT_SHOW_IDS)
3251
av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
3253
av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
3254
av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
3255
av_log(NULL, AV_LOG_INFO, ": %s", buf);
3256
if (st->sample_aspect_ratio.num && // default
3257
av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
3258
AVRational display_aspect_ratio;
3259
av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
3260
st->codec->width*st->sample_aspect_ratio.num,
3261
st->codec->height*st->sample_aspect_ratio.den,
3263
av_log(NULL, AV_LOG_INFO, ", PAR %d:%d DAR %d:%d",
3264
st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
3265
display_aspect_ratio.num, display_aspect_ratio.den);
3267
if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
3268
if(st->avg_frame_rate.den && st->avg_frame_rate.num)
3269
print_fps(av_q2d(st->avg_frame_rate), "fps");
3270
if(st->r_frame_rate.den && st->r_frame_rate.num)
3271
print_fps(av_q2d(st->r_frame_rate), "tbr");
3272
if(st->time_base.den && st->time_base.num)
3273
print_fps(1/av_q2d(st->time_base), "tbn");
3274
if(st->codec->time_base.den && st->codec->time_base.num)
3275
print_fps(1/av_q2d(st->codec->time_base), "tbc");
3277
if (st->disposition & AV_DISPOSITION_DEFAULT)
3278
av_log(NULL, AV_LOG_INFO, " (default)");
3279
if (st->disposition & AV_DISPOSITION_DUB)
3280
av_log(NULL, AV_LOG_INFO, " (dub)");
3281
if (st->disposition & AV_DISPOSITION_ORIGINAL)
3282
av_log(NULL, AV_LOG_INFO, " (original)");
3283
if (st->disposition & AV_DISPOSITION_COMMENT)
3284
av_log(NULL, AV_LOG_INFO, " (comment)");
3285
if (st->disposition & AV_DISPOSITION_LYRICS)
3286
av_log(NULL, AV_LOG_INFO, " (lyrics)");
3287
if (st->disposition & AV_DISPOSITION_KARAOKE)
3288
av_log(NULL, AV_LOG_INFO, " (karaoke)");
3289
if (st->disposition & AV_DISPOSITION_FORCED)
3290
av_log(NULL, AV_LOG_INFO, " (forced)");
3291
if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
3292
av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
3293
if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
3294
av_log(NULL, AV_LOG_INFO, " (visual impaired)");
3295
if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
3296
av_log(NULL, AV_LOG_INFO, " (clean effects)");
3297
av_log(NULL, AV_LOG_INFO, "\n");
3298
dump_metadata(NULL, st->metadata, " ");
3301
#if FF_API_DUMP_FORMAT
3302
void dump_format(AVFormatContext *ic,
3307
av_dump_format(ic, index, url, is_output);
3311
void av_dump_format(AVFormatContext *ic,
3317
uint8_t *printed = av_mallocz(ic->nb_streams);
3318
if (ic->nb_streams && !printed)
3321
av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
3322
is_output ? "Output" : "Input",
3324
is_output ? ic->oformat->name : ic->iformat->name,
3325
is_output ? "to" : "from", url);
3326
dump_metadata(NULL, ic->metadata, " ");
3328
av_log(NULL, AV_LOG_INFO, " Duration: ");
3329
if (ic->duration != AV_NOPTS_VALUE) {
3330
int hours, mins, secs, us;
3331
secs = ic->duration / AV_TIME_BASE;
3332
us = ic->duration % AV_TIME_BASE;
3337
av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
3338
(100 * us) / AV_TIME_BASE);
3340
av_log(NULL, AV_LOG_INFO, "N/A");
3342
if (ic->start_time != AV_NOPTS_VALUE) {
3344
av_log(NULL, AV_LOG_INFO, ", start: ");
3345
secs = ic->start_time / AV_TIME_BASE;
3346
us = abs(ic->start_time % AV_TIME_BASE);
3347
av_log(NULL, AV_LOG_INFO, "%d.%06d",
3348
secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
3350
av_log(NULL, AV_LOG_INFO, ", bitrate: ");
3352
av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
3354
av_log(NULL, AV_LOG_INFO, "N/A");
3356
av_log(NULL, AV_LOG_INFO, "\n");
3358
for (i = 0; i < ic->nb_chapters; i++) {
3359
AVChapter *ch = ic->chapters[i];
3360
av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
3361
av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
3362
av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
3364
dump_metadata(NULL, ch->metadata, " ");
3366
if(ic->nb_programs) {
3367
int j, k, total = 0;
3368
for(j=0; j<ic->nb_programs; j++) {
3369
AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
3371
av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
3372
name ? name->value : "");
3373
dump_metadata(NULL, ic->programs[j]->metadata, " ");
3374
for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
3375
dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
3376
printed[ic->programs[j]->stream_index[k]] = 1;
3378
total += ic->programs[j]->nb_stream_indexes;
3380
if (total < ic->nb_streams)
3381
av_log(NULL, AV_LOG_INFO, " No Program\n");
3383
for(i=0;i<ic->nb_streams;i++)
3385
dump_stream_format(ic, i, index, is_output);
3390
int64_t av_gettime(void)
3393
gettimeofday(&tv,NULL);
3394
return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
3397
uint64_t ff_ntp_time(void)
3399
return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
3402
#if FF_API_PARSE_DATE
3403
#include "libavutil/parseutils.h"
3405
int64_t parse_date(const char *timestr, int duration)
3408
av_parse_time(&timeval, timestr, duration);
3413
#if FF_API_FIND_INFO_TAG
3414
#include "libavutil/parseutils.h"
3416
int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
3418
return av_find_info_tag(arg, arg_size, tag1, info);
3422
int av_get_frame_filename(char *buf, int buf_size,
3423
const char *path, int number)
3426
char *q, buf1[20], c;
3427
int nd, len, percentd_found;
3439
while (isdigit(*p)) {
3440
nd = nd * 10 + *p++ - '0';
3443
} while (isdigit(c));
3452
snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3454
if ((q - buf + len) > buf_size - 1)
3456
memcpy(q, buf1, len);
3464
if ((q - buf) < buf_size - 1)
3468
if (!percentd_found)
3477
static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3481
#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3483
for(i=0;i<size;i+=16) {
3490
PRINT(" %02x", buf[i+j]);
3495
for(j=0;j<len;j++) {
3497
if (c < ' ' || c > '~')
3506
void av_hex_dump(FILE *f, uint8_t *buf, int size)
3508
hex_dump_internal(NULL, f, 0, buf, size);
3511
void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3513
hex_dump_internal(avcl, NULL, level, buf, size);
3516
static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
3519
#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3520
PRINT("stream #%d:\n", pkt->stream_index);
3521
PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
3522
PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
3523
/* DTS is _always_ valid after av_read_frame() */
3525
if (pkt->dts == AV_NOPTS_VALUE)
3528
PRINT("%0.3f", pkt->dts * av_q2d(time_base));
3529
/* PTS may not be known if B-frames are present. */
3531
if (pkt->pts == AV_NOPTS_VALUE)
3534
PRINT("%0.3f", pkt->pts * av_q2d(time_base));
3536
PRINT(" size=%d\n", pkt->size);
3539
av_hex_dump(f, pkt->data, pkt->size);
3543
void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3545
AVRational tb = { 1, AV_TIME_BASE };
3546
pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
3550
void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
3552
pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
3556
void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3558
AVRational tb = { 1, AV_TIME_BASE };
3559
pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
3563
void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
3566
pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
3569
void av_url_split(char *proto, int proto_size,
3570
char *authorization, int authorization_size,
3571
char *hostname, int hostname_size,
3573
char *path, int path_size,
3576
const char *p, *ls, *at, *col, *brk;
3578
if (port_ptr) *port_ptr = -1;
3579
if (proto_size > 0) proto[0] = 0;
3580
if (authorization_size > 0) authorization[0] = 0;
3581
if (hostname_size > 0) hostname[0] = 0;
3582
if (path_size > 0) path[0] = 0;
3584
/* parse protocol */
3585
if ((p = strchr(url, ':'))) {
3586
av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3591
/* no protocol means plain filename */
3592
av_strlcpy(path, url, path_size);
3596
/* separate path from hostname */
3597
ls = strchr(p, '/');
3599
ls = strchr(p, '?');
3601
av_strlcpy(path, ls, path_size);
3603
ls = &p[strlen(p)]; // XXX
3605
/* the rest is hostname, use that to parse auth/port */
3607
/* authorization (user[:pass]@hostname) */
3608
if ((at = strchr(p, '@')) && at < ls) {
3609
av_strlcpy(authorization, p,
3610
FFMIN(authorization_size, at + 1 - p));
3611
p = at + 1; /* skip '@' */
3614
if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3616
av_strlcpy(hostname, p + 1,
3617
FFMIN(hostname_size, brk - p));
3618
if (brk[1] == ':' && port_ptr)
3619
*port_ptr = atoi(brk + 2);
3620
} else if ((col = strchr(p, ':')) && col < ls) {
3621
av_strlcpy(hostname, p,
3622
FFMIN(col + 1 - p, hostname_size));
3623
if (port_ptr) *port_ptr = atoi(col + 1);
3625
av_strlcpy(hostname, p,
3626
FFMIN(ls + 1 - p, hostname_size));
3630
char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
3633
static const char hex_table_uc[16] = { '0', '1', '2', '3',
3636
'C', 'D', 'E', 'F' };
3637
static const char hex_table_lc[16] = { '0', '1', '2', '3',
3640
'c', 'd', 'e', 'f' };
3641
const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
3643
for(i = 0; i < s; i++) {
3644
buff[i * 2] = hex_table[src[i] >> 4];
3645
buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3651
int ff_hex_to_data(uint8_t *data, const char *p)
3658
p += strspn(p, SPACE_CHARS);
3661
c = toupper((unsigned char) *p++);
3662
if (c >= '0' && c <= '9')
3664
else if (c >= 'A' && c <= 'F')
3679
void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3680
unsigned int pts_num, unsigned int pts_den)
3683
if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
3684
if(new_tb.num != pts_num)
3685
av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
3687
av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
3689
if(new_tb.num <= 0 || new_tb.den <= 0) {
3690
av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase for st:%d\n", s->index);
3693
s->time_base = new_tb;
3694
s->pts_wrap_bits = pts_wrap_bits;
3697
int ff_url_join(char *str, int size, const char *proto,
3698
const char *authorization, const char *hostname,
3699
int port, const char *fmt, ...)
3702
struct addrinfo hints, *ai;
3707
av_strlcatf(str, size, "%s://", proto);
3708
if (authorization && authorization[0])
3709
av_strlcatf(str, size, "%s@", authorization);
3710
#if CONFIG_NETWORK && defined(AF_INET6)
3711
/* Determine if hostname is a numerical IPv6 address,
3712
* properly escape it within [] in that case. */
3713
memset(&hints, 0, sizeof(hints));
3714
hints.ai_flags = AI_NUMERICHOST;
3715
if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
3716
if (ai->ai_family == AF_INET6) {
3717
av_strlcat(str, "[", size);
3718
av_strlcat(str, hostname, size);
3719
av_strlcat(str, "]", size);
3721
av_strlcat(str, hostname, size);
3726
/* Not an IPv6 address, just output the plain string. */
3727
av_strlcat(str, hostname, size);
3730
av_strlcatf(str, size, ":%d", port);
3733
int len = strlen(str);
3736
vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
3742
int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
3743
AVFormatContext *src)
3748
local_pkt.stream_index = dst_stream;
3749
if (pkt->pts != AV_NOPTS_VALUE)
3750
local_pkt.pts = av_rescale_q(pkt->pts,
3751
src->streams[pkt->stream_index]->time_base,
3752
dst->streams[dst_stream]->time_base);
3753
if (pkt->dts != AV_NOPTS_VALUE)
3754
local_pkt.dts = av_rescale_q(pkt->dts,
3755
src->streams[pkt->stream_index]->time_base,
3756
dst->streams[dst_stream]->time_base);
3757
return av_write_frame(dst, &local_pkt);
3760
void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
3763
const char *ptr = str;
3765
/* Parse key=value pairs. */
3768
char *dest = NULL, *dest_end;
3769
int key_len, dest_len = 0;
3771
/* Skip whitespace and potential commas. */
3772
while (*ptr && (isspace(*ptr) || *ptr == ','))
3779
if (!(ptr = strchr(key, '=')))
3782
key_len = ptr - key;
3784
callback_get_buf(context, key, key_len, &dest, &dest_len);
3785
dest_end = dest + dest_len - 1;
3789
while (*ptr && *ptr != '\"') {
3793
if (dest && dest < dest_end)
3797
if (dest && dest < dest_end)
3805
for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++)
3806
if (dest && dest < dest_end)
3814
int ff_find_stream_index(AVFormatContext *s, int id)
3817
for (i = 0; i < s->nb_streams; i++) {
3818
if (s->streams[i]->id == id)
3824
void ff_make_absolute_url(char *buf, int size, const char *base,
3828
/* Absolute path, relative to the current server */
3829
if (base && strstr(base, "://") && rel[0] == '/') {
3831
av_strlcpy(buf, base, size);
3832
sep = strstr(buf, "://");
3835
sep = strchr(sep, '/');
3839
av_strlcat(buf, rel, size);
3842
/* If rel actually is an absolute url, just copy it */
3843
if (!base || strstr(rel, "://") || rel[0] == '/') {
3844
av_strlcpy(buf, rel, size);
3848
av_strlcpy(buf, base, size);
3849
/* Remove the file name from the base url */
3850
sep = strrchr(buf, '/');
3855
while (av_strstart(rel, "../", NULL) && sep) {
3856
/* Remove the path delimiter at the end */
3858
sep = strrchr(buf, '/');
3859
/* If the next directory name to pop off is "..", break here */
3860
if (!strcmp(sep ? &sep[1] : buf, "..")) {
3861
/* Readd the slash we just removed */
3862
av_strlcat(buf, "/", size);
3865
/* Cut off the directory name */
3872
av_strlcat(buf, rel, size);