void MatroskaImport::ImportCluster(KaxCluster &cluster, bool addToTrack) { KaxSegment & segment = *static_cast<KaxSegment *>(el_l0); KaxClusterTimecode & clusterTime = GetChild<KaxClusterTimecode>(cluster); CXXAutoreleasePool pool; cluster.SetParent(segment); cluster.InitTimecode(uint64(clusterTime), timecodeScale); for (int i = 0; i < cluster.ListSize(); i++) { const EbmlId & elementID = EbmlId(*cluster[i]); KaxInternalBlock *block = NULL; uint32_t duration = 0; // set to track's default duration in AddBlock if 0 short flags = 0; if (elementID == KaxBlockGroup::ClassInfos.GlobalId) { KaxBlockGroup & blockGroup = *static_cast<KaxBlockGroup *>(cluster[i]); KaxBlockDuration & blkDuration = GetChild<KaxBlockDuration>(blockGroup); block = &GetChild<KaxBlock>(blockGroup); if (blkDuration.ValueIsSet()) duration = uint32(blkDuration); flags = blockGroup.ReferenceCount() > 0 ? mediaSampleNotSync : 0; } else if (elementID == KaxSimpleBlock::ClassInfos.GlobalId) { KaxSimpleBlock & simpleBlock = *static_cast<KaxSimpleBlock *>(cluster[i]); block = &simpleBlock; if (!simpleBlock.IsKeyframe()) flags |= mediaSampleNotSync; if (simpleBlock.IsDiscardable() && IsFrameDroppingEnabled()) flags |= mediaSampleDroppable; } if (block) { block->SetParent(cluster); for (int i = 0; i < tracks.size(); i++) { if (tracks[i].number == block->TrackNum()) { tracks[i].AddBlock(*block, duration, flags); break; } } } } if (addToTrack) { for (int i = 0; i < tracks.size(); i++) tracks[i].AddSamplesToTrack(); loadState = kMovieLoadStatePlayable; } }