[FFmpeg-devel] [PATCH 3/3] avformat: convert some avio_flush() calls to avio_write_marker(AVIO_DATA_MARKER_FLUSH_POINT)
Marton Balint
cus at passwd.hu
Fri Jan 3 20:15:48 EET 2020
Removing 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.
By converting the avio_flush() calls in the middle of write_packet callbacks we
make flushing a possibility not a requirement.
The user can control 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.
Signed-off-by: Marton Balint <cus at 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(-)
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 84d73a36d1..82ce25174b 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;
--
2.16.4
More information about the ffmpeg-devel
mailing list