[FFmpeg-devel] [PATCH 1/2] avformat/aviobuf: add ff_read_line_to_bprint and ff_read_line_to_bprint_overwrite functions
Marton Balint
cus at passwd.hu
Sun Feb 11 23:38:40 EET 2018
On Sun, 11 Feb 2018, Nicolas George wrote:
> Marton Balint (2018-02-10):
>> To be able to read lines longer than a static buffer size.
>>
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>> libavformat/aviobuf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>> libavformat/internal.h | 26 ++++++++++++++++++++++++++
>> 2 files changed, 72 insertions(+)
>>
>> diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
>> index 86eb6579f4..12cd73745d 100644
>> --- a/libavformat/aviobuf.c
>> +++ b/libavformat/aviobuf.c
>> @@ -821,6 +821,52 @@ int ff_get_line(AVIOContext *s, char *buf, int maxlen)
>> return i;
>> }
>>
>> +int64_t ff_read_line_to_bprint(AVIOContext *s, AVBPrint *bp)
>> +{
>> + int len, end;
>> + int64_t read = 0;
>> + char tmp[1024];
>> + char c;
>> +
>
>> + do {
>> + len = 0;
>> + do {
>> + c = avio_r8(s);
>> + end = (c == '\r' || c == '\n' || c == '\0');
>> + if (!end)
>> + tmp[len++] = c;
>> + } while (!end && len < sizeof(tmp));
>> + av_bprint_append_data(bp, tmp, len);
>> + read += len;
>> + } while (!end);
>
> I think the code would be much simpler if you just call
> av_bprint_chars() for each read character. The loop-within-loop makes
> the logic a little hard to understand.
>
> If speed is critic, then you could read directly into the bprint buffer,
> but I do not think this is necessary.
It is a 500% speed improvement on a 260 MB line compared to using
av_bprint_chars, so I'd rather leave it as is. I can add a comment saying
"for performance reasons we fill a temporary buffer, and use av_bprint
functions on chunks of data".
Regards,
Marton
More information about the ffmpeg-devel
mailing list