changeset 5126:7982b376b58a libavcodec

Move the video size and rate abbreviations system from libavformat to libavcodec patch by Stefano Sabatini: [stefano dot sabatini minus lala poste dot it] original thread: [FFmpeg-devel] [PATCH] Redesign the video size and rateabbreviations system date: 06/02/2007 05:30 PM
author benoit
date Tue, 12 Jun 2007 08:06:54 +0000
parents 13ffe6b5bd0e
children 4dbe6578f811
files avcodec.h utils.c
diffstat 2 files changed, 134 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Tue Jun 12 07:59:43 2007 +0000
+++ b/avcodec.h	Tue Jun 12 08:06:54 2007 +0000
@@ -2882,6 +2882,30 @@
 
 extern unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
 
+/**
+ * Parses \p str and put in \p width_ptr and \p height_ptr the detected values.
+ *
+ * @return 0 in case of a successfull parsing, a negative value otherwise
+ * @param[in] str the string to parse: it has to be a string in the format
+ * <width>x<height> or a valid video frame size abbreviation.
+ * @param[in,out] width_ptr pointer to the variable which will contain the detected
+ * frame width value
+ * @param[in,out] height_ptr pointer to the variable which will contain the detected
+ * frame height value
+ */
+int av_parse_video_frame_size(int *width_ptr, int *height_ptr, const char *str);
+
+/**
+ * Parses \p str and put in \p frame_rate the detected values.
+ *
+ * @return 0 in case of a successfull parsing, a negative value otherwise
+ * @param[in] str the string to parse: it has to be a string in the format
+ * <frame_rate_nom>/<frame_rate_den>, a float number or a valid video rate abbreviation
+ * @param[in,out] frame_rate pointer to the AVRational which will contain the detected
+ * frame rate
+ */
+int av_parse_video_frame_rate(AVRational *frame_rate, const char *str);
+
 /* error handling */
 #if EINVAL > 0
 #define AVERROR(e) (-(e)) /**< Returns a negative error code from a POSIX error code, to return from library functions. */
--- a/utils.c	Tue Jun 12 07:59:43 2007 +0000
+++ b/utils.c	Tue Jun 12 08:06:54 2007 +0000
@@ -1347,3 +1347,113 @@
     }
     return fd; /* success */
 }
+
+typedef struct {
+    const char *abv;
+    int width, height;
+    int frame_rate, frame_rate_base;
+} AbvEntry;
+
+static AbvEntry frame_abvs[] = {
+    { "ntsc",      720, 480, 30000, 1001 },
+    { "pal",       720, 576,    25,    1 },
+    { "qntsc",     352, 240, 30000, 1001 }, /* VCD compliant ntsc */
+    { "qpal",      352, 288,    25,    1 }, /* VCD compliant pal */
+    { "sntsc",     640, 480, 30000, 1001 }, /* square pixel NTSC */
+    { "spal",      768, 576,    25,    1 }, /* square pixel PAL */
+    { "film",      352, 240,    24,    1 },
+    { "ntsc-film", 352, 240, 24000, 1001 },
+    { "sqcif",     128,  96,     0,    0 },
+    { "qcif",      176, 144,     0,    0 },
+    { "cif",       352, 288,     0,    0 },
+    { "4cif",      704, 576,     0,    0 },
+    { "qqvga",     160, 120,     0,    0 },
+    { "qvga",      320, 240,     0,    0 },
+    { "vga",       640, 480,     0,    0 },
+    { "svga",      800, 600,     0,    0 },
+    { "xga",      1024, 768,     0,    0 },
+    { "uxga",     1600,1200,     0,    0 },
+    { "qxga",     2048,1536,     0,    0 },
+    { "sxga",     1280,1024,     0,    0 },
+    { "qsxga",    2560,2048,     0,    0 },
+    { "hsxga",    5120,4096,     0,    0 },
+    { "wvga",      852, 480,     0,    0 },
+    { "wxga",     1366, 768,     0,    0 },
+    { "wsxga",    1600,1024,     0,    0 },
+    { "wuxga",    1920,1200,     0,    0 },
+    { "woxga",    2560,1600,     0,    0 },
+    { "wqsxga",   3200,2048,     0,    0 },
+    { "wquxga",   3840,2400,     0,    0 },
+    { "whsxga",   6400,4096,     0,    0 },
+    { "whuxga",   7680,4800,     0,    0 },
+    { "cga",       320, 200,     0,    0 },
+    { "ega",       640, 350,     0,    0 },
+    { "hd480",     852, 480,     0,    0 },
+    { "hd720",    1280, 720,     0,    0 },
+    { "hd1080",   1920,1080,     0,    0 },
+};
+
+int av_parse_video_frame_size(int *width_ptr, int *height_ptr, const char *str)
+{
+    int i;
+    int n = sizeof(frame_abvs) / sizeof(AbvEntry);
+    const char *p;
+    int frame_width = 0, frame_height = 0;
+
+    for(i=0;i<n;i++) {
+        if (!strcmp(frame_abvs[i].abv, str)) {
+            frame_width = frame_abvs[i].width;
+            frame_height = frame_abvs[i].height;
+            break;
+        }
+    }
+    if (i == n) {
+        p = str;
+        frame_width = strtol(p, (char **)&p, 10);
+        if (*p)
+            p++;
+        frame_height = strtol(p, (char **)&p, 10);
+    }
+    if (frame_width <= 0 || frame_height <= 0)
+        return -1;
+    *width_ptr = frame_width;
+    *height_ptr = frame_height;
+    return 0;
+}
+
+int av_parse_video_frame_rate(AVRational *frame_rate, const char *arg)
+{
+    int i;
+    char* cp;
+
+    /* First, we check our abbreviation table */
+    for (i = 0; i < sizeof(frame_abvs)/sizeof(*frame_abvs); ++i)
+         if (!strcmp(frame_abvs[i].abv, arg)) {
+             frame_rate->num = frame_abvs[i].frame_rate;
+             frame_rate->den = frame_abvs[i].frame_rate_base;
+             return 0;
+         }
+
+    /* Then, we try to parse it as fraction */
+    cp = strchr(arg, '/');
+    if (!cp)
+        cp = strchr(arg, ':');
+    if (cp) {
+        char* cpp;
+        frame_rate->num = strtol(arg, &cpp, 10);
+        if (cpp != arg || cpp == cp)
+            frame_rate->den = strtol(cp+1, &cpp, 10);
+        else
+           frame_rate->num = 0;
+    }
+    else {
+        /* Finally we give up and parse it as double */
+        AVRational time_base = av_d2q(strtod(arg, 0), DEFAULT_FRAME_RATE_BASE);
+        frame_rate->den = time_base.den;
+        frame_rate->num = time_base.num;
+    }
+    if (!frame_rate->num || !frame_rate->den)
+        return -1;
+    else
+        return 0;
+}