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:
parent
90fc00a623
commit
378a830e7b
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user