[FFmpeg-cvslog] avformat/subtitles: support standalone CR (MacOS).

Clément Bœsch git at videolan.org
Sun Sep 8 18:56:11 CEST 2013


ffmpeg | branch: master | Clément Bœsch <u at pkh.me> | Sun Sep  8 18:05:11 2013 +0200| [378a830e7b9a5e023c2f7eece6d7260016dfd13b] | committer: Clément Bœsch

avformat/subtitles: support standalone CR (MacOS).

Recent .srt files with CR only were found in the wild.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=378a830e7b9a5e023c2f7eece6d7260016dfd13b
---

 libavformat/subtitles.c |    5 +++--
 libavformat/subtitles.h |   13 +++++++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index d460797..6c9e72b 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -228,7 +228,7 @@ static inline int is_eol(char c)
 
 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;
 
     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 */
         if (is_eol(c)) {
-            nb_eol += c == '\n';
+            nb_eol += c == '\n' || last_was_cr;
             if (nb_eol == 2)
                 break;
             eol_buf[i++] = c;
             if (i == sizeof(eol_buf) - 1)
                 break;
+            last_was_cr = c == '\r';
             continue;
         }
 
diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h
index 96de9fa..eced380 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -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
  * 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)
 {
-    int n = strcspn(ptr, "\n");
-    return n + !!*ptr;
+    int n = strcspn(ptr, "\r\n");
+    ptr += n;
+    if (*ptr == '\r') {
+        ptr++;
+        n++;
+    }
+    if (*ptr == '\n')
+        n++;
+    return n;
 }
 
 #endif /* AVFORMAT_SUBTITLES_H */



More information about the ffmpeg-cvslog mailing list