📄 aviobuf.c
字号:
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 + -