| @@ -56,11 +56,21 @@ static int read_ts(const char *s, int64_t *start, int *duration) | |||||
| int64_t end; | int64_t end; | ||||
| int hh1, mm1, ss1, ms1; | int hh1, mm1, ss1, ms1; | ||||
| int hh2, mm2, ss2, ms2; | int hh2, mm2, ss2, ms2; | ||||
| int multiplier = 1; | |||||
| if (sscanf(s, "%u:%u:%u.%2u,%u:%u:%u.%2u", | |||||
| &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) { | |||||
| multiplier = 10; | |||||
| } else if (sscanf(s, "%u:%u:%u.%1u,%u:%u:%u.%1u", | |||||
| &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) { | |||||
| multiplier = 100; | |||||
| } | |||||
| if (sscanf(s, "%u:%u:%u.%u,%u:%u:%u.%u", | if (sscanf(s, "%u:%u:%u.%u,%u:%u:%u.%u", | ||||
| &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) { | &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) { | ||||
| end = (hh2*3600LL + mm2*60LL + ss2) * 100LL + ms2; | |||||
| *start = (hh1*3600LL + mm1*60LL + ss1) * 100LL + ms1; | |||||
| ms1 = FFMIN(ms1, 999); | |||||
| ms2 = FFMIN(ms2, 999); | |||||
| end = (hh2*3600LL + mm2*60LL + ss2) * 1000LL + ms2 * multiplier; | |||||
| *start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL + ms1 * multiplier; | |||||
| *duration = end - *start; | *duration = end - *start; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -84,7 +94,7 @@ static int subviewer_read_header(AVFormatContext *s) | |||||
| return res; | return res; | ||||
| if (avio_rb24(s->pb) != 0xefbbbf) | if (avio_rb24(s->pb) != 0xefbbbf) | ||||
| avio_seek(s->pb, -3, SEEK_CUR); | avio_seek(s->pb, -3, SEEK_CUR); | ||||
| avpriv_set_pts_info(st, 64, 1, 100); | |||||
| avpriv_set_pts_info(st, 64, 1, 1000); | |||||
| st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE; | st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE; | ||||
| st->codecpar->codec_id = AV_CODEC_ID_SUBVIEWER; | st->codecpar->codec_id = AV_CODEC_ID_SUBVIEWER; | ||||