1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

avformat/subtitles: support standalone CR (MacOS).

Recent .srt files with CR only were found in the wild.
This commit is contained in:
Clément Bœsch 2013-09-08 18:05:11 +02:00
parent 90fc00a623
commit 378a830e7b
2 changed files with 14 additions and 4 deletions

View File

@ -228,7 +228,7 @@ static inline int is_eol(char c)
void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf) void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf)
{ {
char eol_buf[5]; char eol_buf[5], last_was_cr = 0;
int n = 0, i = 0, nb_eol = 0; int n = 0, i = 0, nb_eol = 0;
av_bprint_clear(buf); av_bprint_clear(buf);
@ -245,12 +245,13 @@ void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf)
/* line break buffering: we don't want to add the trailing \r\n */ /* line break buffering: we don't want to add the trailing \r\n */
if (is_eol(c)) { if (is_eol(c)) {
nb_eol += c == '\n'; nb_eol += c == '\n' || last_was_cr;
if (nb_eol == 2) if (nb_eol == 2)
break; break;
eol_buf[i++] = c; eol_buf[i++] = c;
if (i == sizeof(eol_buf) - 1) if (i == sizeof(eol_buf) - 1)
break; break;
last_was_cr = c == '\r';
continue; continue;
} }

View File

@ -99,11 +99,20 @@ void ff_subtitles_read_chunk(AVIOContext *pb, AVBPrint *buf);
/** /**
* Get the number of characters to increment to jump to the next line, or to * Get the number of characters to increment to jump to the next line, or to
* the end of the string. * the end of the string.
* The function handles the following line breaks schemes: LF (any sane
* system), CRLF (MS), or standalone CR (old MacOS).
*/ */
static av_always_inline int ff_subtitles_next_line(const char *ptr) static av_always_inline int ff_subtitles_next_line(const char *ptr)
{ {
int n = strcspn(ptr, "\n"); int n = strcspn(ptr, "\r\n");
return n + !!*ptr; ptr += n;
if (*ptr == '\r') {
ptr++;
n++;
}
if (*ptr == '\n')
n++;
return n;
} }
#endif /* AVFORMAT_SUBTITLES_H */ #endif /* AVFORMAT_SUBTITLES_H */