From 26ef3220cf6ad4a3cb1580086c244394f5aa3094 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Tue, 12 Jun 2007 08:06:54 +0000 Subject: [PATCH] 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 Originally committed as revision 9288 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 24 +++++++++ libavcodec/utils.c | 110 +++++++++++++++++++++++++++++++++++++++++ libavformat/avformat.h | 6 ++- libavformat/utils.c | 110 +++-------------------------------------- 4 files changed, 145 insertions(+), 105 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 77ef97834..6403e59e5 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2882,6 +2882,30 @@ attribute_deprecated int img_pad(AVPicture *dst, const AVPicture *src, int heigh 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 + * x 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 + * /, 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. */ diff --git a/libavcodec/utils.c b/libavcodec/utils.c index ef429beef..f5534be1a 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1347,3 +1347,113 @@ int av_tempfile(char *prefix, char **filename) { } 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;inum = 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; +} diff --git a/libavformat/avformat.h b/libavformat/avformat.h index fa9be314e..0fda3d914 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -763,13 +763,15 @@ void dump_format(AVFormatContext *ic, /** * parses width and height out of string str. + * @deprecated Use av_parse_video_frame_size instead. */ -int parse_image_size(int *width_ptr, int *height_ptr, const char *str); +attribute_deprecated int parse_image_size(int *width_ptr, int *height_ptr, const char *str); /** * Converts frame rate from string to a fraction. + * @deprecated Use av_parse_video_frame_rate instead. */ -int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg); +attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg); /** * Converts date string to number of seconds since Jan 1st, 1970. diff --git a/libavformat/utils.c b/libavformat/utils.c index 0b7b5ee40..54cb3a40c 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2482,114 +2482,18 @@ void dump_format(AVFormatContext *ic, } } -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 parse_image_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