2 * various utility functions for use within FFmpeg
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavcodec/opt.h"
25 #include "libavutil/avstring.h"
35 * @file libavformat/utils.c
36 * various utility functions for use within FFmpeg
39 unsigned avformat_version(void)
41 return LIBAVFORMAT_VERSION_INT;
44 /* fraction handling */
47 * f = val + (num / den) + 0.5.
49 * 'num' is normalized so that it is such as 0 <= num < den.
51 * @param f fractional number
52 * @param val integer value
53 * @param num must be >= 0
54 * @param den must be >= 1
56 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den)
69 * Fractional addition to f: f = f + (incr / f->den).
71 * @param f fractional number
72 * @param incr increment, can be positive or negative
74 static void av_frac_add(AVFrac *f, int64_t incr)
87 } else if (num >= den) {
94 /** head of registered input format linked list */
95 AVInputFormat *first_iformat = NULL;
96 /** head of registered output format linked list */
97 AVOutputFormat *first_oformat = NULL;
99 AVInputFormat *av_iformat_next(AVInputFormat *f)
101 if(f) return f->next;
102 else return first_iformat;
105 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
107 if(f) return f->next;
108 else return first_oformat;
111 void av_register_input_format(AVInputFormat *format)
115 while (*p != NULL) p = &(*p)->next;
120 void av_register_output_format(AVOutputFormat *format)
124 while (*p != NULL) p = &(*p)->next;
129 int match_ext(const char *filename, const char *extensions)
137 ext = strrchr(filename, '.');
143 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
146 if (!strcasecmp(ext1, ext))
156 AVOutputFormat *guess_format(const char *short_name, const char *filename,
157 const char *mime_type)
159 AVOutputFormat *fmt, *fmt_found;
160 int score_max, score;
162 /* specific test for image sequences */
163 #ifdef CONFIG_IMAGE2_MUXER
164 if (!short_name && filename &&
165 av_filename_number_test(filename) &&
166 av_guess_image2_codec(filename) != CODEC_ID_NONE) {
167 return guess_format("image2", NULL, NULL);
170 /* Find the proper file type. */
174 while (fmt != NULL) {
176 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
178 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
180 if (filename && fmt->extensions &&
181 match_ext(filename, fmt->extensions)) {
184 if (score > score_max) {
193 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
194 const char *mime_type)
196 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
199 AVOutputFormat *stream_fmt;
200 char stream_format_name[64];
202 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
203 stream_fmt = guess_format(stream_format_name, NULL, NULL);
212 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
213 const char *filename, const char *mime_type, enum CodecType type){
214 if(type == CODEC_TYPE_VIDEO){
215 enum CodecID codec_id= CODEC_ID_NONE;
217 #ifdef CONFIG_IMAGE2_MUXER
218 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
219 codec_id= av_guess_image2_codec(filename);
222 if(codec_id == CODEC_ID_NONE)
223 codec_id= fmt->video_codec;
225 }else if(type == CODEC_TYPE_AUDIO)
226 return fmt->audio_codec;
228 return CODEC_ID_NONE;
231 AVInputFormat *av_find_input_format(const char *short_name)
234 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
235 if (!strcmp(fmt->name, short_name))
241 /* memory handling */
243 void av_destruct_packet(AVPacket *pkt)
246 pkt->data = NULL; pkt->size = 0;
249 void av_init_packet(AVPacket *pkt)
251 pkt->pts = AV_NOPTS_VALUE;
252 pkt->dts = AV_NOPTS_VALUE;
255 pkt->convergence_duration = 0;
257 pkt->stream_index = 0;
258 pkt->destruct= av_destruct_packet_nofree;
261 int av_new_packet(AVPacket *pkt, int size)
264 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
265 return AVERROR(ENOMEM);
266 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
268 return AVERROR(ENOMEM);
269 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
274 pkt->destruct = av_destruct_packet;
278 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
280 int ret= av_new_packet(pkt, size);
285 pkt->pos= url_ftell(s);
287 ret= get_buffer(s, pkt->data, size);
296 int av_dup_packet(AVPacket *pkt)
298 if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
300 /* We duplicate the packet and don't forget to add the padding again. */
301 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
302 return AVERROR(ENOMEM);
303 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
305 return AVERROR(ENOMEM);
307 memcpy(data, pkt->data, pkt->size);
308 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
310 pkt->destruct = av_destruct_packet;
315 int av_filename_number_test(const char *filename)
318 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
321 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
323 AVInputFormat *fmt1, *fmt;
327 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
328 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
331 if (fmt1->read_probe) {
332 score = fmt1->read_probe(pd);
333 } else if (fmt1->extensions) {
334 if (match_ext(pd->filename, fmt1->extensions)) {
338 if (score > *score_max) {
341 }else if (score == *score_max)
347 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
349 return av_probe_input_format2(pd, is_opened, &score);
352 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
355 fmt = av_probe_input_format2(pd, 1, &score);
358 if (!strcmp(fmt->name, "mp3")) {
359 st->codec->codec_id = CODEC_ID_MP3;
360 st->codec->codec_type = CODEC_TYPE_AUDIO;
361 } else if (!strcmp(fmt->name, "ac3")) {
362 st->codec->codec_id = CODEC_ID_AC3;
363 st->codec->codec_type = CODEC_TYPE_AUDIO;
364 } else if (!strcmp(fmt->name, "mpegvideo")) {
365 st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
366 st->codec->codec_type = CODEC_TYPE_VIDEO;
367 } else if (!strcmp(fmt->name, "m4v")) {
368 st->codec->codec_id = CODEC_ID_MPEG4;
369 st->codec->codec_type = CODEC_TYPE_VIDEO;
370 } else if (!strcmp(fmt->name, "h264")) {
371 st->codec->codec_id = CODEC_ID_H264;
372 st->codec->codec_type = CODEC_TYPE_VIDEO;
378 /************************************************************/
379 /* input media file */
382 * Open a media file from an IO stream. 'fmt' must be specified.
384 int av_open_input_stream(AVFormatContext **ic_ptr,
385 ByteIOContext *pb, const char *filename,
386 AVInputFormat *fmt, AVFormatParameters *ap)
390 AVFormatParameters default_ap;
394 memset(ap, 0, sizeof(default_ap));
397 if(!ap->prealloced_context)
398 ic = av_alloc_format_context();
402 err = AVERROR(ENOMEM);
407 ic->duration = AV_NOPTS_VALUE;
408 ic->start_time = AV_NOPTS_VALUE;
409 av_strlcpy(ic->filename, filename, sizeof(ic->filename));
411 /* allocate private data */
412 if (fmt->priv_data_size > 0) {
413 ic->priv_data = av_mallocz(fmt->priv_data_size);
414 if (!ic->priv_data) {
415 err = AVERROR(ENOMEM);
419 ic->priv_data = NULL;
422 if (ic->iformat->read_header) {
423 err = ic->iformat->read_header(ic, ap);
428 if (pb && !ic->data_offset)
429 ic->data_offset = url_ftell(ic->pb);
431 #if LIBAVFORMAT_VERSION_MAJOR < 53
432 ff_metadata_demux_compat(ic);
440 av_freep(&ic->priv_data);
441 for(i=0;i<ic->nb_streams;i++) {
442 AVStream *st = ic->streams[i];
444 av_free(st->priv_data);
445 av_free(st->codec->extradata);
455 /** size of probe buffer, for guessing file type from file contents */
456 #define PROBE_BUF_MIN 2048
457 #define PROBE_BUF_MAX (1<<20)
459 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
462 AVFormatParameters *ap)
465 AVProbeData probe_data, *pd = &probe_data;
466 ByteIOContext *pb = NULL;
470 pd->filename = filename;
475 /* guess format if no file can be opened */
476 fmt = av_probe_input_format(pd, 0);
479 /* Do not open file if the format does not need it. XXX: specific
480 hack needed to handle RTSP/TCP */
481 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
482 /* if no file needed do not try to open one */
483 if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) {
487 url_setbufsize(pb, buf_size);
490 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){
491 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0;
492 /* read probe data */
493 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE);
494 pd->buf_size = get_buffer(pb, pd->buf, probe_size);
495 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
496 if (url_fseek(pb, 0, SEEK_SET) < 0) {
498 if (url_fopen(&pb, filename, URL_RDONLY) < 0) {
504 /* guess file format */
505 fmt = av_probe_input_format2(pd, 1, &score);
510 /* if still no format found, error */
516 /* check filename in case an image number is expected */
517 if (fmt->flags & AVFMT_NEEDNUMBER) {
518 if (!av_filename_number_test(filename)) {
519 err = AVERROR_NUMEXPECTED;
523 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
536 /*******************************************************/
538 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
539 AVPacketList **plast_pktl){
540 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
545 (*plast_pktl)->next = pktl;
547 *packet_buffer = pktl;
549 /* add the packet in the buffered packet list */
555 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
561 AVPacketList *pktl = s->raw_packet_buffer;
565 if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE){
566 s->raw_packet_buffer = pktl->next;
573 ret= s->iformat->read_packet(s, pkt);
576 st= s->streams[pkt->stream_index];
578 switch(st->codec->codec_type){
579 case CODEC_TYPE_VIDEO:
580 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
582 case CODEC_TYPE_AUDIO:
583 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
585 case CODEC_TYPE_SUBTITLE:
586 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
590 if(!pktl && st->codec->codec_id!=CODEC_ID_PROBE)
593 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
595 if(st->codec->codec_id == CODEC_ID_PROBE){
596 AVProbeData *pd = &st->probe_data;
598 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
599 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
600 pd->buf_size += pkt->size;
601 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
603 if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
604 set_codec_from_probe_data(st, pd, 1);
605 if(st->codec->codec_id != CODEC_ID_PROBE){
614 /**********************************************************/
617 * Get the number of samples of an audio frame. Return -1 on error.
619 static int get_audio_frame_size(AVCodecContext *enc, int size)
623 if(enc->codec_id == CODEC_ID_VORBIS)
626 if (enc->frame_size <= 1) {
627 int bits_per_sample = av_get_bits_per_sample(enc->codec_id);
629 if (bits_per_sample) {
630 if (enc->channels == 0)
632 frame_size = (size << 3) / (bits_per_sample * enc->channels);
634 /* used for example by ADPCM codecs */
635 if (enc->bit_rate == 0)
637 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate;
640 frame_size = enc->frame_size;
647 * Return the frame duration in seconds. Return 0 if not available.
649 static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
650 AVCodecParserContext *pc, AVPacket *pkt)
656 switch(st->codec->codec_type) {
657 case CODEC_TYPE_VIDEO:
658 if(st->time_base.num*1000LL > st->time_base.den){
659 *pnum = st->time_base.num;
660 *pden = st->time_base.den;
661 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
662 *pnum = st->codec->time_base.num;
663 *pden = st->codec->time_base.den;
664 if (pc && pc->repeat_pict) {
666 *pnum = (*pnum) * (2 + pc->repeat_pict);
670 case CODEC_TYPE_AUDIO:
671 frame_size = get_audio_frame_size(st->codec, pkt->size);
675 *pden = st->codec->sample_rate;
682 static int is_intra_only(AVCodecContext *enc){
683 if(enc->codec_type == CODEC_TYPE_AUDIO){
685 }else if(enc->codec_type == CODEC_TYPE_VIDEO){
686 switch(enc->codec_id){
688 case CODEC_ID_MJPEGB:
690 case CODEC_ID_RAWVIDEO:
691 case CODEC_ID_DVVIDEO:
692 case CODEC_ID_HUFFYUV:
693 case CODEC_ID_FFVHUFF:
705 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
706 int64_t dts, int64_t pts)
708 AVStream *st= s->streams[stream_index];
709 AVPacketList *pktl= s->packet_buffer;
711 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE)
714 st->first_dts= dts - st->cur_dts;
717 for(; pktl; pktl= pktl->next){
718 if(pktl->pkt.stream_index != stream_index)
720 //FIXME think more about this check
721 if(pktl->pkt.pts != AV_NOPTS_VALUE && pktl->pkt.pts == pktl->pkt.dts)
722 pktl->pkt.pts += st->first_dts;
724 if(pktl->pkt.dts != AV_NOPTS_VALUE)
725 pktl->pkt.dts += st->first_dts;
727 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
728 st->start_time= pktl->pkt.pts;
730 if (st->start_time == AV_NOPTS_VALUE)
731 st->start_time = pts;
734 static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
736 AVPacketList *pktl= s->packet_buffer;
739 if(st->first_dts != AV_NOPTS_VALUE){
740 cur_dts= st->first_dts;
741 for(; pktl; pktl= pktl->next){
742 if(pktl->pkt.stream_index == pkt->stream_index){
743 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
745 cur_dts -= pkt->duration;
748 pktl= s->packet_buffer;
749 st->first_dts = cur_dts;
750 }else if(st->cur_dts)
753 for(; pktl; pktl= pktl->next){
754 if(pktl->pkt.stream_index != pkt->stream_index)
756 if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE
757 && !pktl->pkt.duration){
758 pktl->pkt.dts= cur_dts;
759 if(!st->codec->has_b_frames)
760 pktl->pkt.pts= cur_dts;
761 cur_dts += pkt->duration;
762 pktl->pkt.duration= pkt->duration;
766 if(st->first_dts == AV_NOPTS_VALUE)
767 st->cur_dts= cur_dts;
770 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
771 AVCodecParserContext *pc, AVPacket *pkt)
773 int num, den, presentation_delayed, delay, i;
776 /* do we have a video B-frame ? */
777 delay= st->codec->has_b_frames;
778 presentation_delayed = 0;
779 /* XXX: need has_b_frame, but cannot get it if the codec is
782 pc && pc->pict_type != FF_B_TYPE)
783 presentation_delayed = 1;
785 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && pkt->dts > pkt->pts && st->pts_wrap_bits<63
786 /*&& pkt->dts-(1LL<<st->pts_wrap_bits) < pkt->pts*/){
787 pkt->dts -= 1LL<<st->pts_wrap_bits;
790 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
791 // we take the conservative approach and discard both
792 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
793 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
794 av_log(s, AV_LOG_ERROR, "invalid dts/pts combination\n");
795 pkt->dts= pkt->pts= AV_NOPTS_VALUE;
798 if (pkt->duration == 0) {
799 compute_frame_duration(&num, &den, st, pc, pkt);
801 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
803 if(pkt->duration != 0 && s->packet_buffer)
804 update_initial_durations(s, st, pkt);
808 /* correct timestamps with byte offset if demuxers only have timestamps
809 on packet boundaries */
810 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
811 /* this will estimate bitrate based on this frame's duration and size */
812 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
813 if(pkt->pts != AV_NOPTS_VALUE)
815 if(pkt->dts != AV_NOPTS_VALUE)
819 /* This may be redundant, but it should not hurt. */
820 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
821 presentation_delayed = 1;
823 // 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);
824 /* interpolate PTS and DTS if they are not present */
825 if(delay==0 || (delay==1 && pc)){
826 if (presentation_delayed) {
827 /* DTS = decompression timestamp */
828 /* PTS = presentation timestamp */
829 if (pkt->dts == AV_NOPTS_VALUE)
830 pkt->dts = st->last_IP_pts;
831 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
832 if (pkt->dts == AV_NOPTS_VALUE)
833 pkt->dts = st->cur_dts;
835 /* this is tricky: the dts must be incremented by the duration
836 of the frame we are displaying, i.e. the last I- or P-frame */
837 if (st->last_IP_duration == 0)
838 st->last_IP_duration = pkt->duration;
839 if(pkt->dts != AV_NOPTS_VALUE)
840 st->cur_dts = pkt->dts + st->last_IP_duration;
841 st->last_IP_duration = pkt->duration;
842 st->last_IP_pts= pkt->pts;
843 /* cannot compute PTS if not present (we can compute it only
844 by knowing the future */
845 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){
846 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){
847 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts);
848 int64_t new_diff= FFABS(st->cur_dts - pkt->pts);
849 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){
850 pkt->pts += pkt->duration;
851 // 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);
855 /* presentation is not delayed : PTS and DTS are the same */
856 if(pkt->pts == AV_NOPTS_VALUE)
858 update_initial_timestamps(s, pkt->stream_index, pkt->pts, pkt->pts);
859 if(pkt->pts == AV_NOPTS_VALUE)
860 pkt->pts = st->cur_dts;
862 if(pkt->pts != AV_NOPTS_VALUE)
863 st->cur_dts = pkt->pts + pkt->duration;
867 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
868 st->pts_buffer[0]= pkt->pts;
869 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
870 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
871 if(pkt->dts == AV_NOPTS_VALUE)
872 pkt->dts= st->pts_buffer[0];
874 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
876 if(pkt->dts > st->cur_dts)
877 st->cur_dts = pkt->dts;
880 // 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);
883 if(is_intra_only(st->codec))
884 pkt->flags |= PKT_FLAG_KEY;
887 /* keyframe computation */
888 if (pc->pict_type == FF_I_TYPE)
889 pkt->flags |= PKT_FLAG_KEY;
893 void av_destruct_packet_nofree(AVPacket *pkt)
895 pkt->data = NULL; pkt->size = 0;
898 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
906 /* select current input stream component */
909 if (!st->need_parsing || !st->parser) {
910 /* no parsing needed: we just output the packet as is */
911 /* raw data support */
913 compute_pkt_fields(s, st, NULL, pkt);
916 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) {
917 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size,
918 s->cur_ptr, s->cur_len,
919 s->cur_pkt.pts, s->cur_pkt.dts);
920 s->cur_pkt.pts = AV_NOPTS_VALUE;
921 s->cur_pkt.dts = AV_NOPTS_VALUE;
922 /* increment read pointer */
926 /* return packet if any */
929 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close.
931 pkt->stream_index = st->index;
932 pkt->pts = st->parser->pts;
933 pkt->dts = st->parser->dts;
934 pkt->destruct = av_destruct_packet_nofree;
935 compute_pkt_fields(s, st, st->parser, pkt);
937 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){
938 ff_reduce_index(s, st->index);
939 av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
940 0, 0, AVINDEX_KEYFRAME);
947 av_free_packet(&s->cur_pkt);
951 /* read next packet */
952 ret = av_read_packet(s, &s->cur_pkt);
954 if (ret == AVERROR(EAGAIN))
956 /* return the last frames, if any */
957 for(i = 0; i < s->nb_streams; i++) {
959 if (st->parser && st->need_parsing) {
960 av_parser_parse(st->parser, st->codec,
961 &pkt->data, &pkt->size,
963 AV_NOPTS_VALUE, AV_NOPTS_VALUE);
968 /* no more packets: really terminate parsing */
972 if(s->cur_pkt.pts != AV_NOPTS_VALUE &&
973 s->cur_pkt.dts != AV_NOPTS_VALUE &&
974 s->cur_pkt.pts < s->cur_pkt.dts){
975 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
976 s->cur_pkt.stream_index,
980 // av_free_packet(&s->cur_pkt);
984 st = s->streams[s->cur_pkt.stream_index];
985 if(s->debug & FF_FDEBUG_TS)
986 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
987 s->cur_pkt.stream_index,
994 s->cur_ptr = s->cur_pkt.data;
995 s->cur_len = s->cur_pkt.size;
996 if (st->need_parsing && !st->parser) {
997 st->parser = av_parser_init(st->codec->codec_id);
999 /* no parser available: just output the raw packets */
1000 st->need_parsing = AVSTREAM_PARSE_NONE;
1001 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
1002 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1004 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
1005 st->parser->next_frame_offset=
1006 st->parser->cur_offset= s->cur_pkt.pos;
1011 if(s->debug & FF_FDEBUG_TS)
1012 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d, flags=%d\n",
1022 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
1026 const int genpts= s->flags & AVFMT_FLAG_GENPTS;
1029 pktl = s->packet_buffer;
1031 AVPacket *next_pkt= &pktl->pkt;
1033 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
1034 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
1035 if( pktl->pkt.stream_index == next_pkt->stream_index
1036 && next_pkt->dts < pktl->pkt.dts
1037 && pktl->pkt.pts != pktl->pkt.dts //not b frame
1038 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){
1039 next_pkt->pts= pktl->pkt.dts;
1043 pktl = s->packet_buffer;
1046 if( next_pkt->pts != AV_NOPTS_VALUE
1047 || next_pkt->dts == AV_NOPTS_VALUE
1049 /* read packet from packet buffer, if there is data */
1051 s->packet_buffer = pktl->next;
1057 int ret= av_read_frame_internal(s, pkt);
1059 if(pktl && ret != AVERROR(EAGAIN)){
1066 if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
1067 &s->packet_buffer_end)) < 0)
1068 return AVERROR(ENOMEM);
1070 assert(!s->packet_buffer);
1071 return av_read_frame_internal(s, pkt);
1076 /* XXX: suppress the packet queue */
1077 static void flush_packet_queue(AVFormatContext *s)
1082 pktl = s->packet_buffer;
1085 s->packet_buffer = pktl->next;
1086 av_free_packet(&pktl->pkt);
1091 /*******************************************************/
1094 int av_find_default_stream_index(AVFormatContext *s)
1096 int first_audio_index = -1;
1100 if (s->nb_streams <= 0)
1102 for(i = 0; i < s->nb_streams; i++) {
1104 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
1107 if (first_audio_index < 0 && st->codec->codec_type == CODEC_TYPE_AUDIO)
1108 first_audio_index = i;
1110 return first_audio_index >= 0 ? first_audio_index : 0;
1114 * Flush the frame reader.
1116 static void av_read_frame_flush(AVFormatContext *s)
1121 flush_packet_queue(s);
1123 /* free previous packet */
1125 if (s->cur_st->parser)
1126 av_free_packet(&s->cur_pkt);
1133 /* for each stream, reset read state */
1134 for(i = 0; i < s->nb_streams; i++) {
1138 av_parser_close(st->parser);
1141 st->last_IP_pts = AV_NOPTS_VALUE;
1142 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
1146 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
1149 for(i = 0; i < s->nb_streams; i++) {
1150 AVStream *st = s->streams[i];
1152 st->cur_dts = av_rescale(timestamp,
1153 st->time_base.den * (int64_t)ref_st->time_base.num,
1154 st->time_base.num * (int64_t)ref_st->time_base.den);
1158 void ff_reduce_index(AVFormatContext *s, int stream_index)
1160 AVStream *st= s->streams[stream_index];
1161 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
1163 if((unsigned)st->nb_index_entries >= max_entries){
1165 for(i=0; 2*i<st->nb_index_entries; i++)
1166 st->index_entries[i]= st->index_entries[2*i];
1167 st->nb_index_entries= i;
1171 int av_add_index_entry(AVStream *st,
1172 int64_t pos, int64_t timestamp, int size, int distance, int flags)
1174 AVIndexEntry *entries, *ie;
1177 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
1180 entries = av_fast_realloc(st->index_entries,
1181 &st->index_entries_allocated_size,
1182 (st->nb_index_entries + 1) *
1183 sizeof(AVIndexEntry));
1187 st->index_entries= entries;
1189 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY);
1192 index= st->nb_index_entries++;
1193 ie= &entries[index];
1194 assert(index==0 || ie[-1].timestamp < timestamp);
1196 ie= &entries[index];
1197 if(ie->timestamp != timestamp){
1198 if(ie->timestamp <= timestamp)
1200 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index));
1201 st->nb_index_entries++;
1202 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
1203 distance= ie->min_distance;
1207 ie->timestamp = timestamp;
1208 ie->min_distance= distance;
1215 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
1218 AVIndexEntry *entries= st->index_entries;
1219 int nb_entries= st->nb_index_entries;
1228 timestamp = entries[m].timestamp;
1229 if(timestamp >= wanted_timestamp)
1231 if(timestamp <= wanted_timestamp)
1234 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
1236 if(!(flags & AVSEEK_FLAG_ANY)){
1237 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
1238 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
1249 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
1250 AVInputFormat *avif= s->iformat;
1251 int64_t pos_min, pos_max, pos, pos_limit;
1252 int64_t ts_min, ts_max, ts;
1256 if (stream_index < 0)
1260 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
1264 ts_min= AV_NOPTS_VALUE;
1265 pos_limit= -1; //gcc falsely says it may be uninitialized
1267 st= s->streams[stream_index];
1268 if(st->index_entries){
1271 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()
1272 index= FFMAX(index, 0);
1273 e= &st->index_entries[index];
1275 if(e->timestamp <= target_ts || e->pos == e->min_distance){
1277 ts_min= e->timestamp;
1279 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
1286 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
1287 assert(index < st->nb_index_entries);
1289 e= &st->index_entries[index];
1290 assert(e->timestamp >= target_ts);
1292 ts_max= e->timestamp;
1293 pos_limit= pos_max - e->min_distance;
1295 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
1296 pos_max,pos_limit, ts_max);
1301 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
1306 url_fseek(s->pb, pos, SEEK_SET);
1308 av_update_cur_dts(s, st, ts);
1313 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 )){
1315 int64_t start_pos, filesize;
1319 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
1322 if(ts_min == AV_NOPTS_VALUE){
1323 pos_min = s->data_offset;
1324 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1325 if (ts_min == AV_NOPTS_VALUE)
1329 if(ts_max == AV_NOPTS_VALUE){
1331 filesize = url_fsize(s->pb);
1332 pos_max = filesize - 1;
1335 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
1337 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
1338 if (ts_max == AV_NOPTS_VALUE)
1342 int64_t tmp_pos= pos_max + 1;
1343 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
1344 if(tmp_ts == AV_NOPTS_VALUE)
1348 if(tmp_pos >= filesize)
1354 if(ts_min > ts_max){
1356 }else if(ts_min == ts_max){
1361 while (pos_min < pos_limit) {
1363 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
1367 assert(pos_limit <= pos_max);
1370 int64_t approximate_keyframe_distance= pos_max - pos_limit;
1371 // interpolate position (better than dichotomy)
1372 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
1373 + pos_min - approximate_keyframe_distance;
1374 }else if(no_change==1){
1375 // bisection, if interpolation failed to change min or max pos last time
1376 pos = (pos_min + pos_limit)>>1;
1378 /* linear search if bisection failed, can only happen if there
1379 are very few or no keyframes between min/max */
1384 else if(pos > pos_limit)
1388 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
1394 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change);
1396 if(ts == AV_NOPTS_VALUE){
1397 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
1400 assert(ts != AV_NOPTS_VALUE);
1401 if (target_ts <= ts) {
1402 pos_limit = start_pos - 1;
1406 if (target_ts >= ts) {
1412 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
1413 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
1416 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1418 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
1419 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
1420 pos, ts_min, target_ts, ts_max);
1426 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
1427 int64_t pos_min, pos_max;
1431 if (stream_index < 0)
1434 st= s->streams[stream_index];
1437 pos_min = s->data_offset;
1438 pos_max = url_fsize(s->pb) - 1;
1440 if (pos < pos_min) pos= pos_min;
1441 else if(pos > pos_max) pos= pos_max;
1443 url_fseek(s->pb, pos, SEEK_SET);
1446 av_update_cur_dts(s, st, ts);
1451 static int av_seek_frame_generic(AVFormatContext *s,
1452 int stream_index, int64_t timestamp, int flags)
1458 st = s->streams[stream_index];
1460 index = av_index_search_timestamp(st, timestamp, flags);
1462 if(index < 0 || index==st->nb_index_entries-1){
1466 if(st->nb_index_entries){
1467 assert(st->index_entries);
1468 ie= &st->index_entries[st->nb_index_entries-1];
1469 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1471 av_update_cur_dts(s, st, ie->timestamp);
1473 if ((ret = url_fseek(s->pb, 0, SEEK_SET)) < 0)
1477 int ret = av_read_frame(s, &pkt);
1480 av_free_packet(&pkt);
1481 if(stream_index == pkt.stream_index){
1482 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp)
1486 index = av_index_search_timestamp(st, timestamp, flags);
1491 av_read_frame_flush(s);
1492 if (s->iformat->read_seek){
1493 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
1496 ie = &st->index_entries[index];
1497 if ((ret = url_fseek(s->pb, ie->pos, SEEK_SET)) < 0)
1499 av_update_cur_dts(s, st, ie->timestamp);
1504 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
1509 av_read_frame_flush(s);
1511 if(flags & AVSEEK_FLAG_BYTE)
1512 return av_seek_frame_byte(s, stream_index, timestamp, flags);
1514 if(stream_index < 0){
1515 stream_index= av_find_default_stream_index(s);
1516 if(stream_index < 0)
1519 st= s->streams[stream_index];
1520 /* timestamp for default must be expressed in AV_TIME_BASE units */
1521 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
1524 /* first, we try the format specific seek */
1525 if (s->iformat->read_seek)
1526 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
1533 if(s->iformat->read_timestamp)
1534 return av_seek_frame_binary(s, stream_index, timestamp, flags);
1536 return av_seek_frame_generic(s, stream_index, timestamp, flags);
1539 /*******************************************************/
1542 * Returns TRUE if the stream has accurate duration in any stream.
1544 * @return TRUE if the stream has accurate duration for at least one component.
1546 static int av_has_duration(AVFormatContext *ic)
1551 for(i = 0;i < ic->nb_streams; i++) {
1552 st = ic->streams[i];
1553 if (st->duration != AV_NOPTS_VALUE)
1560 * Estimate the stream timings from the one of each components.
1562 * Also computes the global bitrate if possible.
1564 static void av_update_stream_timings(AVFormatContext *ic)
1566 int64_t start_time, start_time1, end_time, end_time1;
1567 int64_t duration, duration1;
1571 start_time = INT64_MAX;
1572 end_time = INT64_MIN;
1573 duration = INT64_MIN;
1574 for(i = 0;i < ic->nb_streams; i++) {
1575 st = ic->streams[i];
1576 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
1577 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
1578 if (start_time1 < start_time)
1579 start_time = start_time1;
1580 if (st->duration != AV_NOPTS_VALUE) {
1581 end_time1 = start_time1
1582 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1583 if (end_time1 > end_time)
1584 end_time = end_time1;
1587 if (st->duration != AV_NOPTS_VALUE) {
1588 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
1589 if (duration1 > duration)
1590 duration = duration1;
1593 if (start_time != INT64_MAX) {
1594 ic->start_time = start_time;
1595 if (end_time != INT64_MIN) {
1596 if (end_time - start_time > duration)
1597 duration = end_time - start_time;
1600 if (duration != INT64_MIN) {
1601 ic->duration = duration;
1602 if (ic->file_size > 0) {
1603 /* compute the bitrate */
1604 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
1605 (double)ic->duration;
1610 static void fill_all_stream_timings(AVFormatContext *ic)
1615 av_update_stream_timings(ic);
1616 for(i = 0;i < ic->nb_streams; i++) {
1617 st = ic->streams[i];
1618 if (st->start_time == AV_NOPTS_VALUE) {
1619 if(ic->start_time != AV_NOPTS_VALUE)
1620 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
1621 if(ic->duration != AV_NOPTS_VALUE)
1622 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
1627 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
1629 int64_t filesize, duration;
1633 /* if bit_rate is already set, we believe it */
1634 if (ic->bit_rate == 0) {
1636 for(i=0;i<ic->nb_streams;i++) {
1637 st = ic->streams[i];
1638 bit_rate += st->codec->bit_rate;
1640 ic->bit_rate = bit_rate;
1643 /* if duration is already set, we believe it */
1644 if (ic->duration == AV_NOPTS_VALUE &&
1645 ic->bit_rate != 0 &&
1646 ic->file_size != 0) {
1647 filesize = ic->file_size;
1649 for(i = 0; i < ic->nb_streams; i++) {
1650 st = ic->streams[i];
1651 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
1652 if (st->duration == AV_NOPTS_VALUE)
1653 st->duration = duration;
1659 #define DURATION_MAX_READ_SIZE 250000
1661 /* only usable for MPEG-PS streams */
1662 static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
1664 AVPacket pkt1, *pkt = &pkt1;
1666 int read_size, i, ret;
1668 int64_t filesize, offset, duration;
1670 /* free previous packet */
1671 if (ic->cur_st && ic->cur_st->parser)
1672 av_free_packet(&ic->cur_pkt);
1675 /* flush packet queue */
1676 flush_packet_queue(ic);
1678 for(i=0;i<ic->nb_streams;i++) {
1679 st = ic->streams[i];
1681 av_parser_close(st->parser);
1686 /* we read the first packets to get the first PTS (not fully
1687 accurate, but it is enough now) */
1688 url_fseek(ic->pb, 0, SEEK_SET);
1691 if (read_size >= DURATION_MAX_READ_SIZE)
1693 /* if all info is available, we can stop */
1694 for(i = 0;i < ic->nb_streams; i++) {
1695 st = ic->streams[i];
1696 if (st->start_time == AV_NOPTS_VALUE)
1699 if (i == ic->nb_streams)
1702 ret = av_read_packet(ic, pkt);
1705 read_size += pkt->size;
1706 st = ic->streams[pkt->stream_index];
1707 if (pkt->pts != AV_NOPTS_VALUE) {
1708 if (st->start_time == AV_NOPTS_VALUE)
1709 st->start_time = pkt->pts;
1711 av_free_packet(pkt);
1714 /* estimate the end time (duration) */
1715 /* XXX: may need to support wrapping */
1716 filesize = ic->file_size;
1717 offset = filesize - DURATION_MAX_READ_SIZE;
1721 url_fseek(ic->pb, offset, SEEK_SET);
1724 if (read_size >= DURATION_MAX_READ_SIZE)
1727 ret = av_read_packet(ic, pkt);
1730 read_size += pkt->size;
1731 st = ic->streams[pkt->stream_index];
1732 if (pkt->pts != AV_NOPTS_VALUE &&
1733 st->start_time != AV_NOPTS_VALUE) {
1734 end_time = pkt->pts;
1735 duration = end_time - st->start_time;
1737 if (st->duration == AV_NOPTS_VALUE ||
1738 st->duration < duration)
1739 st->duration = duration;
1742 av_free_packet(pkt);
1745 fill_all_stream_timings(ic);
1747 url_fseek(ic->pb, old_offset, SEEK_SET);
1748 for(i=0; i<ic->nb_streams; i++){
1750 st->cur_dts= st->first_dts;
1751 st->last_IP_pts = AV_NOPTS_VALUE;
1755 static void av_estimate_timings(AVFormatContext *ic, int64_t old_offset)
1759 /* get the file size, if possible */
1760 if (ic->iformat->flags & AVFMT_NOFILE) {
1763 file_size = url_fsize(ic->pb);
1767 ic->file_size = file_size;
1769 if ((!strcmp(ic->iformat->name, "mpeg") ||
1770 !strcmp(ic->iformat->name, "mpegts")) &&
1771 file_size && !url_is_streamed(ic->pb)) {
1772 /* get accurate estimate from the PTSes */
1773 av_estimate_timings_from_pts(ic, old_offset);
1774 } else if (av_has_duration(ic)) {
1775 /* at least one component has timings - we use them for all
1777 fill_all_stream_timings(ic);
1779 /* less precise: use bitrate info */
1780 av_estimate_timings_from_bit_rate(ic);
1782 av_update_stream_timings(ic);
1788 for(i = 0;i < ic->nb_streams; i++) {
1789 st = ic->streams[i];
1790 printf("%d: start_time: %0.3f duration: %0.3f\n",
1791 i, (double)st->start_time / AV_TIME_BASE,
1792 (double)st->duration / AV_TIME_BASE);
1794 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
1795 (double)ic->start_time / AV_TIME_BASE,
1796 (double)ic->duration / AV_TIME_BASE,
1797 ic->bit_rate / 1000);
1802 static int has_codec_parameters(AVCodecContext *enc)
1805 switch(enc->codec_type) {
1806 case CODEC_TYPE_AUDIO:
1807 val = enc->sample_rate && enc->channels && enc->sample_fmt != SAMPLE_FMT_NONE;
1808 if(!enc->frame_size &&
1809 (enc->codec_id == CODEC_ID_VORBIS ||
1810 enc->codec_id == CODEC_ID_AAC))
1813 case CODEC_TYPE_VIDEO:
1814 val = enc->width && enc->pix_fmt != PIX_FMT_NONE;
1820 return enc->codec_id != CODEC_ID_NONE && val != 0;
1823 static int try_decode_frame(AVStream *st, const uint8_t *data, int size)
1827 int got_picture, data_size, ret=0;
1830 if(!st->codec->codec){
1831 codec = avcodec_find_decoder(st->codec->codec_id);
1834 ret = avcodec_open(st->codec, codec);
1839 if(!has_codec_parameters(st->codec)){
1840 switch(st->codec->codec_type) {
1841 case CODEC_TYPE_VIDEO:
1842 ret = avcodec_decode_video(st->codec, &picture,
1843 &got_picture, data, size);
1845 case CODEC_TYPE_AUDIO:
1846 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1847 samples = av_malloc(data_size);
1850 ret = avcodec_decode_audio2(st->codec, samples,
1851 &data_size, data, size);
1862 unsigned int codec_get_tag(const AVCodecTag *tags, int id)
1864 while (tags->id != CODEC_ID_NONE) {
1872 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag)
1875 for(i=0; tags[i].id != CODEC_ID_NONE;i++) {
1876 if(tag == tags[i].tag)
1879 for(i=0; tags[i].id != CODEC_ID_NONE; i++) {
1880 if( toupper((tag >> 0)&0xFF) == toupper((tags[i].tag >> 0)&0xFF)
1881 && toupper((tag >> 8)&0xFF) == toupper((tags[i].tag >> 8)&0xFF)
1882 && toupper((tag >>16)&0xFF) == toupper((tags[i].tag >>16)&0xFF)
1883 && toupper((tag >>24)&0xFF) == toupper((tags[i].tag >>24)&0xFF))
1886 return CODEC_ID_NONE;
1889 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum CodecID id)
1892 for(i=0; tags && tags[i]; i++){
1893 int tag= codec_get_tag(tags[i], id);
1899 enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
1902 for(i=0; tags && tags[i]; i++){
1903 enum CodecID id= codec_get_id(tags[i], tag);
1904 if(id!=CODEC_ID_NONE) return id;
1906 return CODEC_ID_NONE;
1909 static void compute_chapters_end(AVFormatContext *s)
1913 for (i=0; i+1<s->nb_chapters; i++)
1914 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
1915 assert(s->chapters[i]->start <= s->chapters[i+1]->start);
1916 assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
1917 s->chapters[i]->end = s->chapters[i+1]->start;
1920 if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
1921 assert(s->start_time != AV_NOPTS_VALUE);
1922 assert(s->duration > 0);
1923 s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
1925 s->chapters[i]->time_base);
1929 /* absolute maximum size we read until we abort */
1930 #define MAX_READ_SIZE 5000000
1932 #define MAX_STD_TIMEBASES (60*12+5)
1933 static int get_std_framerate(int i){
1934 if(i<60*12) return i*1001;
1935 else return ((const int[]){24,30,60,12,15})[i-60*12]*1000*12;
1939 * Is the time base unreliable.
1940 * This is a heuristic to balance between quick acceptance of the values in
1941 * the headers vs. some extra checks.
1942 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
1943 * MPEG-2 commonly misuses field repeat flags to store different framerates.
1944 * And there are "variable" fps files this needs to detect as well.
1946 static int tb_unreliable(AVCodecContext *c){
1947 if( c->time_base.den >= 101L*c->time_base.num
1948 || c->time_base.den < 5L*c->time_base.num
1949 /* || c->codec_tag == ff_get_fourcc("DIVX")
1950 || c->codec_tag == ff_get_fourcc("XVID")*/
1951 || c->codec_id == CODEC_ID_MPEG2VIDEO)
1956 int av_find_stream_info(AVFormatContext *ic)
1958 int i, count, ret, read_size, j;
1960 AVPacket pkt1, *pkt;
1961 int64_t last_dts[MAX_STREAMS];
1962 int duration_count[MAX_STREAMS]={0};
1963 double (*duration_error)[MAX_STD_TIMEBASES];
1964 int64_t old_offset = url_ftell(ic->pb);
1965 int64_t codec_info_duration[MAX_STREAMS]={0};
1966 int codec_info_nb_frames[MAX_STREAMS]={0};
1968 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error));
1969 if (!duration_error) return AVERROR(ENOMEM);
1971 for(i=0;i<ic->nb_streams;i++) {
1972 st = ic->streams[i];
1973 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
1974 /* if(!st->time_base.num)
1976 if(!st->codec->time_base.num)
1977 st->codec->time_base= st->time_base;
1979 //only for the split stuff
1981 st->parser = av_parser_init(st->codec->codec_id);
1982 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
1983 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
1988 for(i=0;i<MAX_STREAMS;i++){
1989 last_dts[i]= AV_NOPTS_VALUE;
1995 /* check if one codec still needs to be handled */
1996 for(i=0;i<ic->nb_streams;i++) {
1997 st = ic->streams[i];
1998 if (!has_codec_parameters(st->codec))
2000 /* variable fps and no guess at the real fps */
2001 if( tb_unreliable(st->codec)
2002 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO)
2004 if(st->parser && st->parser->parser->split && !st->codec->extradata)
2006 if(st->first_dts == AV_NOPTS_VALUE)
2009 if (i == ic->nb_streams) {
2010 /* NOTE: if the format has no header, then we need to read
2011 some packets to get most of the streams, so we cannot
2013 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
2014 /* if we found the info for all the codecs, we can stop */
2019 /* we did not get all the codec info, but we read too much data */
2020 if (read_size >= MAX_READ_SIZE) {
2025 /* NOTE: a new stream can be added there if no header in file
2026 (AVFMTCTX_NOHEADER) */
2027 ret = av_read_frame_internal(ic, &pkt1);
2030 ret = -1; /* we could not have all the codec parameters before EOF */
2031 for(i=0;i<ic->nb_streams;i++) {
2032 st = ic->streams[i];
2033 if (!has_codec_parameters(st->codec)){
2035 avcodec_string(buf, sizeof(buf), st->codec, 0);
2036 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf);
2044 pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
2045 if(av_dup_packet(pkt) < 0) {
2046 av_free(duration_error);
2047 return AVERROR(ENOMEM);
2050 read_size += pkt->size;
2052 st = ic->streams[pkt->stream_index];
2053 if(codec_info_nb_frames[st->index]>1)
2054 codec_info_duration[st->index] += pkt->duration;
2055 if (pkt->duration != 0)
2056 codec_info_nb_frames[st->index]++;
2059 int index= pkt->stream_index;
2060 int64_t last= last_dts[index];
2061 int64_t duration= pkt->dts - last;
2063 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
2064 double dur= duration * av_q2d(st->time_base);
2066 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2067 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur);
2068 if(duration_count[index] < 2)
2069 memset(duration_error[index], 0, sizeof(*duration_error));
2070 for(i=1; i<MAX_STD_TIMEBASES; i++){
2071 int framerate= get_std_framerate(i);
2072 int ticks= lrintf(dur*framerate/(1001*12));
2073 double error= dur - ticks*1001*12/(double)framerate;
2074 duration_error[index][i] += error*error;
2076 duration_count[index]++;
2078 if(last == AV_NOPTS_VALUE || duration_count[index]<=1)
2079 last_dts[pkt->stream_index]= pkt->dts;
2081 if(st->parser && st->parser->parser->split && !st->codec->extradata){
2082 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
2084 st->codec->extradata_size= i;
2085 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2086 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
2087 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2091 /* if still no information, we try to open the codec and to
2092 decompress the frame. We try to avoid that in most cases as
2093 it takes longer and uses more memory. For MPEG-4, we need to
2094 decompress for QuickTime. */
2095 if (!has_codec_parameters(st->codec) /*&&
2096 (st->codec->codec_id == CODEC_ID_FLV1 ||
2097 st->codec->codec_id == CODEC_ID_H264 ||
2098 st->codec->codec_id == CODEC_ID_H263 ||
2099 st->codec->codec_id == CODEC_ID_H261 ||
2100 st->codec->codec_id == CODEC_ID_VORBIS ||
2101 st->codec->codec_id == CODEC_ID_MJPEG ||
2102 st->codec->codec_id == CODEC_ID_PNG ||
2103 st->codec->codec_id == CODEC_ID_PAM ||
2104 st->codec->codec_id == CODEC_ID_PGM ||
2105 st->codec->codec_id == CODEC_ID_PGMYUV ||
2106 st->codec->codec_id == CODEC_ID_PBM ||
2107 st->codec->codec_id == CODEC_ID_PPM ||
2108 st->codec->codec_id == CODEC_ID_SHORTEN ||
2109 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/)
2110 try_decode_frame(st, pkt->data, pkt->size);
2112 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
2118 // close codecs which were opened in try_decode_frame()
2119 for(i=0;i<ic->nb_streams;i++) {
2120 st = ic->streams[i];
2121 if(st->codec->codec)
2122 avcodec_close(st->codec);
2124 for(i=0;i<ic->nb_streams;i++) {
2125 st = ic->streams[i];
2126 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2127 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
2128 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
2130 if(duration_count[i]
2131 && tb_unreliable(st->codec) /*&&
2132 //FIXME we should not special-case MPEG-2, but this needs testing with non-MPEG-2 ...
2133 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){
2134 double best_error= 2*av_q2d(st->time_base);
2135 best_error= best_error*best_error*duration_count[i]*1000*12*30;
2137 for(j=1; j<MAX_STD_TIMEBASES; j++){
2138 double error= duration_error[i][j] * get_std_framerate(j);
2139 // if(st->codec->codec_type == CODEC_TYPE_VIDEO)
2140 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error);
2141 if(error < best_error){
2143 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX);
2148 if (!st->r_frame_rate.num){
2149 if( st->codec->time_base.den * (int64_t)st->time_base.num
2150 <= st->codec->time_base.num * (int64_t)st->time_base.den){
2151 st->r_frame_rate.num = st->codec->time_base.den;
2152 st->r_frame_rate.den = st->codec->time_base.num;
2154 st->r_frame_rate.num = st->time_base.den;
2155 st->r_frame_rate.den = st->time_base.num;
2158 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) {
2159 if(!st->codec->bits_per_coded_sample)
2160 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
2164 av_estimate_timings(ic, old_offset);
2166 compute_chapters_end(ic);
2169 /* correct DTS for B-frame streams with no timestamps */
2170 for(i=0;i<ic->nb_streams;i++) {
2171 st = ic->streams[i];
2172 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
2174 ppktl = &ic->packet_buffer;
2176 if(ppkt1->stream_index != i)
2178 if(ppkt1->pkt->dts < 0)
2180 if(ppkt1->pkt->pts != AV_NOPTS_VALUE)
2182 ppkt1->pkt->dts -= delta;
2187 st->cur_dts -= delta;
2193 av_free(duration_error);
2198 /*******************************************************/
2200 int av_read_play(AVFormatContext *s)
2202 if (s->iformat->read_play)
2203 return s->iformat->read_play(s);
2205 return av_url_read_fpause(s->pb, 0);
2206 return AVERROR(ENOSYS);
2209 int av_read_pause(AVFormatContext *s)
2211 if (s->iformat->read_pause)
2212 return s->iformat->read_pause(s);
2214 return av_url_read_fpause(s->pb, 1);
2215 return AVERROR(ENOSYS);
2218 void av_close_input_stream(AVFormatContext *s)
2223 /* free previous packet */
2224 if (s->cur_st && s->cur_st->parser)
2225 av_free_packet(&s->cur_pkt);
2227 if (s->iformat->read_close)
2228 s->iformat->read_close(s);
2229 for(i=0;i<s->nb_streams;i++) {
2230 /* free all data in a stream component */
2233 av_parser_close(st->parser);
2235 av_metadata_free(&st->metadata);
2236 av_free(st->index_entries);
2237 av_free(st->codec->extradata);
2239 av_free(st->filename);
2240 av_free(st->priv_data);
2243 for(i=s->nb_programs-1; i>=0; i--) {
2244 av_freep(&s->programs[i]->provider_name);
2245 av_freep(&s->programs[i]->name);
2246 av_metadata_free(&s->programs[i]->metadata);
2247 av_freep(&s->programs[i]->stream_index);
2248 av_freep(&s->programs[i]);
2250 av_freep(&s->programs);
2251 flush_packet_queue(s);
2252 av_freep(&s->priv_data);
2253 while(s->nb_chapters--) {
2254 av_free(s->chapters[s->nb_chapters]->title);
2255 av_metadata_free(&s->chapters[s->nb_chapters]->metadata);
2256 av_free(s->chapters[s->nb_chapters]);
2258 av_freep(&s->chapters);
2259 av_metadata_free(&s->metadata);
2263 void av_close_input_file(AVFormatContext *s)
2265 ByteIOContext *pb = s->iformat->flags & AVFMT_NOFILE ? NULL : s->pb;
2266 av_close_input_stream(s);
2271 AVStream *av_new_stream(AVFormatContext *s, int id)
2276 if (s->nb_streams >= MAX_STREAMS)
2279 st = av_mallocz(sizeof(AVStream));
2283 st->codec= avcodec_alloc_context();
2285 /* no default bitrate if decoding */
2286 st->codec->bit_rate = 0;
2288 st->index = s->nb_streams;
2290 st->start_time = AV_NOPTS_VALUE;
2291 st->duration = AV_NOPTS_VALUE;
2292 /* we set the current DTS to 0 so that formats without any timestamps
2293 but durations get some timestamps, formats with some unknown
2294 timestamps have their first few packets buffered and the
2295 timestamps corrected before they are returned to the user */
2297 st->first_dts = AV_NOPTS_VALUE;
2299 /* default pts setting is MPEG-like */
2300 av_set_pts_info(st, 33, 1, 90000);
2301 st->last_IP_pts = AV_NOPTS_VALUE;
2302 for(i=0; i<MAX_REORDER_DELAY+1; i++)
2303 st->pts_buffer[i]= AV_NOPTS_VALUE;
2305 st->sample_aspect_ratio = (AVRational){0,1};
2307 s->streams[s->nb_streams++] = st;
2311 AVProgram *av_new_program(AVFormatContext *ac, int id)
2313 AVProgram *program=NULL;
2317 av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
2320 for(i=0; i<ac->nb_programs; i++)
2321 if(ac->programs[i]->id == id)
2322 program = ac->programs[i];
2325 program = av_mallocz(sizeof(AVProgram));
2328 dynarray_add(&ac->programs, &ac->nb_programs, program);
2329 program->discard = AVDISCARD_NONE;
2336 void av_set_program_name(AVProgram *program, char *provider_name, char *name)
2338 assert(!provider_name == !name);
2340 av_free(program->provider_name);
2341 av_free(program-> name);
2342 program->provider_name = av_strdup(provider_name);
2343 program-> name = av_strdup( name);
2347 AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
2349 AVChapter *chapter = NULL;
2352 for(i=0; i<s->nb_chapters; i++)
2353 if(s->chapters[i]->id == id)
2354 chapter = s->chapters[i];
2357 chapter= av_mallocz(sizeof(AVChapter));
2360 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
2362 av_free(chapter->title);
2363 chapter->title = av_strdup(title);
2365 chapter->time_base= time_base;
2366 chapter->start = start;
2372 /************************************************************/
2373 /* output media file */
2375 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
2379 if (s->oformat->priv_data_size > 0) {
2380 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2382 return AVERROR(ENOMEM);
2384 s->priv_data = NULL;
2386 if (s->oformat->set_parameters) {
2387 ret = s->oformat->set_parameters(s, ap);
2394 int av_write_header(AVFormatContext *s)
2399 // some sanity checks
2400 for(i=0;i<s->nb_streams;i++) {
2403 switch (st->codec->codec_type) {
2404 case CODEC_TYPE_AUDIO:
2405 if(st->codec->sample_rate<=0){
2406 av_log(s, AV_LOG_ERROR, "sample rate not set\n");
2409 if(!st->codec->block_align)
2410 st->codec->block_align = st->codec->channels *
2411 av_get_bits_per_sample(st->codec->codec_id) >> 3;
2413 case CODEC_TYPE_VIDEO:
2414 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too?
2415 av_log(s, AV_LOG_ERROR, "time base not set\n");
2418 if(st->codec->width<=0 || st->codec->height<=0){
2419 av_log(s, AV_LOG_ERROR, "dimensions not set\n");
2422 if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)){
2423 av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
2429 if(s->oformat->codec_tag){
2430 if(st->codec->codec_tag){
2432 //check that tag + id is in the table
2433 //if neither is in the table -> OK
2434 //if tag is in the table with another id -> FAIL
2435 //if id is in the table with another tag -> FAIL unless strict < ?
2437 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
2441 if (!s->priv_data && s->oformat->priv_data_size > 0) {
2442 s->priv_data = av_mallocz(s->oformat->priv_data_size);
2444 return AVERROR(ENOMEM);
2447 #if LIBAVFORMAT_VERSION_MAJOR < 53
2448 ff_metadata_mux_compat(s);
2451 if(s->oformat->write_header){
2452 ret = s->oformat->write_header(s);
2457 /* init PTS generation */
2458 for(i=0;i<s->nb_streams;i++) {
2459 int64_t den = AV_NOPTS_VALUE;
2462 switch (st->codec->codec_type) {
2463 case CODEC_TYPE_AUDIO:
2464 den = (int64_t)st->time_base.num * st->codec->sample_rate;
2466 case CODEC_TYPE_VIDEO:
2467 den = (int64_t)st->time_base.num * st->codec->time_base.den;
2472 if (den != AV_NOPTS_VALUE) {
2474 return AVERROR_INVALIDDATA;
2475 av_frac_init(&st->pts, 0, 0, den);
2481 //FIXME merge with compute_pkt_fields
2482 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){
2483 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames);
2484 int num, den, frame_size, i;
2486 // av_log(st->codec, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index);
2488 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE)
2491 /* duration field */
2492 if (pkt->duration == 0) {
2493 compute_frame_duration(&num, &den, st, NULL, pkt);
2495 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
2499 if(pkt->pts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && delay==0)
2502 //XXX/FIXME this is a temporary hack until all encoders output pts
2503 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){
2505 // pkt->pts= st->cur_dts;
2506 pkt->pts= st->pts.val;
2509 //calculate dts from pts
2510 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY){
2511 st->pts_buffer[0]= pkt->pts;
2512 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++)
2513 st->pts_buffer[i]= (i-delay-1) * pkt->duration;
2514 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
2515 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
2517 pkt->dts= st->pts_buffer[0];
2520 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
2521 av_log(st->codec, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts);
2524 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){
2525 av_log(st->codec, AV_LOG_ERROR, "error, pts < dts\n");
2529 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts);
2530 st->cur_dts= pkt->dts;
2531 st->pts.val= pkt->dts;
2534 switch (st->codec->codec_type) {
2535 case CODEC_TYPE_AUDIO:
2536 frame_size = get_audio_frame_size(st->codec, pkt->size);
2538 /* HACK/FIXME, we skip the initial 0 size packets as they are most
2539 likely equal to the encoder delay, but it would be better if we
2540 had the real timestamps from the encoder */
2541 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) {
2542 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size);
2545 case CODEC_TYPE_VIDEO:
2546 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num);
2554 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
2556 int ret = compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
2558 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2561 ret= s->oformat->write_packet(s, pkt);
2563 ret= url_ferror(s->pb);
2567 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
2568 AVPacketList *pktl, **next_point, *this_pktl;
2570 int streams[MAX_STREAMS];
2573 AVStream *st= s->streams[ pkt->stream_index];
2575 // assert(pkt->destruct != av_destruct_packet); //FIXME
2577 this_pktl = av_mallocz(sizeof(AVPacketList));
2578 this_pktl->pkt= *pkt;
2579 if(pkt->destruct == av_destruct_packet)
2580 pkt->destruct= NULL; // not shared -> must keep original from being freed
2582 av_dup_packet(&this_pktl->pkt); //shared -> must dup
2584 next_point = &s->packet_buffer;
2586 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index];
2587 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den;
2588 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den;
2589 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow
2591 next_point= &(*next_point)->next;
2593 this_pktl->next= *next_point;
2594 *next_point= this_pktl;
2597 memset(streams, 0, sizeof(streams));
2598 pktl= s->packet_buffer;
2600 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts);
2601 if(streams[ pktl->pkt.stream_index ] == 0)
2603 streams[ pktl->pkt.stream_index ]++;
2607 if(stream_count && (s->nb_streams == stream_count || flush)){
2608 pktl= s->packet_buffer;
2611 s->packet_buffer= pktl->next;
2615 av_init_packet(out);
2621 * Interleaves an AVPacket correctly so it can be muxed.
2622 * @param out the interleaved packet will be output here
2623 * @param in the input packet
2624 * @param flush 1 if no further packets are available as input and all
2625 * remaining packets should be output
2626 * @return 1 if a packet was output, 0 if no packet could be output,
2627 * < 0 if an error occurred
2629 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){
2630 if(s->oformat->interleave_packet)
2631 return s->oformat->interleave_packet(s, out, in, flush);
2633 return av_interleave_packet_per_dts(s, out, in, flush);
2636 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
2637 AVStream *st= s->streams[ pkt->stream_index];
2639 //FIXME/XXX/HACK drop zero sized packets
2640 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0)
2643 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts);
2644 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
2647 if(pkt->dts == AV_NOPTS_VALUE)
2652 int ret= av_interleave_packet(s, &opkt, pkt, 0);
2653 if(ret<=0) //FIXME cleanup needed for ret<0 ?
2656 ret= s->oformat->write_packet(s, &opkt);
2658 av_free_packet(&opkt);
2663 if(url_ferror(s->pb))
2664 return url_ferror(s->pb);
2668 int av_write_trailer(AVFormatContext *s)
2674 ret= av_interleave_packet(s, &pkt, NULL, 1);
2675 if(ret<0) //FIXME cleanup needed for ret<0 ?
2680 ret= s->oformat->write_packet(s, &pkt);
2682 av_free_packet(&pkt);
2686 if(url_ferror(s->pb))
2690 if(s->oformat->write_trailer)
2691 ret = s->oformat->write_trailer(s);
2694 ret=url_ferror(s->pb);
2695 for(i=0;i<s->nb_streams;i++)
2696 av_freep(&s->streams[i]->priv_data);
2697 av_freep(&s->priv_data);
2701 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
2704 AVProgram *program=NULL;
2707 for(i=0; i<ac->nb_programs; i++){
2708 if(ac->programs[i]->id != progid)
2710 program = ac->programs[i];
2711 for(j=0; j<program->nb_stream_indexes; j++)
2712 if(program->stream_index[j] == idx)
2715 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
2718 program->stream_index = tmp;
2719 program->stream_index[program->nb_stream_indexes++] = idx;
2724 /* "user interface" functions */
2725 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
2728 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
2729 AVStream *st = ic->streams[i];
2730 int g = ff_gcd(st->time_base.num, st->time_base.den);
2731 avcodec_string(buf, sizeof(buf), st->codec, is_output);
2732 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i);
2733 /* the pid is an important information, so we display it */
2734 /* XXX: add a generic system */
2735 if (flags & AVFMT_SHOW_IDS)
2736 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
2737 if (strlen(st->language) > 0)
2738 av_log(NULL, AV_LOG_INFO, "(%s)", st->language);
2739 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g);
2740 av_log(NULL, AV_LOG_INFO, ": %s", buf);
2741 if(st->codec->codec_type == CODEC_TYPE_VIDEO){
2742 if(st->r_frame_rate.den && st->r_frame_rate.num)
2743 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(r)", av_q2d(st->r_frame_rate));
2744 /* else if(st->time_base.den && st->time_base.num)
2745 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(m)", 1/av_q2d(st->time_base));*/
2747 av_log(NULL, AV_LOG_INFO, ", %5.2f tb(c)", 1/av_q2d(st->codec->time_base));
2749 av_log(NULL, AV_LOG_INFO, "\n");
2752 void dump_format(AVFormatContext *ic,
2759 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
2760 is_output ? "Output" : "Input",
2762 is_output ? ic->oformat->name : ic->iformat->name,
2763 is_output ? "to" : "from", url);
2765 av_log(NULL, AV_LOG_INFO, " Duration: ");
2766 if (ic->duration != AV_NOPTS_VALUE) {
2767 int hours, mins, secs, us;
2768 secs = ic->duration / AV_TIME_BASE;
2769 us = ic->duration % AV_TIME_BASE;
2774 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
2775 (100 * us) / AV_TIME_BASE);
2777 av_log(NULL, AV_LOG_INFO, "N/A");
2779 if (ic->start_time != AV_NOPTS_VALUE) {
2781 av_log(NULL, AV_LOG_INFO, ", start: ");
2782 secs = ic->start_time / AV_TIME_BASE;
2783 us = ic->start_time % AV_TIME_BASE;
2784 av_log(NULL, AV_LOG_INFO, "%d.%06d",
2785 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
2787 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
2789 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
2791 av_log(NULL, AV_LOG_INFO, "N/A");
2793 av_log(NULL, AV_LOG_INFO, "\n");
2795 if(ic->nb_programs) {
2797 for(j=0; j<ic->nb_programs; j++) {
2798 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
2799 ic->programs[j]->name ? ic->programs[j]->name : "");
2800 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
2801 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
2804 for(i=0;i<ic->nb_streams;i++)
2805 dump_stream_format(ic, i, index, is_output);
2808 #if LIBAVFORMAT_VERSION_MAJOR < 53
2809 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
2811 return av_parse_video_frame_size(width_ptr, height_ptr, str);
2814 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg)
2816 AVRational frame_rate;
2817 int ret = av_parse_video_frame_rate(&frame_rate, arg);
2818 *frame_rate_num= frame_rate.num;
2819 *frame_rate_den= frame_rate.den;
2824 int64_t av_gettime(void)
2827 gettimeofday(&tv,NULL);
2828 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
2831 int64_t parse_date(const char *datestr, int duration)
2837 static const char * const date_fmt[] = {
2841 static const char * const time_fmt[] = {
2851 time_t now = time(0);
2853 len = strlen(datestr);
2855 lastch = datestr[len - 1];
2858 is_utc = (lastch == 'z' || lastch == 'Z');
2860 memset(&dt, 0, sizeof(dt));
2865 /* parse the year-month-day part */
2866 for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) {
2867 q = small_strptime(p, date_fmt[i], &dt);
2873 /* if the year-month-day part is missing, then take the
2874 * current year-month-day time */
2879 dt = *localtime(&now);
2881 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
2886 if (*p == 'T' || *p == 't' || *p == ' ')
2889 /* parse the hour-minute-second part */
2890 for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) {
2891 q = small_strptime(p, time_fmt[i], &dt);
2897 /* parse datestr as a duration */
2902 /* parse datestr as HH:MM:SS */
2903 q = small_strptime(p, time_fmt[0], &dt);
2905 /* parse datestr as S+ */
2906 dt.tm_sec = strtol(p, (char **)&q, 10);
2908 /* the parsing didn't succeed */
2915 /* Now we have all the fields that we can get */
2921 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
2923 dt.tm_isdst = -1; /* unknown */
2933 /* parse the .m... part */
2937 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
2940 val += n * (*q - '0');
2944 return negative ? -t : t;
2947 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
2957 while (*p != '\0' && *p != '=' && *p != '&') {
2958 if ((q - tag) < sizeof(tag) - 1)
2966 while (*p != '&' && *p != '\0') {
2967 if ((q - arg) < arg_size - 1) {
2977 if (!strcmp(tag, tag1))
2986 int av_get_frame_filename(char *buf, int buf_size,
2987 const char *path, int number)
2990 char *q, buf1[20], c;
2991 int nd, len, percentd_found;
3003 while (isdigit(*p)) {
3004 nd = nd * 10 + *p++ - '0';
3007 } while (isdigit(c));
3016 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
3018 if ((q - buf + len) > buf_size - 1)
3020 memcpy(q, buf1, len);
3028 if ((q - buf) < buf_size - 1)
3032 if (!percentd_found)
3041 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size)
3044 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3046 for(i=0;i<size;i+=16) {
3053 PRINT(" %02x", buf[i+j]);
3058 for(j=0;j<len;j++) {
3060 if (c < ' ' || c > '~')
3069 void av_hex_dump(FILE *f, uint8_t *buf, int size)
3071 hex_dump_internal(NULL, f, 0, buf, size);
3074 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size)
3076 hex_dump_internal(avcl, NULL, level, buf, size);
3079 //FIXME needs to know the time_base
3080 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload)
3082 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
3083 PRINT("stream #%d:\n", pkt->stream_index);
3084 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0));
3085 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE);
3086 /* DTS is _always_ valid after av_read_frame() */
3088 if (pkt->dts == AV_NOPTS_VALUE)
3091 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE);
3092 /* PTS may not be known if B-frames are present. */
3094 if (pkt->pts == AV_NOPTS_VALUE)
3097 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE);
3099 PRINT(" size=%d\n", pkt->size);
3102 av_hex_dump(f, pkt->data, pkt->size);
3105 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
3107 pkt_dump_internal(NULL, f, 0, pkt, dump_payload);
3110 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
3112 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload);
3115 void url_split(char *proto, int proto_size,
3116 char *authorization, int authorization_size,
3117 char *hostname, int hostname_size,
3119 char *path, int path_size,
3122 const char *p, *ls, *at, *col, *brk;
3124 if (port_ptr) *port_ptr = -1;
3125 if (proto_size > 0) proto[0] = 0;
3126 if (authorization_size > 0) authorization[0] = 0;
3127 if (hostname_size > 0) hostname[0] = 0;
3128 if (path_size > 0) path[0] = 0;
3130 /* parse protocol */
3131 if ((p = strchr(url, ':'))) {
3132 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
3137 /* no protocol means plain filename */
3138 av_strlcpy(path, url, path_size);
3142 /* separate path from hostname */
3143 ls = strchr(p, '/');
3145 ls = strchr(p, '?');
3147 av_strlcpy(path, ls, path_size);
3149 ls = &p[strlen(p)]; // XXX
3151 /* the rest is hostname, use that to parse auth/port */
3153 /* authorization (user[:pass]@hostname) */
3154 if ((at = strchr(p, '@')) && at < ls) {
3155 av_strlcpy(authorization, p,
3156 FFMIN(authorization_size, at + 1 - p));
3157 p = at + 1; /* skip '@' */
3160 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
3162 av_strlcpy(hostname, p + 1,
3163 FFMIN(hostname_size, brk - p));
3164 if (brk[1] == ':' && port_ptr)
3165 *port_ptr = atoi(brk + 2);
3166 } else if ((col = strchr(p, ':')) && col < ls) {
3167 av_strlcpy(hostname, p,
3168 FFMIN(col + 1 - p, hostname_size));
3169 if (port_ptr) *port_ptr = atoi(col + 1);
3171 av_strlcpy(hostname, p,
3172 FFMIN(ls + 1 - p, hostname_size));
3176 char *ff_data_to_hex(char *buff, const uint8_t *src, int s)
3179 static const char hex_table[16] = { '0', '1', '2', '3',
3182 'C', 'D', 'E', 'F' };
3184 for(i = 0; i < s; i++) {
3185 buff[i * 2] = hex_table[src[i] >> 4];
3186 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
3192 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
3193 int pts_num, int pts_den)
3195 unsigned int gcd= ff_gcd(pts_num, pts_den);
3196 s->pts_wrap_bits = pts_wrap_bits;
3197 s->time_base.num = pts_num/gcd;
3198 s->time_base.den = pts_den/gcd;
3201 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, gcd);