Mercurial > libavformat.hg
diff matroskadec.c @ 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 | a1c952cdac80 |
line wrap: on
line diff
--- 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;