diff mbox series

[FFmpeg-devel,6/6] avformat: convert some avio_flush() calls to avio_write_marker(AVIO_DATA_MARKER_FLUSH_POINT)

Message ID 20200105131413.22707-6-cus@passwd.hu
State New
Headers show
Series [FFmpeg-devel,1/6] avformat: remove unneded avio_flush() calls before calling avio_close_dyn_buf()
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Marton Balint Jan. 5, 2020, 1:14 p.m. UTC
Converting explicit avio_flush() calls helps us to buffer more data and avoid
flushing the IO context too often which causes reduced IO throughput for
non-streamed file output.

The user can control FLUSH_POINT flushing behaviour using the -flush_packets
option, the default typically means to flush unless a non-streamed file output
is used, so this change should have no adverse effect on streaming even if it
is assumed that after an avio_flush() the output buffer is clean so small
seekbacks within the output buffer will work even when the IO context is not
seekable.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 libavformat/asfenc.c      | 3 ++-
 libavformat/matroskaenc.c | 2 +-
 libavformat/movenc.c      | 8 ++++----
 libavformat/mpegenc.c     | 4 ++--
 libavformat/mxfenc.c      | 2 +-
 libavformat/oggenc.c      | 2 +-
 6 files changed, 11 insertions(+), 10 deletions(-)

Comments

Martin Storsjö Jan. 5, 2020, 8:38 p.m. UTC | #1
On Sun, 5 Jan 2020, Marton Balint wrote:

> Converting explicit avio_flush() calls helps us to buffer more data and avoid
> flushing the IO context too often which causes reduced IO throughput for
> non-streamed file output.
>
> The user can control FLUSH_POINT flushing behaviour using the -flush_packets
> option, the default typically means to flush unless a non-streamed file output
> is used, so this change should have no adverse effect on streaming even if it
> is assumed that after an avio_flush() the output buffer is clean so small
> seekbacks within the output buffer will work even when the IO context is not
> seekable.
>
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
> libavformat/asfenc.c      | 3 ++-
> libavformat/matroskaenc.c | 2 +-
> libavformat/movenc.c      | 8 ++++----
> libavformat/mpegenc.c     | 4 ++--
> libavformat/mxfenc.c      | 2 +-
> libavformat/oggenc.c      | 2 +-
> 6 files changed, 11 insertions(+), 10 deletions(-)

Possibly ok

// Martin
diff mbox series

Patch

diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c
index 8eaa9d40ce..73afb13200 100644
--- a/libavformat/asfenc.c
+++ b/libavformat/asfenc.c
@@ -892,7 +892,8 @@  static void flush_packet(AVFormatContext *s)
 
     avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
 
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
+
     asf->nb_packets++;
     asf->packet_nb_payloads     = 0;
     asf->packet_timestamp_start = -1;
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 4b6d14b435..71c9afb15c 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2235,7 +2235,7 @@  static void mkv_end_cluster(AVFormatContext *s)
 
     end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv);
     mkv->cluster_pos = -1;
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 }
 
 static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e20eea7571..1d9497283f 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5152,7 +5152,7 @@  static int mov_flush_fragment(AVFormatContext *s, int force)
         if (mov->flags & FF_MOV_FLAG_DELAY_MOOV) {
             if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)
                 mov->reserved_header_pos = avio_tell(s->pb);
-            avio_flush(s->pb);
+            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
             mov->moov_written = 1;
             return 0;
         }
@@ -5176,7 +5176,7 @@  static int mov_flush_fragment(AVFormatContext *s, int force)
             mov->tracks[i].entry = 0;
             mov->tracks[i].end_reliable = 0;
         }
-        avio_flush(s->pb);
+        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
         return 0;
     }
 
@@ -5241,7 +5241,7 @@  static int mov_flush_fragment(AVFormatContext *s, int force)
         }
 
         if (write_moof) {
-            avio_flush(s->pb);
+            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
             mov_write_moof_tag(s->pb, mov, moof_tracks, mdat_size);
             mov->fragments++;
@@ -5273,7 +5273,7 @@  static int mov_flush_fragment(AVFormatContext *s, int force)
 
     mov->mdat_size = 0;
 
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
     return 0;
 }
 
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index f8039a42c0..669ff9d152 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -928,7 +928,7 @@  static int flush_packet(AVFormatContext *ctx, int stream_index,
     for (i = 0; i < zero_trail_bytes; i++)
         avio_w8(ctx->pb, 0x00);
 
-    avio_flush(ctx->pb);
+    avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     s->packet_number++;
 
@@ -957,7 +957,7 @@  static void put_vcd_padding_sector(AVFormatContext *ctx)
 
     s->vcd_padding_bytes_written += s->packet_size;
 
-    avio_flush(ctx->pb);
+    avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     /* increasing the packet number is correct. The SCR of the following packs
      * is calculated from the packet_number and it has to include the padding
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 396768d51f..374a83d069 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1936,7 +1936,7 @@  static int mxf_write_partition(AVFormatContext *s, int bodysid,
     }
 
     if(key)
-        avio_flush(pb);
+        avio_write_marker(pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     return 0;
 }
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index 04f7813083..fe89f23e36 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -139,7 +139,7 @@  static int ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags)
         return size;
 
     avio_write(s->pb, buf, size);
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
     av_free(buf);
     oggstream->page_count--;
     return 0;