Mercurial > libavformat.hg
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;