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

📄 aviobuf.c

📁 FFmpeg is an audio/video conversion tool. It includes libavcodec, the leading open source codec libr
💻 C
📖 第 1 页 / 共 2 页
字号:
{    uint64_t val;    val = (uint64_t)get_le32(s);    val |= (uint64_t)get_le32(s) << 32;    return val;}unsigned int get_be16(ByteIOContext *s){    unsigned int val;    val = get_byte(s) << 8;    val |= get_byte(s);    return val;}unsigned int get_be32(ByteIOContext *s){    unsigned int val;    val = get_byte(s) << 24;    val |= get_byte(s) << 16;    val |= get_byte(s) << 8;    val |= get_byte(s);    return val;}double get_be64_double(ByteIOContext *s){    union {        double d;        uint64_t ull;    } u;    u.ull = get_be64(s);    return u.d;}char *get_strz(ByteIOContext *s, char *buf, int maxlen){    int i = 0;    char c;    while ((c = get_byte(s))) {        if (i < maxlen-1)            buf[i++] = c;    }        buf[i] = 0; /* Ensure null terminated, but may be truncated */    return buf;}uint64_t get_be64(ByteIOContext *s){    uint64_t val;    val = (uint64_t)get_be32(s) << 32;    val |= (uint64_t)get_be32(s);    return val;}/* link with avio functions */#ifdef CONFIG_ENCODERSstatic void url_write_packet(void *opaque, uint8_t *buf, int buf_size){    URLContext *h = opaque;    url_write(h, buf, buf_size);}#else#define	url_write_packet NULL#endif //CONFIG_ENCODERSstatic int url_read_packet(void *opaque, uint8_t *buf, int buf_size){    URLContext *h = opaque;    return url_read(h, buf, buf_size);}static int url_seek_packet(void *opaque, int64_t offset, int whence){    URLContext *h = opaque;    url_seek(h, offset, whence);    return 0;}int url_fdopen(ByteIOContext *s, URLContext *h){    uint8_t *buffer;    int buffer_size, max_packet_size;        max_packet_size = url_get_max_packet_size(h);    if (max_packet_size) {        buffer_size = max_packet_size; /* no need to bufferize more than one packet */    } else {        buffer_size = IO_BUFFER_SIZE;    }    buffer = av_malloc(buffer_size);    if (!buffer)        return -ENOMEM;    if (init_put_byte(s, buffer, buffer_size,                       (h->flags & URL_WRONLY || h->flags & URL_RDWR), h,                      url_read_packet, url_write_packet, url_seek_packet) < 0) {        av_free(buffer);        return AVERROR_IO;    }    s->is_streamed = h->is_streamed;    s->max_packet_size = max_packet_size;    return 0;}/* XXX: must be called before any I/O */int url_setbufsize(ByteIOContext *s, int buf_size){    uint8_t *buffer;    buffer = av_malloc(buf_size);    if (!buffer)        return -ENOMEM;    av_free(s->buffer);    s->buffer = buffer;    s->buffer_size = buf_size;    s->buf_ptr = buffer;    if (!s->write_flag)         s->buf_end = buffer;    else        s->buf_end = buffer + buf_size;    return 0;}/* NOTE: when opened as read/write, the buffers are only used for   reading */int url_fopen(ByteIOContext *s, const char *filename, int flags){    URLContext *h;    int err;    err = url_open(&h, filename, flags);    if (err < 0)        return err;    err = url_fdopen(s, h);    if (err < 0) {        url_close(h);        return err;    }    return 0;}int url_fclose(ByteIOContext *s){    URLContext *h = s->opaque;        av_free(s->buffer);    memset(s, 0, sizeof(ByteIOContext));    return url_close(h);}URLContext *url_fileno(ByteIOContext *s){    return s->opaque;}#ifdef CONFIG_ENCODERS/* XXX: currently size is limited */int url_fprintf(ByteIOContext *s, const char *fmt, ...){    va_list ap;    char buf[4096];    int ret;    va_start(ap, fmt);    ret = vsnprintf(buf, sizeof(buf), fmt, ap);    va_end(ap);    put_buffer(s, buf, strlen(buf));    return ret;}#endif //CONFIG_ENCODERS/* note: unlike fgets, the EOL character is not returned and a whole   line is parsed. return NULL if first char read was EOF */char *url_fgets(ByteIOContext *s, char *buf, int buf_size){    int c;    char *q;    c = url_fgetc(s);    if (c == EOF)        return NULL;    q = buf;    for(;;) {        if (c == EOF || c == '\n')            break;        if ((q - buf) < buf_size - 1)            *q++ = c;        c = url_fgetc(s);    }    if (buf_size > 0)        *q = '\0';    return buf;}/*  * Return the maximum packet size associated to packetized buffered file * handle. If the file is not packetized (stream like http or file on * disk), then 0 is returned. *  * @param h buffered file handle * @return maximum packet size in bytes */int url_fget_max_packet_size(ByteIOContext *s){    return s->max_packet_size;}#ifdef CONFIG_ENCODERS/* buffer handling */int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags){    return init_put_byte(s, buf, buf_size,                          (flags & URL_WRONLY || flags & URL_RDWR),                         NULL, NULL, NULL, NULL);}/* return the written or read size */int url_close_buf(ByteIOContext *s){    put_flush_packet(s);    return s->buf_ptr - s->buffer;}/* output in a dynamic buffer */typedef struct DynBuffer {    int pos, size, allocated_size;    uint8_t *buffer;    int io_buffer_size;    uint8_t io_buffer[1];} DynBuffer;static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size){    DynBuffer *d = opaque;    int new_size, new_allocated_size;        /* reallocate buffer if needed */    new_size = d->pos + buf_size;    new_allocated_size = d->allocated_size;    while (new_size > new_allocated_size) {        if (!new_allocated_size)            new_allocated_size = new_size;        else            new_allocated_size = (new_allocated_size * 3) / 2 + 1;        }        if (new_allocated_size > d->allocated_size) {        d->buffer = av_realloc(d->buffer, new_allocated_size);        if(d->buffer == NULL)             return ;        d->allocated_size = new_allocated_size;    }    memcpy(d->buffer + d->pos, buf, buf_size);    d->pos = new_size;    if (d->pos > d->size)        d->size = d->pos;}static void dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size){    unsigned char buf1[4];    /* packetized write: output the header */    buf1[0] = (buf_size >> 24);    buf1[1] = (buf_size >> 16);    buf1[2] = (buf_size >> 8);    buf1[3] = (buf_size);    dyn_buf_write(opaque, buf1, 4);    /* then the data */    dyn_buf_write(opaque, buf, buf_size);}static int dyn_buf_seek(void *opaque, offset_t offset, int whence){    DynBuffer *d = opaque;    if (whence == SEEK_CUR)        offset += d->pos;    else if (whence == SEEK_END)        offset += d->size;    if (offset < 0 || offset > 0x7fffffffLL)        return -1;    d->pos = offset;    return 0;}static int url_open_dyn_buf_internal(ByteIOContext *s, int max_packet_size){    DynBuffer *d;    int io_buffer_size, ret;        if (max_packet_size)         io_buffer_size = max_packet_size;    else        io_buffer_size = 1024;            d = av_malloc(sizeof(DynBuffer) + io_buffer_size);    if (!d)        return -1;    d->io_buffer_size = io_buffer_size;    d->buffer = NULL;    d->pos = 0;    d->size = 0;    d->allocated_size = 0;    ret = init_put_byte(s, d->io_buffer, io_buffer_size,                         1, d, NULL,                         max_packet_size ? dyn_packet_buf_write : dyn_buf_write,                         max_packet_size ? NULL : dyn_buf_seek);    if (ret == 0) {        s->max_packet_size = max_packet_size;    }    return ret;}/* * Open a write only memory stream. *  * @param s new IO context * @return zero if no error. */int url_open_dyn_buf(ByteIOContext *s){    return url_open_dyn_buf_internal(s, 0);}/* * Open a write only packetized memory stream with a maximum packet * size of 'max_packet_size'.  The stream is stored in a memory buffer * with a big endian 4 byte header giving the packet size in bytes. *  * @param s new IO context * @param max_packet_size maximum packet size (must be > 0)  * @return zero if no error. */int url_open_dyn_packet_buf(ByteIOContext *s, int max_packet_size){    if (max_packet_size <= 0)        return -1;    return url_open_dyn_buf_internal(s, max_packet_size);}/*  * Return the written size and a pointer to the buffer. The buffer *  must be freed with av_free().  * @param s IO context * @param pointer to a byte buffer * @return the length of the byte buffer */int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer){    DynBuffer *d = s->opaque;    int size;    put_flush_packet(s);    *pbuffer = d->buffer;    size = d->size;    av_free(d);    return size;}#endif //CONFIG_ENCODERS

⌨️ 快捷键说明

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