Merge commit 'afc8685395e775fe0f2a1698b683aea4afd124af'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Jun 2013 21:38:27 +0000 (23:38 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Jun 2013 21:38:27 +0000 (23:38 +0200)
* commit 'afc8685395e775fe0f2a1698b683aea4afd124af':
  avf: split off format register and lookup function

Conflicts:
libavformat/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/Makefile
libavformat/format.c
libavformat/utils.c

@@@ -11,8 -9,10 +11,9 @@@ OBJS = allformats.o         
         avio.o               \
         aviobuf.o            \
         cutils.o             \
+        format.o                   \
         id3v1.o              \
         id3v2.o              \
 -       log2_tab.o           \
         metadata.o           \
         mux.o                \
         options.o            \
index 0000000,3a510cd..c1be859
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,183 +1,187 @@@
 - * This file is part of Libav.
+ /*
+  * Format register and lookup
+  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
 -        if (fmt->name && short_name && !av_strcasecmp(fmt->name, short_name))
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "avformat.h"
+ #include "internal.h"
+ #include "libavutil/avstring.h"
+ /**
+  * @file
+  * Format register and lookup
+  */
+ /** head of registered input format linked list */
+ static AVInputFormat *first_iformat = NULL;
+ /** head of registered output format linked list */
+ static AVOutputFormat *first_oformat = NULL;
+ AVInputFormat *av_iformat_next(AVInputFormat *f)
+ {
+     if (f)
+         return f->next;
+     else
+         return first_iformat;
+ }
+ AVOutputFormat *av_oformat_next(AVOutputFormat *f)
+ {
+     if (f)
+         return f->next;
+     else
+         return first_oformat;
+ }
+ void av_register_input_format(AVInputFormat *format)
+ {
+     AVInputFormat **p = &first_iformat;
+     while (*p != NULL)
+         p = &(*p)->next;
+     *p = format;
+     format->next = NULL;
+ }
+ void av_register_output_format(AVOutputFormat *format)
+ {
+     AVOutputFormat **p = &first_oformat;
+     while (*p != NULL)
+         p = &(*p)->next;
+     *p = format;
+     format->next = NULL;
+ }
+ int av_match_ext(const char *filename, const char *extensions)
+ {
+     const char *ext, *p;
+     char ext1[32], *q;
+     if (!filename)
+         return 0;
+     ext = strrchr(filename, '.');
+     if (ext) {
+         ext++;
+         p = extensions;
+         for (;;) {
+             q = ext1;
+             while (*p != '\0' && *p != ','  && q - ext1 < sizeof(ext1) - 1)
+                 *q++ = *p++;
+             *q = '\0';
+             if (!av_strcasecmp(ext1, ext))
+                 return 1;
+             if (*p == '\0')
+                 break;
+             p++;
+         }
+     }
+     return 0;
+ }
+ static int match_format(const char *name, const char *names)
+ {
+     const char *p;
+     int len, namelen;
+     if (!name || !names)
+         return 0;
+     namelen = strlen(name);
+     while ((p = strchr(names, ','))) {
+         len = FFMAX(p - names, namelen);
+         if (!av_strncasecmp(name, names, len))
+             return 1;
+         names = p + 1;
+     }
+     return !av_strcasecmp(name, names);
+ }
+ AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
+                                 const char *mime_type)
+ {
+     AVOutputFormat *fmt = NULL, *fmt_found;
+     int score_max, score;
+     /* specific test for image sequences */
+ #if CONFIG_IMAGE2_MUXER
+     if (!short_name && filename &&
+         av_filename_number_test(filename) &&
+         ff_guess_image2_codec(filename) != AV_CODEC_ID_NONE) {
+         return av_guess_format("image2", NULL, NULL);
+     }
+ #endif
+     /* Find the proper file type. */
+     fmt_found = NULL;
+     score_max = 0;
+     while ((fmt = av_oformat_next(fmt))) {
+         score = 0;
++        if (fmt->name && short_name && match_format(short_name, fmt->name))
+             score += 100;
+         if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
+             score += 10;
+         if (filename && fmt->extensions &&
+             av_match_ext(filename, fmt->extensions)) {
+             score += 5;
+         }
+         if (score > score_max) {
+             score_max = score;
+             fmt_found = fmt;
+         }
+     }
+     return fmt_found;
+ }
+ enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
+                               const char *filename, const char *mime_type,
+                               enum AVMediaType type)
+ {
++    if (!strcmp(fmt->name, "segment") || !strcmp(fmt->name, "ssegment")) {
++        fmt = av_guess_format(NULL, filename, NULL);
++    }
++
+     if (type == AVMEDIA_TYPE_VIDEO) {
+         enum AVCodecID codec_id = AV_CODEC_ID_NONE;
+ #if CONFIG_IMAGE2_MUXER
+         if (!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")) {
+             codec_id = ff_guess_image2_codec(filename);
+         }
+ #endif
+         if (codec_id == AV_CODEC_ID_NONE)
+             codec_id = fmt->video_codec;
+         return codec_id;
+     } else if (type == AVMEDIA_TYPE_AUDIO)
+         return fmt->audio_codec;
+     else if (type == AVMEDIA_TYPE_SUBTITLE)
+         return fmt->subtitle_codec;
+     else
+         return AV_CODEC_ID_NONE;
+ }
+ AVInputFormat *av_find_input_format(const char *short_name)
+ {
+     AVInputFormat *fmt = NULL;
+     while ((fmt = av_iformat_next(fmt)))
+         if (match_format(short_name, fmt->name))
+             return fmt;
+     return NULL;
+ }
@@@ -67,192 -63,9 +67,42 @@@ const char *avformat_configuration(void
  const char *avformat_license(void)
  {
  #define LICENSE_PREFIX "libavformat license: "
 -    return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +}
 +
 +#define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
 +
 +static int is_relative(int64_t ts) {
 +    return ts > (RELATIVE_TS_BASE - (1LL<<48));
 +}
 +
 +/**
 + * Wrap a given time stamp, if there is an indication for an overflow
 + *
 + * @param st stream
 + * @param timestamp the time stamp to wrap
 + * @return resulting time stamp
 + */
 +static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
 +{
 +    if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
 +        st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
 +        if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
 +            timestamp < st->pts_wrap_reference)
 +            return timestamp + (1ULL<<st->pts_wrap_bits);
 +        else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
 +            timestamp >= st->pts_wrap_reference)
 +            return timestamp - (1ULL<<st->pts_wrap_bits);
 +    }
 +    return timestamp;
  }
  
- /** head of registered input format linked list */
- static AVInputFormat *first_iformat = NULL;
- /** head of registered output format linked list */
- static AVOutputFormat *first_oformat = NULL;
- AVInputFormat  *av_iformat_next(AVInputFormat  *f)
- {
-     if(f) return f->next;
-     else  return first_iformat;
- }
- AVOutputFormat *av_oformat_next(AVOutputFormat *f)
- {
-     if(f) return f->next;
-     else  return first_oformat;
- }
- void av_register_input_format(AVInputFormat *format)
- {
-     AVInputFormat **p;
-     p = &first_iformat;
-     while (*p != NULL) p = &(*p)->next;
-     *p = format;
-     format->next = NULL;
- }
- void av_register_output_format(AVOutputFormat *format)
- {
-     AVOutputFormat **p;
-     p = &first_oformat;
-     while (*p != NULL) p = &(*p)->next;
-     *p = format;
-     format->next = NULL;
- }
- int av_match_ext(const char *filename, const char *extensions)
- {
-     const char *ext, *p;
-     char ext1[32], *q;
-     if(!filename)
-         return 0;
-     ext = strrchr(filename, '.');
-     if (ext) {
-         ext++;
-         p = extensions;
-         for(;;) {
-             q = ext1;
-             while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
-                 *q++ = *p++;
-             *q = '\0';
-             if (!av_strcasecmp(ext1, ext))
-                 return 1;
-             if (*p == '\0')
-                 break;
-             p++;
-         }
-     }
-     return 0;
- }
- static int match_format(const char *name, const char *names)
- {
-     const char *p;
-     int len, namelen;
-     if (!name || !names)
-         return 0;
-     namelen = strlen(name);
-     while ((p = strchr(names, ','))) {
-         len = FFMAX(p - names, namelen);
-         if (!av_strncasecmp(name, names, len))
-             return 1;
-         names = p+1;
-     }
-     return !av_strcasecmp(name, names);
- }
- AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
-                                 const char *mime_type)
- {
-     AVOutputFormat *fmt = NULL, *fmt_found;
-     int score_max, score;
-     /* specific test for image sequences */
- #if CONFIG_IMAGE2_MUXER
-     if (!short_name && filename &&
-         av_filename_number_test(filename) &&
-         ff_guess_image2_codec(filename) != AV_CODEC_ID_NONE) {
-         return av_guess_format("image2", NULL, NULL);
-     }
- #endif
-     /* Find the proper file type. */
-     fmt_found = NULL;
-     score_max = 0;
-     while ((fmt = av_oformat_next(fmt))) {
-         score = 0;
-         if (fmt->name && short_name && match_format(short_name, fmt->name))
-             score += 100;
-         if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
-             score += 10;
-         if (filename && fmt->extensions &&
-             av_match_ext(filename, fmt->extensions)) {
-             score += 5;
-         }
-         if (score > score_max) {
-             score_max = score;
-             fmt_found = fmt;
-         }
-     }
-     return fmt_found;
- }
- enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
-                             const char *filename, const char *mime_type, enum AVMediaType type){
-     if (!strcmp(fmt->name, "segment") || !strcmp(fmt->name, "ssegment")) {
-         fmt = av_guess_format(NULL, filename, NULL);
-     }
-     if(type == AVMEDIA_TYPE_VIDEO){
-         enum AVCodecID codec_id= AV_CODEC_ID_NONE;
- #if CONFIG_IMAGE2_MUXER
-         if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
-             codec_id= ff_guess_image2_codec(filename);
-         }
- #endif
-         if(codec_id == AV_CODEC_ID_NONE)
-             codec_id= fmt->video_codec;
-         return codec_id;
-     }else if(type == AVMEDIA_TYPE_AUDIO)
-         return fmt->audio_codec;
-     else if (type == AVMEDIA_TYPE_SUBTITLE)
-         return fmt->subtitle_codec;
-     else
-         return AV_CODEC_ID_NONE;
- }
- AVInputFormat *av_find_input_format(const char *short_name)
- {
-     AVInputFormat *fmt = NULL;
-     while ((fmt = av_iformat_next(fmt))) {
-         if (match_format(short_name, fmt->name))
-             return fmt;
-     }
-     return NULL;
- }
 +#define MAKE_ACCESSORS(str, name, type, field) \
 +    type av_##name##_get_##field(const str *s) { return s->field; } \
 +    void av_##name##_set_##field(str *s, type v) { s->field = v; }
 +
 +MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
 +
  /* an arbitrarily chosen "sane" max packet size -- 50M */
  #define SANE_CHUNK_SIZE (50000000)