diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-10-01 22:11:17 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-10-07 11:54:28 +0200 |
commit | e110076d8c1611a1b1c20edf1d0e8dea8be7ea15 (patch) | |
tree | 353afe54fcf6b6880eacd8834375807a3b5caeef /libavformat/lrcenc.c | |
parent | 1307089523e68fb0048f2d38c3789953b87595ca (diff) | |
download | ffmpeg-e110076d8c1611a1b1c20edf1d0e8dea8be7ea15.tar.gz |
avformat/lrcenc: Avoid allocations for writing packet data
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavformat/lrcenc.c')
-rw-r--r-- | libavformat/lrcenc.c | 44 |
1 files changed, 18 insertions, 26 deletions
diff --git a/libavformat/lrcenc.c b/libavformat/lrcenc.c index c9f98a9173..78d9c6d362 100644 --- a/libavformat/lrcenc.c +++ b/libavformat/lrcenc.c @@ -84,33 +84,25 @@ static int lrc_write_header(AVFormatContext *s) static int lrc_write_packet(AVFormatContext *s, AVPacket *pkt) { if(pkt->pts != AV_NOPTS_VALUE) { - char *data = av_malloc(pkt->size + 1); - char *line; - char *delim; + const uint8_t *line = pkt->data; + const uint8_t *end = pkt->data + pkt->size; - if(!data) { - return AVERROR(ENOMEM); - } - memcpy(data, pkt->data, pkt->size); - data[pkt->size] = '\0'; - - for(delim = data + pkt->size - 1; - delim >= data && (delim[0] == '\n' || delim[0] == '\r'); delim--) { - delim[0] = '\0'; // Strip last empty lines - } - line = data; - while(line[0] == '\n' || line[0] == '\r') { - line++; // Skip first empty lines + while (end > line && (end[-1] == '\n' || end[-1] == '\r')) + end--; + if (line != end) { + while (line[0] == '\n' || line[0] == '\r') + line++; // Skip first empty lines } while(line) { - delim = strchr(line, '\n'); - if(delim) { - if(delim > line && delim[-1] == '\r') { - delim[-1] = '\0'; - } - delim[0] = '\0'; - delim++; + const uint8_t *next_line = memchr(line, '\n', end - line); + size_t size = end - line; + + if (next_line) { + size = next_line - line; + if (next_line > line && next_line[-1] == '\r') + size--; + next_line++; } if(line[0] == '[') { av_log(s, AV_LOG_WARNING, @@ -130,10 +122,10 @@ static int lrc_write_packet(AVFormatContext *s, AVPacket *pkt) ((-pkt->pts) / 100) % 60, (-pkt->pts) % 100); } - avio_printf(s->pb, "%s\n", line); - line = delim; + avio_write(s->pb, line, size); + avio_w8(s->pb, '\n'); + line = next_line; } - av_free(data); } return 0; } |