* Trailer data, which doesn't contain actual content, but only for
* finalizing the output file.
*/
- AVIO_DATA_MARKER_TRAILER
+ AVIO_DATA_MARKER_TRAILER,
+ /**
+ * A point in the output bytestream where the underlying AVIOContext might
+ * flush the buffer depending on latency or buffering requirements. Typically
+ * means the end of a packet.
+ */
+ AVIO_DATA_MARKER_FLUSH_POINT,
};
/**
const AVClass *av_class;
/*
- * The following shows the relationship between buffer, buf_ptr, buf_end, buf_size,
- * and pos, when reading and when writing (since AVIOContext is used for both):
+ * The following shows the relationship between buffer, buf_ptr,
+ * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing
+ * (since AVIOContext is used for both):
*
**********************************************************************************
* READING
* WRITING
**********************************************************************************
*
- * | buffer_size |
- * |-------------------------------|
- * | |
+ * | buffer_size |
+ * |--------------------------------------|
+ * | |
*
- * buffer buf_ptr buf_end
- * +-------------------+-----------+
- * |/ / / / / / / / / /| |
- * write buffer: | / to be flushed / | |
- * |/ / / / / / / / / /| |
- * +-------------------+-----------+
+ * buf_ptr_max
+ * buffer (buf_ptr) buf_end
+ * +-----------------------+--------------+
+ * |/ / / / / / / / / / / /| |
+ * write buffer: | / / to be flushed / / | |
+ * |/ / / / / / / / / / / /| |
+ * +-----------------------+--------------+
+ * buf_ptr can be in this
+ * due to a backward seek
*
- * pos
- * +--------------------------+-----------------------------------+
- * output file: | | |
- * +--------------------------+-----------------------------------+
+ * pos
+ * +-------------+----------------------------------------------+
+ * output file: | | |
+ * +-------------+----------------------------------------------+
*
*/
unsigned char *buffer; /**< Start of the buffer. */
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
int64_t (*seek)(void *opaque, int64_t offset, int whence);
int64_t pos; /**< position in the file of the current buffer */
- int must_flush; /**< true if the next seek should flush */
+ int must_flush; /**< unused */
int eof_reached; /**< true if eof reached */
int write_flag; /**< true if open for writing */
int max_packet_size;
int (*short_seek_get)(void *opaque);
int64_t written;
+
+ /**
+ * Maximum reached position before a backward seek in the write buffer,
+ * used keeping track of already written data for a later flush.
+ */
+ unsigned char *buf_ptr_max;
+
+ /**
+ * Try to buffer at least this amount of data before flushing it
+ */
+ int min_packet_size;
} AVIOContext;
/**
/**
* Allocate and initialize an AVIOContext for buffered I/O. It must be later
- * freed with av_free().
+ * freed with avio_context_free().
*
* @param buffer Memory block for input/output operations via AVIOContext.
* The buffer must be allocated with av_malloc() and friends.
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence));
+/**
+ * Free the supplied IO context and everything associated with it.
+ *
+ * @param s Double pointer to the IO context. This function will write NULL
+ * into s.
+ */
+void avio_context_free(AVIOContext **s);
+
void avio_w8(AVIOContext *s, int b);
void avio_write(AVIOContext *s, const unsigned char *buf, int size);
void avio_wl64(AVIOContext *s, uint64_t val);
*/
int avio_read(AVIOContext *s, unsigned char *buf, int size);
+/**
+ * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed
+ * to read fewer bytes than requested. The missing bytes can be read in the next
+ * call. This always tries to read at least 1 byte.
+ * Useful to reduce latency in certain cases.
+ * @return number of bytes read or AVERROR
+ */
+int avio_read_partial(AVIOContext *s, unsigned char *buf, int size);
+
/**
* @name Functions for reading from AVIOContext
* @{