Browse Source

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>
tags/n4.0
Marton Balint 8 years ago
parent
commit
dcb2ef2211
2 changed files with 72 additions and 0 deletions
  1. +46
    -0
      libavformat/aviobuf.c
  2. +26
    -0
      libavformat/internal.h

+ 46
- 0
libavformat/aviobuf.c View File

@@ -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;


+ 26
- 0
libavformat/internal.h View File

@@ -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…
Cancel
Save