mirror of
https://github.com/odrling/Aegisub
synced 2025-04-11 22:56:02 +02:00
fix mks file parsing
This commit is contained in:
parent
a9aa77b673
commit
9e6e70151f
@ -1086,29 +1086,43 @@ static void parseSegmentInfo(MatroskaFile *mf,uint64_t toplen) {
|
|||||||
mf->Seg.Duration = mul3(duration,mf->Seg.TimecodeScale);
|
mf->Seg.Duration = mul3(duration,mf->Seg.TimecodeScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int getVideoTrackIndex(MatroskaFile *mf) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < mf->nTracks; ++i) {
|
||||||
|
if (mf->Tracks[i]->Type == TT_VIDEO) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static void parseFirstCluster(MatroskaFile *mf,uint64_t toplen) {
|
static void parseFirstCluster(MatroskaFile *mf,uint64_t toplen) {
|
||||||
uint64_t end = filepos(mf) + toplen;
|
uint64_t end = filepos(mf) + toplen;
|
||||||
|
uint64_t clusterTimecode;
|
||||||
int tracknum = -1;
|
int tracknum = -1;
|
||||||
int i = 0;
|
int videoTrack = getVideoTrackIndex(mf);
|
||||||
|
|
||||||
|
// only read the first cluster when there is no video track
|
||||||
|
if (videoTrack == -1)
|
||||||
|
mf->seen.Cluster = 1;
|
||||||
|
|
||||||
mf->firstTimecode = 0;
|
mf->firstTimecode = 0;
|
||||||
|
|
||||||
FOREACH(mf,toplen)
|
FOREACH(mf,toplen)
|
||||||
case 0xe7: // Timecode
|
case 0xe7: // Timecode
|
||||||
mf->firstTimecode += readUInt(mf,(unsigned)len);
|
clusterTimecode = readUInt(mf,(unsigned)len);
|
||||||
break;
|
break;
|
||||||
case 0xa3: // BlockEx
|
case 0xa3: // BlockEx
|
||||||
start = filepos(mf);
|
start = filepos(mf);
|
||||||
tracknum = readVLUInt(mf); // track number
|
tracknum = readVLUInt(mf); // track number
|
||||||
|
|
||||||
for (i = 0; i < mf->nTracks; ++i) {
|
if (videoTrack != -1 &&
|
||||||
if (mf->Tracks[i]->Number == tracknum && mf->Tracks[i]->Type == TT_VIDEO) {
|
mf->Tracks[videoTrack]->Number == tracknum && mf->Tracks[videoTrack]->Type == TT_VIDEO) {
|
||||||
mf->firstTimecode += readSInt(mf, 2);
|
mf->firstTimecode = clusterTimecode + readSInt(mf, 2);
|
||||||
mf->seen.Cluster = 1;
|
|
||||||
skipbytes(mf,end - filepos(mf));
|
skipbytes(mf,end - filepos(mf));
|
||||||
|
mf->seen.Cluster = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
skipbytes(mf, len - (filepos(mf) - start));
|
skipbytes(mf, len - (filepos(mf) - start));
|
||||||
break;
|
break;
|
||||||
@ -1118,14 +1132,13 @@ static void parseFirstCluster(MatroskaFile *mf,uint64_t toplen) {
|
|||||||
start = filepos(mf);
|
start = filepos(mf);
|
||||||
tracknum = readVLUInt(mf); // track number
|
tracknum = readVLUInt(mf); // track number
|
||||||
|
|
||||||
for (i = 0; i < mf->nTracks; ++i) {
|
if (videoTrack != -1 &&
|
||||||
if (mf->Tracks[i]->Number == tracknum && mf->Tracks[i]->Type == TT_VIDEO) {
|
mf->Tracks[videoTrack]->Number == tracknum && mf->Tracks[videoTrack]->Type == TT_VIDEO) {
|
||||||
mf->firstTimecode += readSInt(mf, 2);
|
mf->firstTimecode = clusterTimecode + readSInt(mf, 2);
|
||||||
mf->seen.Cluster = 1;
|
|
||||||
skipbytes(mf,end - filepos(mf));
|
skipbytes(mf,end - filepos(mf));
|
||||||
|
mf->seen.Cluster = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
skipbytes(mf, len - (filepos(mf) - start));
|
skipbytes(mf, len - (filepos(mf) - start));
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user