[FFmpeg-devel] [PATCHv2 2/4] avformat/aviobuf: add support for specifying minimum packet size and marking flush points
Marton Balint
cus at passwd.hu
Tue Jun 20 23:42:53 EEST 2017
Signed-off-by: Marton Balint <cus at passwd.hu>
---
doc/APIchanges | 3 +++
libavformat/avio.h | 13 ++++++++++++-
libavformat/aviobuf.c | 7 +++++++
libavformat/url.h | 1 +
libavformat/version.h | 2 +-
5 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 5dca6b3e51..939a4a7d9d 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil: 2015-08-28
API changes, most recent first:
+2017-06-20 - xxxxxxx - lavf 57.75.100 - avio.h
+ Add AVIO_DATA_MARKER_FLUSH_POINT to signal preferred flush points to aviobuf.
+
2017-06-14 - xxxxxxx - lavu 55.66.100 - hwcontext.h
av_hwframe_ctx_create_derived() now takes some AV_HWFRAME_MAP_* combination
as its flags argument (which was previously unused).
diff --git a/libavformat/avio.h b/libavformat/avio.h
index 844a5723d3..f14b003ba5 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -137,7 +137,13 @@ enum AVIODataMarkerType {
* 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,
};
/**
@@ -339,6 +345,11 @@ typedef struct AVIOContext {
* 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;
/**
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index dcb91570d8..7f4e740a33 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -104,6 +104,7 @@ int ffio_init_context(AVIOContext *s,
s->eof_reached = 0;
s->error = 0;
s->seekable = seek ? AVIO_SEEKABLE_NORMAL : 0;
+ s->min_packet_size = 0;
s->max_packet_size = 0;
s->update_checksum = NULL;
s->short_seek_threshold = SHORT_SEEK_THRESHOLD;
@@ -489,6 +490,11 @@ void avio_wb24(AVIOContext *s, unsigned int val)
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
{
+ if (type == AVIO_DATA_MARKER_FLUSH_POINT) {
+ if (s->buf_ptr - s->buffer >= s->min_packet_size)
+ avio_flush(s);
+ return;
+ }
if (!s->write_data_type)
return;
// If ignoring boundary points, just treat it as unknown
@@ -941,6 +947,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
(*s)->seekable = h->is_streamed ? 0 : AVIO_SEEKABLE_NORMAL;
(*s)->max_packet_size = max_packet_size;
+ (*s)->min_packet_size = h->min_packet_size;
if(h->prot) {
(*s)->read_pause = io_read_pause;
(*s)->read_seek = io_read_seek;
diff --git a/libavformat/url.h b/libavformat/url.h
index 910f1e00b3..4750bfff82 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -48,6 +48,7 @@ typedef struct URLContext {
int64_t rw_timeout; /**< maximum time to wait for (network) read/write operation completion, in mcs */
const char *protocol_whitelist;
const char *protocol_blacklist;
+ int min_packet_size; /**< if non zero, the stream is packetized with this min packet size */
} URLContext;
typedef struct URLProtocol {
diff --git a/libavformat/version.h b/libavformat/version.h
index 1fb8ffb2b9..44c16ac75a 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
// Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 57
-#define LIBAVFORMAT_VERSION_MINOR 74
+#define LIBAVFORMAT_VERSION_MINOR 75
#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
--
2.12.3
More information about the ffmpeg-devel
mailing list