# HG changeset patch # User aurel # Date 1220570772 0 # Node ID 30c8c9f53b9d093558cbd63de75fd89966d08b04 # Parent 8e7b2616e1ad712708a18c6a8373975fab297efa matroskadec: fix ASS subtitle track packets before emitting them Matroska does some butchering when storing the ASS lines. The start and end time are removed (because they are duplicated in the container). The matroska_fix_ass_packet() function simply restore those start and end time in ASS lines to ensure our ASS packets comply with the ASS spec. diff -r 8e7b2616e1ad -r 30c8c9f53b9d matroskadec.c --- a/matroskadec.c Thu Sep 04 23:19:53 2008 +0000 +++ b/matroskadec.c Thu Sep 04 23:26:12 2008 +0000 @@ -28,6 +28,7 @@ * Specs available on the Matroska project page: http://www.matroska.org/. */ +#include #include "avformat.h" /* For codec_get_id(). */ #include "riff.h" @@ -932,6 +933,37 @@ return -1; } +static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska, + AVPacket *pkt) +{ + char *line, *layer, *ptr = pkt->data, *end = ptr+pkt->size; + for (; *ptr!=',' && ptrpts + pkt->convergence_duration; + int sc = matroska->time_scale * pkt->pts / 10000000; + int ec = matroska->time_scale * end_pts / 10000000; + int sh, sm, ss, eh, em, es, len; + sh = sc/360000; sc -= 360000*sh; + sm = sc/ 6000; sc -= 6000*sm; + ss = sc/ 100; sc -= 100*ss; + eh = ec/360000; ec -= 360000*eh; + em = ec/ 6000; ec -= 6000*em; + es = ec/ 100; ec -= 100*es; + *ptr++ = '\0'; + len = 50 + end-ptr + FF_INPUT_BUFFER_PADDING_SIZE; + if (!(line = av_malloc(len))) + return; + snprintf(line,len,"Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s", + layer, sh, sm, ss, sc, eh, em, es, ec, ptr); + av_free(pkt->data); + pkt->data = line; + pkt->size = strlen(line); + } +} + static void matroska_convert_tags(AVFormatContext *s, EbmlList *list) { MatroskaTag *tags = list->elem; @@ -1588,6 +1620,9 @@ else pkt->duration = duration; + if (st->codec->codec_id == CODEC_ID_SSA) + matroska_fix_ass_packet(matroska, pkt); + dynarray_add(&matroska->packets, &matroska->num_packets, pkt); }