[FFmpeg-devel,2/4] avformat/aviobuf: add support for specifying minimum packet size and marking flush points

Submitted by Marton Balint on June 18, 2017, 10:02 p.m.

Details

Message ID 20170618220254.21682-2-cus@passwd.hu
State Superseded
Headers show

Commit Message

Marton Balint June 18, 2017, 10:02 p.m.
Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavformat/avio.h    | 13 ++++++++++++-
 libavformat/aviobuf.c |  7 +++++++
 libavformat/url.h     |  1 +
 libavformat/version.h |  2 +-
 4 files changed, 21 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer June 19, 2017, 3:11 p.m.
On Mon, Jun 19, 2017 at 12:02:52AM +0200, Marton Balint wrote:
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  libavformat/avio.h    | 13 ++++++++++++-
>  libavformat/aviobuf.c |  7 +++++++
>  libavformat/url.h     |  1 +
>  libavformat/version.h |  2 +-
>  4 files changed, 21 insertions(+), 2 deletions(-)
> 
> 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,
>  };

needs APIChanges entry i think


[...]
> diff --git a/libavformat/url.h b/libavformat/url.h
> index 910f1e00b3..df90333059 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -42,6 +42,7 @@ typedef struct URLContext {
>      char *filename;             /**< specified URL */
>      int flags;
>      int max_packet_size;        /**< if non zero, the stream is packetized with this max packet size */
> +    int min_packet_size;        /**< if non zero, the stream is packetized with this min packet size */
>      int is_streamed;            /**< true if streamed (no seek possible), default = false */
>      int is_connected;
>      AVIOInterruptCB interrupt_callback;

i was hesitating for a moment when i saw this. Is the location, that is
in the middle instead of the end of the struct intended ?
is nothig outside libavformat using url.h ?
(i was thinking libavdevice but it seems not directly include it)

patch LGTM otherwise

thx

[...]
Marton Balint June 19, 2017, 8:50 p.m.
On Mon, 19 Jun 2017, Michael Niedermayer wrote:

> On Mon, Jun 19, 2017 at 12:02:52AM +0200, Marton Balint wrote:
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>>  libavformat/avio.h    | 13 ++++++++++++-
>>  libavformat/aviobuf.c |  7 +++++++
>>  libavformat/url.h     |  1 +
>>  libavformat/version.h |  2 +-
>>  4 files changed, 21 insertions(+), 2 deletions(-)
>>
>> 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,
>>  };
>
> needs APIChanges entry i think
>

ok.

>
> [...]
>> diff --git a/libavformat/url.h b/libavformat/url.h
>> index 910f1e00b3..df90333059 100644
>> --- a/libavformat/url.h
>> +++ b/libavformat/url.h
>> @@ -42,6 +42,7 @@ typedef struct URLContext {
>>      char *filename;             /**< specified URL */
>>      int flags;
>>      int max_packet_size;        /**< if non zero, the stream is packetized with this max packet size */
>> +    int min_packet_size;        /**< if non zero, the stream is packetized with this min packet size */
>>      int is_streamed;            /**< true if streamed (no seek possible), default = false */
>>      int is_connected;
>>      AVIOInterruptCB interrupt_callback;
>
> i was hesitating for a moment when i saw this. Is the location, that is
> in the middle instead of the end of the struct intended ?
> is nothig outside libavformat using url.h ?
> (i was thinking libavdevice but it seems not directly include it)
>

I just assumed that since it is not AV-prefixed, it is a private context, 
therefore it doesn't matter where to put it.

Regards,
Marton

Patch hide | download patch | download mbox

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..df90333059 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -42,6 +42,7 @@  typedef struct URLContext {
     char *filename;             /**< specified URL */
     int flags;
     int max_packet_size;        /**< if non zero, the stream is packetized with this max packet size */
+    int min_packet_size;        /**< if non zero, the stream is packetized with this min packet size */
     int is_streamed;            /**< true if streamed (no seek possible), default = false */
     int is_connected;
     AVIOInterruptCB interrupt_callback;
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, \