[FFmpeg-cvslog] lavf/srtenc: ignore invalid timed packets instead of failing.

Clément Bœsch git at videolan.org
Sat Nov 10 23:15:44 CET 2012


ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Thu Oct 25 00:27:10 2012 +0200| [e56b0984103b981ec25fe8a22ef9c4905b9751dd] | committer: Clément Bœsch

lavf/srtenc: ignore invalid timed packets instead of failing.

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.

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

 libavformat/srtenc.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/libavformat/srtenc.c b/libavformat/srtenc.c
index b704920..97b297e 100644
--- a/libavformat/srtenc.c
+++ b/libavformat/srtenc.c
@@ -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;
 }
 



More information about the ffmpeg-cvslog mailing list