libavformat/file: apply pkt_size option to read mode

Previously, the pkt_size option only affected write buffering in the file
protocol. This change extends its effect to read mode as well.

On embedded systems with limited RAM, users can now reduce I/O buffer
memory by setting a smaller pkt_size.

Signed-off-by: caifan3 <caifan3@xiaomi.com>
This commit is contained in:
caifan3
2025-12-22 14:32:00 +08:00
committed by Marton Balint
parent 7dda7f3b99
commit 82144fea48
2 changed files with 16 additions and 3 deletions

View File

@@ -352,6 +352,15 @@ means auto (seekable for normal files, non-seekable for named pipes).
Many demuxers handle seekable and non-seekable resources differently,
overriding this might speed up opening certain files at the cost of losing some
features (e.g. accurate seeking).
@item pkt_size
Set the maximum packet size used for file I/O.
For writing, this sets the size of each write operation. The default is
262144 bytes.
For reading, if explicitly set, it overrides the default internal buffer size
(32768 bytes) and limits the maximum amount of data read per operation.
Setting a smaller value may reduce memory usage when reading files sequentially.
@end table
@section ftp

View File

@@ -107,7 +107,7 @@ static const AVOption file_options[] = {
{ "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
{ "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
{ "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ "pkt_size", "Maximum packet size", offsetof(FileContext, pkt_size), AV_OPT_TYPE_INT, { .i64 = 262144 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ "pkt_size", "Maximum packet size", offsetof(FileContext, pkt_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ NULL }
};
@@ -314,8 +314,12 @@ static int file_open(URLContext *h, const char *filename, int flags)
/* Buffer writes more than the default 32k to improve throughput especially
* with networked file systems */
if (!h->is_streamed && flags & AVIO_FLAG_WRITE)
h->min_packet_size = h->max_packet_size = c->pkt_size;
if (!h->is_streamed) {
if (flags & AVIO_FLAG_WRITE)
h->min_packet_size = h->max_packet_size = c->pkt_size ? c->pkt_size : 262144;
else if (flags & AVIO_FLAG_READ && c->pkt_size)
h->max_packet_size = c->pkt_size;
}
if (c->seekable >= 0)
h->is_streamed = !c->seekable;