mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 01:02:33 +00:00
avformat/aviobuf: add ff_read_line_to_bprint and ff_read_line_to_bprint_overwrite functions
To be able to read lines longer than a static buffer size. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
5f36c546ec
commit
dcb2ef2211
@ -823,6 +823,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);
|
||||
|
||||
if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
|
||||
avio_skip(s, -1);
|
||||
|
||||
if (!c && s->error)
|
||||
return s->error;
|
||||
|
||||
if (!c && !read && avio_feof(s))
|
||||
return AVERROR_EOF;
|
||||
|
||||
return read;
|
||||
}
|
||||
|
||||
int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp)
|
||||
{
|
||||
int64_t ret;
|
||||
|
||||
av_bprint_clear(bp);
|
||||
ret = ff_read_line_to_bprint(s, bp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!av_bprint_is_complete(bp))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
return bp->len;
|
||||
}
|
||||
|
||||
int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
|
||||
{
|
||||
int i;
|
||||
|
@ -299,6 +299,32 @@ void ff_put_v(AVIOContext *bc, uint64_t val);
|
||||
*/
|
||||
int ff_get_line(AVIOContext *s, char *buf, int maxlen);
|
||||
|
||||
/**
|
||||
* Read a whole line of text from AVIOContext to an AVBPrint buffer. Stop
|
||||
* reading after reaching a \\r, a \\n, a \\r\\n, a \\0 or EOF. The line
|
||||
* ending characters are NOT included in the buffer, but they are skipped on
|
||||
* the input.
|
||||
*
|
||||
* @param s the read-only AVIOContext
|
||||
* @param bp the AVBPrint buffer
|
||||
* @return the length of the read line, not including the line endings,
|
||||
* negative on error.
|
||||
*/
|
||||
int64_t ff_read_line_to_bprint(AVIOContext *s, AVBPrint *bp);
|
||||
|
||||
/**
|
||||
* Read a whole line of text from AVIOContext to an AVBPrint buffer overwriting
|
||||
* its contents. Stop reading after reaching a \\r, a \\n, a \\r\\n, a \\0 or
|
||||
* EOF. The line ending characters are NOT included in the buffer, but they
|
||||
* are skipped on the input.
|
||||
*
|
||||
* @param s the read-only AVIOContext
|
||||
* @param bp the AVBPrint buffer
|
||||
* @return the length of the read line not including the line endings,
|
||||
* negative on error, or if the buffer becomes truncated.
|
||||
*/
|
||||
int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp);
|
||||
|
||||
#define SPACE_CHARS " \t\r\n"
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user