changeset 2245:223a74395827 libavformat

add support for ASS like subtitles in Matroska
author aurel
date Wed, 11 Jul 2007 13:37:07 +0000
parents 93ffcd9d826f
children 6dade35dc9b3
files matroska.c matroskadec.c
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/matroska.c	Wed Jul 11 13:13:20 2007 +0000
+++ b/matroska.c	Wed Jul 11 13:37:07 2007 +0000
@@ -61,6 +61,8 @@
 
     {"S_TEXT/ASCII"     , CODEC_ID_TEXT},
     {"S_TEXT/UTF8"      , CODEC_ID_TEXT},
+    {"S_TEXT/ASS"       , CODEC_ID_TEXT},
+    {"S_TEXT/SSA"       , CODEC_ID_TEXT},
     {"S_VOBSUB"         , CODEC_ID_DVD_SUBTITLE},
 
     {NULL               , CODEC_ID_NONE}
--- a/matroskadec.c	Wed Jul 11 13:13:20 2007 +0000
+++ b/matroskadec.c	Wed Jul 11 13:37:07 2007 +0000
@@ -95,6 +95,7 @@
 typedef struct MatroskaSubtitleTrack {
     MatroskaTrack track;
 
+    int ass;
     //..
 } MatroskaSubtitleTrack;
 
@@ -2145,6 +2146,13 @@
                 }
             }
 
+            else if (codec_id == CODEC_ID_TEXT) {
+                MatroskaSubtitleTrack *subtrack=(MatroskaSubtitleTrack *)track;
+                if (!strcmp(track->codec_id, "S_TEXT/ASS") ||
+                    !strcmp(track->codec_id, "S_TEXT/SSA"))
+                    subtrack->ass = 1;
+            }
+
             if (codec_id == CODEC_ID_NONE) {
                 av_log(matroska->ctx, AV_LOG_INFO,
                        "Unknown/unsupported CodecID %s.\n",
@@ -2430,14 +2438,24 @@
                         matroska_queue_packet(matroska, pkt);
                     }
                 } else {
+                    int offset = 0;
+
+                    if (st->codec->codec_id == CODEC_ID_TEXT
+                        && ((MatroskaSubtitleTrack *)(matroska->tracks[track]))->ass) {
+                        int i;
+                        for (i=0; i<8 && data[slice_offset+offset]; offset++)
+                            if (data[slice_offset+offset] == ',')
+                                i++;
+                    }
+
                     pkt = av_mallocz(sizeof(AVPacket));
                     /* XXX: prevent data copy... */
-                    if (av_new_packet(pkt, slice_size) < 0) {
+                    if (av_new_packet(pkt, slice_size-offset) < 0) {
                         res = AVERROR_NOMEM;
                         n = laces-1;
                         break;
                     }
-                    memcpy (pkt->data, data+slice_offset, slice_size);
+                    memcpy (pkt->data, data+slice_offset+offset, slice_size-offset);
 
                     if (n == 0)
                         pkt->flags = is_keyframe;