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