[FFmpeg-cvslog] avformat/lrcenc: Avoid allocations for writing packet data
Andreas Rheinhardt
git at videolan.org
Thu Oct 7 13:06:06 EEST 2021
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Fri Oct 1 22:11:17 2021 +0200| [e110076d8c1611a1b1c20edf1d0e8dea8be7ea15] | committer: Andreas Rheinhardt
avformat/lrcenc: Avoid allocations for writing packet data
Reviewed-by: Paul B Mahol <onemda at gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e110076d8c1611a1b1c20edf1d0e8dea8be7ea15
---
libavformat/lrcenc.c | 44 ++++++++++++++++++--------------------------
1 file 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;
}
More information about the ffmpeg-cvslog
mailing list