summaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorPanagiotis Issaris <takis.issaris@uhasselt.be>2006-09-18 11:35:48 +0000
committerPanagiotis Issaris <takis.issaris@uhasselt.be>2006-09-18 11:35:48 +0000
commit97c73545a5d6b28e2ea16773e9f3ba87e3a1c9cb (patch)
tree4e1c1860fde1df05f7a7451ff3a53de9b3ea05a1 /libavcodec
parente9e12f0e11f43cab3e61257b95f6a6b0ac21b202 (diff)
downloadffmpeg-streaming-97c73545a5d6b28e2ea16773e9f3ba87e3a1c9cb.zip
ffmpeg-streaming-97c73545a5d6b28e2ea16773e9f3ba87e3a1c9cb.tar.gz
Add support for SI (k, M, ...) and IEC/IEEE (Ki, Mi, ...) units.
Originally committed as revision 6287 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/eval.c37
-rw-r--r--libavcodec/opt.c75
2 files changed, 55 insertions, 57 deletions
diff --git a/libavcodec/eval.c b/libavcodec/eval.c
index 7eb835f..db15f2b 100644
--- a/libavcodec/eval.c
+++ b/libavcodec/eval.c
@@ -64,49 +64,14 @@ static int strmatch(const char *s, const char *prefix){
return 1;
}
-static int8_t si_prefixes['z' - 'E' + 1]={
- ['y'-'E']= -24,
- ['z'-'E']= -21,
- ['a'-'E']= -18,
- ['f'-'E']= -15,
- ['p'-'E']= -12,
- ['n'-'E']= - 9,
- ['u'-'E']= - 6,
- ['m'-'E']= - 3,
- ['c'-'E']= - 2,
- ['d'-'E']= - 1,
- ['h'-'E']= 2,
- ['k'-'E']= 3,
- ['K'-'E']= 3,
- ['M'-'E']= 6,
- ['G'-'E']= 9,
- ['T'-'E']= 12,
- ['P'-'E']= 15,
- ['E'-'E']= 18,
- ['Z'-'E']= 21,
- ['Y'-'E']= 24,
-};
-
static double evalPrimary(Parser *p){
double d, d2=NAN;
char *next= p->s;
int i;
/* number */
- d= strtod(p->s, &next);
+ d= av_strtod(p->s, &next);
if(next != p->s){
- if(*next >= 'E' && *next <= 'z'){
- int e= si_prefixes[*next - 'E'];
- if(e){
- if(next[1] == 'i'){
- d*= pow( 2, e/0.3);
- next+=2;
- }else{
- d*= pow(10, e);
- next++;
- }
- }
- }
p->s= next;
return d;
}
diff --git a/libavcodec/opt.c b/libavcodec/opt.c
index 63728f8..0de7c18 100644
--- a/libavcodec/opt.c
+++ b/libavcodec/opt.c
@@ -27,30 +27,63 @@
#include "avcodec.h"
#include "opt.h"
-/**
- * strtod() function extended with 'k', 'M' and 'B' postfixes.
- * This allows using kB, MB, k, M and B as a postfix. This function
- * assumes that the unit of numbers is bits not bytes.
+static int8_t si_prefixes['z' - 'E' + 1]={
+ ['y'-'E']= -24,
+ ['z'-'E']= -21,
+ ['a'-'E']= -18,
+ ['f'-'E']= -15,
+ ['p'-'E']= -12,
+ ['n'-'E']= - 9,
+ ['u'-'E']= - 6,
+ ['m'-'E']= - 3,
+ ['c'-'E']= - 2,
+ ['d'-'E']= - 1,
+ ['h'-'E']= 2,
+ ['k'-'E']= 3,
+ ['K'-'E']= 3,
+ ['M'-'E']= 6,
+ ['G'-'E']= 9,
+ ['T'-'E']= 12,
+ ['P'-'E']= 15,
+ ['E'-'E']= 18,
+ ['Z'-'E']= 21,
+ ['Y'-'E']= 24,
+};
+
+/** strtod() function extended with 'k', 'M', 'G', 'ki', 'Mi', 'Gi' and 'B'
+ * postfixes. This allows using f.e. kB, MiB, G and B as a postfix. This
+ * function assumes that the unit of numbers is bits not bytes.
*/
-static double av_strtod(const char *name, char **tail) {
+double av_strtod(const char *name, char **tail) {
double d;
- d= strtod(name, tail);
- if(*tail>name && (**tail=='k')) {
- d*=1000;
- (*tail)++;
- }
- else if(*tail && (**tail=='M')) {
- d*=1000000;
- (*tail)++;
- }
- else if(*tail && (**tail=='G')) {
- d*=1000000000;
- (*tail)++;
- }
- if(*tail && (**tail=='B')) {
- d*=8;
- (*tail)++;
+ int p = 0;
+ char *next;
+ d = strtod(name, &next);
+ /* if parsing succeeded, check for and interpret postfixes */
+ if (next!=name) {
+
+ if(*next >= 'E' && *next <= 'z'){
+ int e= si_prefixes[*next - 'E'];
+ if(e){
+ if(next[1] == 'i'){
+ d*= pow( 2, e/0.3);
+ next+=2;
+ }else{
+ d*= pow(10, e);
+ next++;
+ }
+ }
+ }
+
+ if(*next=='B') {
+ d*=8;
+ *next++;
+ }
}
+ /* if requested, fill in tail with the position after the last parsed
+ character */
+ if (tail)
+ *tail = next;
return d;
}
OpenPOWER on IntegriCloud