# HG changeset patch # User aurel # Date 1184161027 0 # Node ID 223a74395827d070f1ed348bd2ab3c4b769abc91 # Parent 93ffcd9d826f5189798049e0e4a22afc828238ff add support for ASS like subtitles in Matroska diff -r 93ffcd9d826f -r 223a74395827 matroska.c --- 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} diff -r 93ffcd9d826f -r 223a74395827 matroskadec.c --- 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;