]> git.sesse.net Git - ffmpeg/commitdiff
lavf/srtenc: ignore invalid timed packets instead of failing.
authorClément Bœsch <ubitux@gmail.com>
Wed, 24 Oct 2012 22:27:10 +0000 (00:27 +0200)
committerClément Bœsch <ubitux@gmail.com>
Sat, 10 Nov 2012 21:43:27 +0000 (22:43 +0100)
This way we don't abort in the middle of remuxing, just warn about an
event ignored. The index increment is moved to make sure the output
numbers still make sense.

libavformat/srtenc.c

index b704920be38855c147fd7f4101992be2432eed91..97b297e4891e3c68895bd99a078de89c7a54253b 100644 (file)
@@ -35,6 +35,8 @@ typedef struct SRTContext{
 
 static int srt_write_header(AVFormatContext *avf)
 {
+    SRTContext *srt = avf->priv_data;
+
     if (avf->nb_streams != 1 ||
         avf->streams[0]->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
         av_log(avf, AV_LOG_ERROR,
@@ -50,6 +52,7 @@ static int srt_write_header(AVFormatContext *avf)
         return AVERROR(EINVAL);
     }
     avpriv_set_pts_info(avf->streams[0], 64, 1, 1000);
+    srt->index = 1;
     return 0;
 }
 
@@ -58,7 +61,6 @@ static int srt_write_packet(AVFormatContext *avf, AVPacket *pkt)
     SRTContext *srt = avf->priv_data;
     int write_ts = avf->streams[0]->codec->codec_id != AV_CODEC_ID_SRT;
 
-    srt->index++;
     if (write_ts) {
         int64_t s = pkt->pts, e, d = pkt->duration;
 
@@ -66,8 +68,9 @@ static int srt_write_packet(AVFormatContext *avf, AVPacket *pkt)
             /* For backward compatibility, fallback to convergence_duration. */
             d = pkt->convergence_duration;
         if (s == AV_NOPTS_VALUE || d < 0) {
-            av_log(avf, AV_LOG_ERROR, "Insufficient timestamps.\n");
-            return AVERROR(EINVAL);
+            av_log(avf, AV_LOG_WARNING,
+                   "Insufficient timestamps in event number %d.\n", srt->index);
+            return 0;
         }
         e = s + d;
         avio_printf(avf->pb, "%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n",
@@ -81,6 +84,7 @@ static int srt_write_packet(AVFormatContext *avf, AVPacket *pkt)
     if (write_ts)
         avio_write(avf->pb, "\n\n", 2);
     avio_flush(avf->pb);
+    srt->index++;
     return 0;
 }