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

📄 aviobuf.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (len > size)        len = size;    memcpy(buf, s->buf_ptr, len);    s->buf_ptr += len;    return len;}unsigned int get_le16(ByteIOContext *s){    unsigned int val;    val = get_byte(s);    val |= get_byte(s) << 8;    return val;}unsigned int get_le24(ByteIOContext *s){    unsigned int val;    val = get_le16(s);    val |= get_byte(s) << 16;    return val;}unsigned int get_le32(ByteIOContext *s){    unsigned int val;    val = get_le16(s);    val |= get_le16(s) << 16;    return val;}uint64_t get_le64(ByteIOContext *s){    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_be24(ByteIOContext *s){    unsigned int val;    val = get_be16(s) << 8;    val |= get_byte(s);    return val;}unsigned int get_be32(ByteIOContext *s){    unsigned int val;    val = get_be16(s) << 16;    val |= get_be16(s);    return val;}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;}uint64_t ff_get_v(ByteIOContext *bc){    uint64_t val = 0;    int tmp;    do{        tmp = get_byte(bc);        val= (val<<7) + (tmp&127);    }while(tmp&128);    return val;}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 AVERROR(ENOMEM);    *s = av_mallocz(sizeof(ByteIOContext));    if(!*s) {        av_free(buffer);        return AVERROR(ENOMEM);    }    if (init_put_byte(*s, buffer, buffer_size,                      (h->flags & URL_WRONLY || h->flags & URL_RDWR), h,                      url_read, url_write, url_seek) < 0) {        av_free(buffer);        av_freep(s);        return AVERROR(EIO);    }    (*s)->is_streamed = h->is_streamed;    (*s)->max_packet_size = max_packet_size;    if(h->prot) {        (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause;        (*s)->read_seek  = (offset_t (*)(void *, int, int64_t, int))h->prot->url_read_seek;    }    return 0;}int url_setbufsize(ByteIOContext *s, int buf_size){    uint8_t *buffer;    buffer = av_malloc(buf_size);    if (!buffer)        return AVERROR(ENOMEM);    av_free(s->buffer);    s->buffer = buffer;    s->buffer_size = buf_size;    s->buf_ptr = buffer;    url_resetbuf(s, s->write_flag ? URL_WRONLY : URL_RDONLY);    return 0;}int url_resetbuf(ByteIOContext *s, int flags){    URLContext *h = s->opaque;    if ((flags & URL_RDWR) || (h && h->flags != flags && !h->flags & URL_RDWR))        return AVERROR(EINVAL);    if (flags & URL_WRONLY) {        s->buf_end = s->buffer + s->buffer_size;        s->write_flag = 1;    } else {        s->buf_end = s->buffer;        s->write_flag = 0;    }    return 0;}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);    av_free(s);    return url_close(h);}URLContext *url_fileno(ByteIOContext *s){    return s->opaque;}#ifdef CONFIG_MUXERSint 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_MUXERSchar *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;}int url_fget_max_packet_size(ByteIOContext *s){    return s->max_packet_size;}int av_url_read_fpause(ByteIOContext *s, int pause){    if (!s->read_pause)        return AVERROR(ENOSYS);    return s->read_pause(s->opaque, pause);}offset_t av_url_read_fseek(ByteIOContext *s,        int stream_index, int64_t timestamp, int flags){    URLContext *h = s->opaque;    offset_t ret;    if (!s->read_seek)        return AVERROR(ENOSYS);    ret = s->read_seek(h, stream_index, timestamp, flags);    if(ret >= 0) {        s->buf_ptr = s->buf_end; // Flush buffer        s->pos = s->seek(h, 0, SEEK_CUR);    }    return ret;}/* url_open_dyn_buf and url_close_dyn_buf are used in rtp.c to send a response * back to the server even if CONFIG_MUXERS is not set. */#if defined(CONFIG_MUXERS) || defined(CONFIG_NETWORK)/* buffer handling */int url_open_buf(ByteIOContext **s, uint8_t *buf, int buf_size, int flags){    int ret;    *s = av_mallocz(sizeof(ByteIOContext));    if(!*s)        return AVERROR(ENOMEM);    ret = init_put_byte(*s, buf, buf_size,                        (flags & URL_WRONLY || flags & URL_RDWR),                        NULL, NULL, NULL, NULL);    if(ret != 0)        av_freep(s);    return ret;}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 int 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;    if(new_size < d->pos || new_size > INT_MAX/2)        return -1;    while (new_size > new_allocated_size) {        if (!new_allocated_size)            new_allocated_size = new_size;        else            new_allocated_size += new_allocated_size / 2 + 1;    }    if (new_allocated_size > d->allocated_size) {        d->buffer = av_realloc(d->buffer, new_allocated_size);        if(d->buffer == NULL)             return -1234;        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;    return buf_size;}static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size){    unsigned char buf1[4];    int ret;    /* packetized write: output the header */    buf1[0] = (buf_size >> 24);    buf1[1] = (buf_size >> 16);    buf1[2] = (buf_size >> 8);    buf1[3] = (buf_size);    ret= dyn_buf_write(opaque, buf1, 4);    if(ret < 0)        return ret;    /* then the data */    return dyn_buf_write(opaque, buf, buf_size);}static offset_t 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;    if(sizeof(DynBuffer) + io_buffer_size < io_buffer_size)        return -1;    d = av_malloc(sizeof(DynBuffer) + io_buffer_size);    if (!d)        return -1;    *s = av_mallocz(sizeof(ByteIOContext));    if(!*s) {        av_free(d);        return AVERROR(ENOMEM);    }    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;    } else {        av_free(d);        av_freep(s);    }    return ret;}int url_open_dyn_buf(ByteIOContext **s){    return url_open_dyn_buf_internal(s, 0);}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);}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);    av_free(s);    return size;}#endif /* CONFIG_MUXERS || CONFIG_NETWORK */

⌨️ 快捷键说明

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