2 * Various utilities for ffmpeg system
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #define strcasecmp _stricmp
27 #include <sys/types.h>
28 #include <sys/timeb.h>
36 AVInputFormat *first_iformat;
37 AVOutputFormat *first_oformat;
39 void av_register_input_format(AVInputFormat *format)
43 while (*p != NULL) p = &(*p)->next;
48 void av_register_output_format(AVOutputFormat *format)
52 while (*p != NULL) p = &(*p)->next;
57 static int match_ext(const char *filename, const char *extensions)
62 ext = strrchr(filename, '.');
68 while (*p != '\0' && *p != ',')
71 if (!strcasecmp(ext1, ext))
81 AVOutputFormat *guess_format(const char *short_name, const char *filename,
82 const char *mime_type)
84 AVOutputFormat *fmt, *fmt_found;
87 /* find the proper file type */
93 if (fmt->name && short_name && !strcmp(fmt->name, short_name))
95 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
97 if (filename && fmt->extensions &&
98 match_ext(filename, fmt->extensions)) {
101 if (score > score_max) {
110 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename,
111 const char *mime_type)
113 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type);
116 AVOutputFormat *stream_fmt;
117 char stream_format_name[64];
119 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name);
120 stream_fmt = guess_format(stream_format_name, NULL, NULL);
129 AVInputFormat *av_find_input_format(const char *short_name)
132 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) {
133 if (!strcmp(fmt->name, short_name))
139 /* memory handling */
142 * Allocate the payload of a packet and intialized its fields to default values.
145 * @param size wanted payload size
146 * @return 0 if OK. AVERROR_xxx otherwise.
148 int av_new_packet(AVPacket *pkt, int size)
151 pkt->data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
153 return AVERROR_NOMEM;
156 pkt->pts = AV_NOPTS_VALUE;
157 pkt->stream_index = 0;
160 for(i=0; i<FF_INPUT_BUFFER_PADDING_SIZE; i++)
161 pkt->data[size+i]= 0;
169 * @param pkt packet to free
171 void av_free_packet(AVPacket *pkt)
173 av_freep(&pkt->data);
180 int fifo_init(FifoBuffer *f, int size)
182 f->buffer = av_malloc(size);
185 f->end = f->buffer + size;
186 f->wptr = f->rptr = f->buffer;
190 void fifo_free(FifoBuffer *f)
195 int fifo_size(FifoBuffer *f, UINT8 *rptr)
199 if (f->wptr >= rptr) {
200 size = f->wptr - rptr;
202 size = (f->end - rptr) + (f->wptr - f->buffer);
207 /* get data from the fifo (return -1 if not enough data) */
208 int fifo_read(FifoBuffer *f, UINT8 *buf, int buf_size, UINT8 **rptr_ptr)
210 UINT8 *rptr = *rptr_ptr;
213 if (f->wptr >= rptr) {
214 size = f->wptr - rptr;
216 size = (f->end - rptr) + (f->wptr - f->buffer);
221 while (buf_size > 0) {
225 memcpy(buf, rptr, len);
236 void fifo_write(FifoBuffer *f, UINT8 *buf, int size, UINT8 **wptr_ptr)
245 memcpy(wptr, buf, len);
255 int filename_number_test(const char *filename)
258 return get_frame_filename(buf, sizeof(buf), filename, 1);
261 /* guess file format */
262 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
264 AVInputFormat *fmt1, *fmt;
265 int score, score_max;
269 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
270 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE))
273 if (fmt1->read_probe) {
274 score = fmt1->read_probe(pd);
275 } else if (fmt1->extensions) {
276 if (match_ext(pd->filename, fmt1->extensions)) {
280 if (score > score_max) {
288 /************************************************************/
289 /* input media file */
291 #define PROBE_BUF_SIZE 2048
294 * Open a media file as input. The codec are not opened. Only the file
295 * header (if present) is read.
297 * @param ic_ptr the opened media file handle is put here
298 * @param filename filename to open.
299 * @param fmt if non NULL, force the file format to use
300 * @param buf_size optional buffer size (zero if default is OK)
301 * @param ap additionnal parameters needed when opening the file (NULL if default)
302 * @return 0 if OK. AVERROR_xxx otherwise.
304 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
307 AVFormatParameters *ap)
309 AVFormatContext *ic = NULL;
311 char buf[PROBE_BUF_SIZE];
312 AVProbeData probe_data, *pd = &probe_data;
314 ic = av_mallocz(sizeof(AVFormatContext));
319 pstrcpy(ic->filename, sizeof(ic->filename), filename);
320 pd->filename = ic->filename;
325 /* guess format if no file can be opened */
326 fmt = av_probe_input_format(pd, 0);
329 /* if no file needed do not try to open one */
330 if (!fmt || !(fmt->flags & AVFMT_NOFILE)) {
331 if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0) {
336 url_setbufsize(&ic->pb, buf_size);
338 /* read probe data */
339 pd->buf_size = get_buffer(&ic->pb, buf, PROBE_BUF_SIZE);
340 url_fseek(&ic->pb, 0, SEEK_SET);
343 /* guess file format */
345 fmt = av_probe_input_format(pd, 1);
348 /* if still no format found, error */
356 /* allocate private data */
357 ic->priv_data = av_mallocz(fmt->priv_data_size);
358 if (!ic->priv_data) {
363 /* default pts settings is MPEG like */
364 av_set_pts_info(ic, 33, 1, 90000);
366 /* check filename in case of an image number is expected */
367 if (ic->iformat->flags & AVFMT_NEEDNUMBER) {
368 if (filename_number_test(ic->filename) < 0) {
369 err = AVERROR_NUMEXPECTED;
374 err = ic->iformat->read_header(ic, ap);
380 if (!(fmt->flags & AVFMT_NOFILE)) {
385 av_freep(&ic->priv_data);
393 * Read a packet from a media file
394 * @param s media file handle
395 * @param pkt is filled
396 * @return 0 if OK. AVERROR_xxx if error.
398 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
402 pktl = s->packet_buffer;
404 /* read packet from packet buffer, if there is data */
406 s->packet_buffer = pktl->next;
410 return s->iformat->read_packet(s, pkt);
414 /* state for codec information */
415 #define CSTATE_NOTFOUND 0
416 #define CSTATE_DECODING 1
417 #define CSTATE_FOUND 2
419 static int has_codec_parameters(AVCodecContext *enc)
422 switch(enc->codec_type) {
423 case CODEC_TYPE_AUDIO:
424 val = enc->sample_rate;
426 case CODEC_TYPE_VIDEO:
437 * Read the beginning of a media file to get stream information. This
438 * is useful for file formats with no headers such as MPEG. This
439 * function also compute the real frame rate in case of mpeg2 repeat
442 * @param ic media file handle
443 * @return >=0 if OK. AVERROR_xxx if error.
445 int av_find_stream_info(AVFormatContext *ic)
447 int i, count, ret, got_picture, size, read_size;
452 AVPacketList *pktl=NULL, **ppktl;
453 short samples[AVCODEC_MAX_AUDIO_FRAME_SIZE / 2];
455 int min_read_size, max_read_size;
457 /* typical mpeg ts rate is 40 Mbits. DVD rate is about 10
458 Mbits. We read at most 0.1 second of file to find all streams */
460 /* XXX: base it on stream bitrate when possible */
461 if (ic->iformat == &mpegts_demux) {
462 /* maximum number of bytes we accept to read to find all the streams
464 min_read_size = 3000000;
466 min_read_size = 125000;
468 /* max read size is 2 seconds of video max */
469 max_read_size = min_read_size * 20;
471 /* set initial codec state */
472 for(i=0;i<ic->nb_streams;i++) {
474 if (has_codec_parameters(&st->codec))
475 st->codec_info_state = CSTATE_FOUND;
477 st->codec_info_state = CSTATE_NOTFOUND;
478 st->codec_info_nb_repeat_frames = 0;
479 st->codec_info_nb_real_frames = 0;
484 ppktl = &ic->packet_buffer;
486 /* check if one codec still needs to be handled */
487 for(i=0;i<ic->nb_streams;i++) {
489 if (st->codec_info_state != CSTATE_FOUND)
492 if (i == ic->nb_streams) {
493 /* NOTE: if the format has no header, then we need to read
494 some packets to get most of the streams, so we cannot
496 if (!(ic->iformat->flags & AVFMT_NOHEADER) ||
497 read_size >= min_read_size) {
498 /* if we found the info for all the codecs, we can stop */
503 /* we did not get all the codec info, but we read too much data */
504 if (read_size >= max_read_size) {
510 pktl = av_mallocz(sizeof(AVPacketList));
516 /* add the packet in the buffered packet list */
520 /* NOTE: a new stream can be added there if no header in file
523 if (ic->iformat->read_packet(ic, pkt) < 0) {
525 ret = -1; /* we could not have all the codec parameters before EOF */
526 if ((ic->iformat->flags & AVFMT_NOHEADER) &&
531 read_size += pkt->size;
533 /* open new codecs */
534 for(i=0;i<ic->nb_streams;i++) {
536 if (st->codec_info_state == CSTATE_NOTFOUND) {
537 /* set to found in case of error */
538 st->codec_info_state = CSTATE_FOUND;
539 codec = avcodec_find_decoder(st->codec.codec_id);
541 if(codec->capabilities & CODEC_CAP_TRUNCATED)
542 st->codec.flags |= CODEC_FLAG_TRUNCATED;
544 ret = avcodec_open(&st->codec, codec);
546 st->codec_info_state = CSTATE_DECODING;
551 st = ic->streams[pkt->stream_index];
552 if (st->codec_info_state == CSTATE_DECODING) {
553 /* decode the data and update codec parameters */
557 switch(st->codec.codec_type) {
558 case CODEC_TYPE_VIDEO:
559 ret = avcodec_decode_video(&st->codec, &picture,
560 &got_picture, ptr, size);
562 case CODEC_TYPE_AUDIO:
563 ret = avcodec_decode_audio(&st->codec, samples,
564 &got_picture, ptr, size);
571 /* if error, simply ignore because another packet
576 /* we got the parameters - now we can stop
577 examining this stream */
578 /* XXX: add a codec info so that we can decide if
579 the codec can repeat frames */
580 if (st->codec.codec_id == CODEC_ID_MPEG1VIDEO &&
581 ic->iformat != &mpegts_demux &&
582 st->codec.sub_id == 2) {
583 /* for mpeg2 video, we want to know the real
584 frame rate, so we decode 40 frames. In mpeg
585 TS case we do not do it because it would be
587 st->codec_info_nb_real_frames++;
588 st->codec_info_nb_repeat_frames += st->codec.repeat_pict;
591 if ((st->codec_info_nb_real_frames % 24) == 23) {
592 st->codec_info_nb_repeat_frames += 2;
595 /* stop after 40 frames */
596 if (st->codec_info_nb_real_frames >= 40) {
597 st->r_frame_rate = (st->codec.frame_rate *
598 st->codec_info_nb_real_frames) /
599 (st->codec_info_nb_real_frames +
600 (st->codec_info_nb_repeat_frames >> 1));
605 st->codec_info_state = CSTATE_FOUND;
606 avcodec_close(&st->codec);
617 /* close each codec if there are opened */
618 for(i=0;i<ic->nb_streams;i++) {
620 if (st->codec_info_state == CSTATE_DECODING)
621 avcodec_close(&st->codec);
624 /* set real frame rate info */
625 for(i=0;i<ic->nb_streams;i++) {
627 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
628 if (!st->r_frame_rate)
629 st->r_frame_rate = st->codec.frame_rate;
637 * Close a media file (but not its codecs)
639 * @param s media file handle
641 void av_close_input_file(AVFormatContext *s)
645 if (s->iformat->read_close)
646 s->iformat->read_close(s);
647 for(i=0;i<s->nb_streams;i++) {
648 av_free(s->streams[i]);
650 if (s->packet_buffer) {
651 AVPacketList *p, *p1;
652 p = s->packet_buffer;
655 av_free_packet(&p->pkt);
659 s->packet_buffer = NULL;
661 if (!(s->iformat->flags & AVFMT_NOFILE)) {
664 av_freep(&s->priv_data);
669 * Add a new stream to a media file. Can only be called in the
670 * read_header function. If the flag AVFMT_NOHEADER is in the format
671 * description, then new streams can be added in read_packet too.
674 * @param s media file handle
675 * @param id file format dependent stream id
677 AVStream *av_new_stream(AVFormatContext *s, int id)
681 if (s->nb_streams >= MAX_STREAMS)
684 st = av_mallocz(sizeof(AVStream));
687 st->index = s->nb_streams;
689 s->streams[s->nb_streams++] = st;
693 /************************************************************/
694 /* output media file */
697 * allocate the stream private data and write the stream header to an
700 * @param s media file handle
701 * @return 0 if OK. AVERROR_xxx if error.
703 int av_write_header(AVFormatContext *s)
708 s->priv_data = av_mallocz(s->oformat->priv_data_size);
710 return AVERROR_NOMEM;
711 /* default pts settings is MPEG like */
712 av_set_pts_info(s, 33, 1, 90000);
713 ret = s->oformat->write_header(s);
717 /* init PTS generation */
718 for(i=0;i<s->nb_streams;i++) {
721 switch (st->codec.codec_type) {
722 case CODEC_TYPE_AUDIO:
723 av_frac_init(&st->pts, 0, 0,
724 (INT64)s->pts_num * st->codec.sample_rate);
726 case CODEC_TYPE_VIDEO:
727 av_frac_init(&st->pts, 0, 0,
728 (INT64)s->pts_num * st->codec.frame_rate);
738 * Write a packet to an output media file. The packet shall contain
739 * one audio or video frame.
741 * @param s media file handle
742 * @param stream_index stream index
743 * @param buf buffer containing the frame data
744 * @param size size of buffer
745 * @return < 0 if error, = 0 if OK, 1 if end of stream wanted.
747 int av_write_frame(AVFormatContext *s, int stream_index, const uint8_t *buf,
754 st = s->streams[stream_index];
755 pts_mask = (1LL << s->pts_wrap_bits) - 1;
756 ret = s->oformat->write_packet(s, stream_index, (uint8_t *)buf, size,
757 st->pts.val & pts_mask);
762 switch (st->codec.codec_type) {
763 case CODEC_TYPE_AUDIO:
764 av_frac_add(&st->pts,
765 (INT64)s->pts_den * st->codec.frame_size);
767 case CODEC_TYPE_VIDEO:
768 av_frac_add(&st->pts,
769 (INT64)s->pts_den * FRAME_RATE_BASE);
778 * write the stream trailer to an output media file and and free the
781 * @param s media file handle
782 * @return 0 if OK. AVERROR_xxx if error. */
783 int av_write_trailer(AVFormatContext *s)
786 ret = s->oformat->write_trailer(s);
787 av_freep(&s->priv_data);
791 /* "user interface" functions */
793 void dump_format(AVFormatContext *ic,
801 fprintf(stderr, "%s #%d, %s, %s '%s':\n",
802 is_output ? "Output" : "Input",
804 is_output ? ic->oformat->name : ic->iformat->name,
805 is_output ? "to" : "from", url);
806 for(i=0;i<ic->nb_streams;i++) {
807 AVStream *st = ic->streams[i];
808 avcodec_string(buf, sizeof(buf), &st->codec, is_output);
809 fprintf(stderr, " Stream #%d.%d", index, i);
810 /* the pid is an important information, so we display it */
811 /* XXX: add a generic system */
813 flags = ic->oformat->flags;
815 flags = ic->iformat->flags;
816 if (flags & AVFMT_SHOW_IDS) {
817 fprintf(stderr, "[0x%x]", st->id);
819 fprintf(stderr, ": %s\n", buf);
828 static SizeEntry sizes[] = {
829 { "sqcif", 128, 96 },
830 { "qcif", 176, 144 },
832 { "4cif", 704, 576 },
835 int parse_image_size(int *width_ptr, int *height_ptr, const char *str)
838 int n = sizeof(sizes) / sizeof(SizeEntry);
840 int frame_width = 0, frame_height = 0;
843 if (!strcmp(sizes[i].str, str)) {
844 frame_width = sizes[i].width;
845 frame_height = sizes[i].height;
851 frame_width = strtol(p, (char **)&p, 10);
854 frame_height = strtol(p, (char **)&p, 10);
856 if (frame_width <= 0 || frame_height <= 0)
858 *width_ptr = frame_width;
859 *height_ptr = frame_height;
863 INT64 av_gettime(void)
868 return ((INT64)tb.time * INT64_C(1000) + (INT64)tb.millitm) * INT64_C(1000);
871 gettimeofday(&tv,NULL);
872 return (INT64)tv.tv_sec * 1000000 + tv.tv_usec;
876 static time_t mktimegm(struct tm *tm)
880 int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
888 (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469);
890 t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
896 * - If not a duration:
897 * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
898 * Time is localtime unless Z is suffixed to the end. In this case GMT
899 * Return the date in micro seconds since 1970
901 * HH[:MM[:SS[.m...]]]
904 INT64 parse_date(const char *datestr, int duration)
910 static const char *date_fmt[] = {
914 static const char *time_fmt[] = {
921 time_t now = time(0);
923 len = strlen(datestr);
925 lastch = datestr[len - 1];
928 is_utc = (lastch == 'z' || lastch == 'Z');
930 memset(&dt, 0, sizeof(dt));
935 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {
936 q = strptime(p, date_fmt[i], &dt);
946 dt = *localtime(&now);
948 dt.tm_hour = dt.tm_min = dt.tm_sec = 0;
953 if (*p == 'T' || *p == 't' || *p == ' ')
956 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {
957 q = strptime(p, time_fmt[i], &dt);
963 q = strptime(p, time_fmt[0], &dt);
965 dt.tm_sec = strtol(p, (char **)&q, 10);
971 /* Now we have all the fields that we can get */
976 return now * INT64_C(1000000);
980 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;
982 dt.tm_isdst = -1; /* unknown */
995 for (val = 0, n = 100000; n >= 1; n /= 10, q++) {
998 val += n * (*q - '0');
1005 /* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return
1007 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
1017 while (*p != '\0' && *p != '=' && *p != '&') {
1018 if ((q - tag) < sizeof(tag) - 1)
1026 while (*p != '&' && *p != '\0') {
1027 if ((q - arg) < arg_size - 1) {
1037 if (!strcmp(tag, tag1))
1046 /* Return in 'buf' the path with '%d' replaced by number. Also handles
1047 the '%0nd' format where 'n' is the total number of digits and
1048 '%%'. Return 0 if OK, and -1 if format error */
1049 int get_frame_filename(char *buf, int buf_size,
1050 const char *path, int number)
1054 int nd, len, c, percentd_found;
1065 while (*p >= '0' && *p <= '9') {
1066 nd = nd * 10 + *p++ - '0';
1076 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
1078 if ((q - buf + len) > buf_size - 1)
1080 memcpy(q, buf1, len);
1088 if ((q - buf) < buf_size - 1)
1092 if (!percentd_found)
1103 * Print on stdout a nice hexa dump of a buffer
1105 * @param size buffer size
1107 void av_hex_dump(UINT8 *buf, int size)
1111 for(i=0;i<size;i+=16) {
1118 printf(" %02x", buf[i+j]);
1123 for(j=0;j<len;j++) {
1125 if (c < ' ' || c > '~')
1133 void url_split(char *proto, int proto_size,
1134 char *hostname, int hostname_size,
1136 char *path, int path_size,
1147 while (*p != ':' && *p != '\0') {
1148 if ((q - proto) < proto_size - 1)
1157 if (hostname_size > 0)
1167 while (*p != ':' && *p != '/' && *p != '?' && *p != '\0') {
1168 if ((q - hostname) < hostname_size - 1)
1172 if (hostname_size > 0)
1176 port = strtoul(p, (char **)&p, 10);
1181 pstrcpy(path, path_size, p);
1185 * Set the pts for a given stream
1187 * @param pts_wrap_bits number of bits effectively used by the pts
1188 * (used for wrap control, 33 is the value for MPEG)
1189 * @param pts_num numerator to convert to seconds (MPEG: 1)
1190 * @param pts_den denominator to convert to seconds (MPEG: 90000)
1192 void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits,
1193 int pts_num, int pts_den)
1195 s->pts_wrap_bits = pts_wrap_bits;
1196 s->pts_num = pts_num;
1197 s->pts_den = pts_den;
1200 /* fraction handling */
1203 * f = val + (num / den) + 0.5. 'num' is normalized so that it is such
1204 * as 0 <= num < den.
1206 * @param f fractional number
1207 * @param val integer value
1208 * @param num must be >= 0
1209 * @param den must be >= 1
1211 void av_frac_init(AVFrac *f, INT64 val, INT64 num, INT64 den)
1223 /* set f to (val + 0.5) */
1224 void av_frac_set(AVFrac *f, INT64 val)
1227 f->num = f->den >> 1;
1231 * Fractionnal addition to f: f = f + (incr / f->den)
1233 * @param f fractional number
1234 * @param incr increment, can be positive or negative
1236 void av_frac_add(AVFrac *f, INT64 incr)
1240 num = f->num + incr;
1243 f->val += num / den;
1249 } else if (num >= den) {
1250 f->val += num / den;