[FFmpeg-cvslog] r9593 - in trunk/libavformat: matroska.c matroskadec.c

aurel subversion
Wed Jul 11 15:37:07 CEST 2007


Author: aurel
Date: Wed Jul 11 15:37:07 2007
New Revision: 9593

Log:
add support for ASS like subtitles in Matroska

Modified:
   trunk/libavformat/matroska.c
   trunk/libavformat/matroskadec.c

Modified: trunk/libavformat/matroska.c
==============================================================================
--- trunk/libavformat/matroska.c	(original)
+++ trunk/libavformat/matroska.c	Wed Jul 11 15:37:07 2007
@@ -61,6 +61,8 @@ CodecTags ff_mkv_codec_tags[]={
 
     {"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}

Modified: trunk/libavformat/matroskadec.c
==============================================================================
--- trunk/libavformat/matroskadec.c	(original)
+++ trunk/libavformat/matroskadec.c	Wed Jul 11 15:37:07 2007
@@ -95,6 +95,7 @@ typedef struct MatroskaAudioTrack {
 typedef struct MatroskaSubtitleTrack {
     MatroskaTrack track;
 
+    int ass;
     //..
 } MatroskaSubtitleTrack;
 
@@ -2145,6 +2146,13 @@ matroska_read_header (AVFormatContext   
                 }
             }
 
+            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_parse_block(MatroskaDemuxContex
                         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;




More information about the ffmpeg-cvslog mailing list