⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 3 页
字号:
    { "sqcif", 128, 96 },    { "qcif", 176, 144 },    { "cif", 352, 288 },    { "4cif", 704, 576 },};    int parse_image_size(int *width_ptr, int *height_ptr, const char *str){    int i;    int n = sizeof(sizes) / sizeof(SizeEntry);    const char *p;    int frame_width = 0, frame_height = 0;    for(i=0;i<n;i++) {        if (!strcmp(sizes[i].str, str)) {            frame_width = sizes[i].width;            frame_height = sizes[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;}INT64 av_gettime(void){#ifdef CONFIG_WIN32    struct _timeb tb;    _ftime(&tb);    return ((INT64)tb.time * INT64_C(1000) + (INT64)tb.millitm) * INT64_C(1000);#else    struct timeval tv;    gettimeofday(&tv,NULL);    return (INT64)tv.tv_sec * 1000000 + tv.tv_usec;#endif}static time_t mktimegm(struct tm *tm){    time_t t;    int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;    if (m < 3) {        m += 12;        y--;    }    t = 86400 *         (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469);    t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;    return t;}/* Syntax: * - If not a duration: *  [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]} * Time is localtime unless Z is suffixed to the end. In this case GMT * Return the date in micro seconds since 1970  * - If duration: *  HH[:MM[:SS[.m...]]] *  S+[.m...] */INT64 parse_date(const char *datestr, int duration){    const char *p;    INT64 t;    struct tm dt;    int i;    static const char *date_fmt[] = {        "%Y-%m-%d",        "%Y%m%d",    };    static const char *time_fmt[] = {        "%H:%M:%S",        "%H%M%S",    };    const char *q;    int is_utc, len;    char lastch;    time_t now = time(0);    len = strlen(datestr);    if (len > 0)        lastch = datestr[len - 1];    else        lastch = '\0';    is_utc = (lastch == 'z' || lastch == 'Z');    memset(&dt, 0, sizeof(dt));    p = datestr;    q = NULL;    if (!duration) {        for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) {            q = strptime(p, date_fmt[i], &dt);            if (q) {                break;            }        }        if (!q) {            if (is_utc) {                dt = *gmtime(&now);            } else {                dt = *localtime(&now);            }            dt.tm_hour = dt.tm_min = dt.tm_sec = 0;        } else {            p = q;        }        if (*p == 'T' || *p == 't' || *p == ' ')            p++;        for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) {            q = strptime(p, time_fmt[i], &dt);            if (q) {                break;            }        }    } else {        q = strptime(p, time_fmt[0], &dt);        if (!q) {            dt.tm_sec = strtol(p, (char **)&q, 10);            dt.tm_min = 0;            dt.tm_hour = 0;        }    }    /* Now we have all the fields that we can get */    if (!q) {        if (duration)            return 0;        else            return now * INT64_C(1000000);    }    if (duration) {        t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;    } else {        dt.tm_isdst = -1;       /* unknown */        if (is_utc) {            t = mktimegm(&dt);        } else {            t = mktime(&dt);        }    }    t *= 1000000;    if (*q == '.') {        int val, n;        q++;        for (val = 0, n = 100000; n >= 1; n /= 10, q++) {            if (!isdigit(*q))                 break;            val += n * (*q - '0');        }        t += val;    }    return t;}/* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return   1 if found */int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info){    const char *p;    char tag[128], *q;    p = info;    if (*p == '?')        p++;    for(;;) {        q = tag;        while (*p != '\0' && *p != '=' && *p != '&') {            if ((q - tag) < sizeof(tag) - 1)                *q++ = *p;            p++;        }        *q = '\0';        q = arg;        if (*p == '=') {            p++;            while (*p != '&' && *p != '\0') {                if ((q - arg) < arg_size - 1) {                    if (*p == '+')                        *q++ = ' ';                    else                        *q++ = *p;                }                p++;            }            *q = '\0';        }        if (!strcmp(tag, tag1))             return 1;        if (*p != '&')            break;        p++;    }    return 0;}/* Return in 'buf' the path with '%d' replaced by number. Also handles   the '%0nd' format where 'n' is the total number of digits and   '%%'. Return 0 if OK, and -1 if format error */int get_frame_filename(char *buf, int buf_size,                       const char *path, int number){    const char *p;    char *q, buf1[20];    int nd, len, c, percentd_found;    q = buf;    p = path;    percentd_found = 0;    for(;;) {        c = *p++;        if (c == '\0')            break;        if (c == '%') {            nd = 0;            while (*p >= '0' && *p <= '9') {                nd = nd * 10 + *p++ - '0';            }            c = *p++;            switch(c) {            case '%':                goto addchar;            case 'd':                if (percentd_found)                    goto fail;                percentd_found = 1;                snprintf(buf1, sizeof(buf1), "%0*d", nd, number);                len = strlen(buf1);                if ((q - buf + len) > buf_size - 1)                    goto fail;                memcpy(q, buf1, len);                q += len;                break;            default:                goto fail;            }        } else {        addchar:            if ((q - buf) < buf_size - 1)                *q++ = c;        }    }    if (!percentd_found)        goto fail;    *q = '\0';    return 0; fail:    *q = '\0';    return -1;}/** * * Print on stdout a nice hexa dump of a buffer * @param buf buffer * @param size buffer size */void av_hex_dump(UINT8 *buf, int size){    int len, i, j, c;    for(i=0;i<size;i+=16) {        len = size - i;        if (len > 16)            len = 16;        printf("%08x ", i);        for(j=0;j<16;j++) {            if (j < len)                printf(" %02x", buf[i+j]);            else                printf("   ");        }        printf(" ");        for(j=0;j<len;j++) {            c = buf[i+j];            if (c < ' ' || c > '~')                c = '.';            printf("%c", c);        }        printf("\n");    }}void url_split(char *proto, int proto_size,               char *hostname, int hostname_size,               int *port_ptr,               char *path, int path_size,               const char *url){    const char *p;    char *q;    int port;    port = -1;    p = url;    q = proto;    while (*p != ':' && *p != '\0') {        if ((q - proto) < proto_size - 1)            *q++ = *p;        p++;    }    if (proto_size > 0)        *q = '\0';    if (*p == '\0') {        if (proto_size > 0)            proto[0] = '\0';        if (hostname_size > 0)            hostname[0] = '\0';        p = url;    } else {        p++;        if (*p == '/')            p++;        if (*p == '/')            p++;        q = hostname;        while (*p != ':' && *p != '/' && *p != '?' && *p != '\0') {            if ((q - hostname) < hostname_size - 1)                *q++ = *p;            p++;        }        if (hostname_size > 0)            *q = '\0';        if (*p == ':') {            p++;            port = strtoul(p, (char **)&p, 10);        }    }    if (port_ptr)        *port_ptr = port;    pstrcpy(path, path_size, p);}/** * Set the pts for a given stream * @param s stream  * @param pts_wrap_bits number of bits effectively used by the pts *        (used for wrap control, 33 is the value for MPEG)  * @param pts_num numerator to convert to seconds (MPEG: 1)  * @param pts_den denominator to convert to seconds (MPEG: 90000) */void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits,                     int pts_num, int pts_den){    s->pts_wrap_bits = pts_wrap_bits;    s->pts_num = pts_num;    s->pts_den = pts_den;}/* fraction handling *//** * f = val + (num / den) + 0.5. 'num' is normalized so that it is such * as 0 <= num < den. * * @param f fractional number * @param val integer value * @param num must be >= 0 * @param den must be >= 1  */void av_frac_init(AVFrac *f, INT64 val, INT64 num, INT64 den){    num += (den >> 1);    if (num >= den) {        val += num / den;        num = num % den;    }    f->val = val;    f->num = num;    f->den = den;}/* set f to (val + 0.5) */void av_frac_set(AVFrac *f, INT64 val){    f->val = val;    f->num = f->den >> 1;}/** * Fractionnal addition to f: f = f + (incr / f->den) * * @param f fractional number * @param incr increment, can be positive or negative */void av_frac_add(AVFrac *f, INT64 incr){    INT64 num, den;    num = f->num + incr;    den = f->den;    if (num < 0) {        f->val += num / den;        num = num % den;        if (num < 0) {            num += den;            f->val--;        }    } else if (num >= den) {        f->val += num / den;        num = num % den;    }    f->num = num;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -