|
@@ -28,6 +28,7 @@ |
|
|
* Specs available on the Matroska project page: http://www.matroska.org/. |
|
|
* Specs available on the Matroska project page: http://www.matroska.org/. |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
#include "avformat.h" |
|
|
#include "avformat.h" |
|
|
/* For codec_get_id(). */ |
|
|
/* For codec_get_id(). */ |
|
|
#include "riff.h" |
|
|
#include "riff.h" |
|
@@ -932,6 +933,37 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size, |
|
|
return -1; |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska, |
|
|
|
|
|
AVPacket *pkt) |
|
|
|
|
|
{ |
|
|
|
|
|
char *line, *layer, *ptr = pkt->data, *end = ptr+pkt->size; |
|
|
|
|
|
for (; *ptr!=',' && ptr<end-1; ptr++); |
|
|
|
|
|
if (*ptr == ',') |
|
|
|
|
|
layer = ++ptr; |
|
|
|
|
|
for (; *ptr!=',' && ptr<end-1; ptr++); |
|
|
|
|
|
if (*ptr == ',') { |
|
|
|
|
|
int64_t end_pts = pkt->pts + 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) |
|
|
static void matroska_convert_tags(AVFormatContext *s, EbmlList *list) |
|
|
{ |
|
|
{ |
|
|
MatroskaTag *tags = list->elem; |
|
|
MatroskaTag *tags = list->elem; |
|
@@ -1588,6 +1620,9 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, |
|
|
else |
|
|
else |
|
|
pkt->duration = duration; |
|
|
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); |
|
|
dynarray_add(&matroska->packets, &matroska->num_packets, pkt); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|