void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) { if (!Input->IsLoaded() || !Output->IsLoaded()) return; for (auto& curDialogue : subs->Events) { line = &curDialogue; newK = 0; oldK = 0; newStart = trunc_cs(ConvertTime(curDialogue.Start)); newEnd = trunc_cs(ConvertTime(curDialogue.End) + 9); // Process stuff auto blocks = line->ParseTags(); for (auto block : blocks | agi::of_type<AssDialogueBlockOverride>()) block->ProcessParameters(TransformTimeTags, this); curDialogue.Start = newStart; curDialogue.End = newEnd; curDialogue.UpdateText(blocks); } }
void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) { if (!Input->IsLoaded() || !Output->IsLoaded()) return; for (entryIter cur=subs->Line.begin();cur!=subs->Line.end();cur++) { AssDialogue *curDialogue = dynamic_cast<AssDialogue*>(*cur); if (curDialogue) { line = curDialogue; newK = 0; oldK = 0; newStart = trunc_cs(ConvertTime(curDialogue->Start)); newEnd = trunc_cs(ConvertTime(curDialogue->End) + 9); // Process stuff curDialogue->ParseASSTags(); curDialogue->ProcessParameters(TransformTimeTags, this); curDialogue->Start = newStart; curDialogue->End = newEnd; curDialogue->UpdateText(); curDialogue->ClearBlocks(); } } }
void AssTransformFramerateFilter::TransformTimeTags(std::string const& name, AssOverrideParameter *curParam, void *curData) { VariableDataType type = curParam->GetType(); if (type != VariableDataType::INT && type != VariableDataType::FLOAT) return; AssTransformFramerateFilter *instance = static_cast<AssTransformFramerateFilter*>(curData); AssDialogue *curDiag = instance->line; int parVal = curParam->Get<int>(); switch (curParam->classification) { case AssParameterClass::RELATIVE_TIME_START: { int value = instance->ConvertTime(trunc_cs(curDiag->Start) + parVal) - instance->newStart; // An end time of 0 is actually the end time of the line, so ensure // nonzero is never converted to 0 // Needed here rather than the end case because start/end here mean // which end of the line the time is relative to, not whether it's // the start or end time (compare \move and \fad) if (value == 0 && parVal != 0) value = 1; curParam->Set(value); break; } case AssParameterClass::RELATIVE_TIME_END: curParam->Set(instance->newEnd - instance->ConvertTime(trunc_cs(curDiag->End) - parVal)); break; case AssParameterClass::KARAOKE: { int start = curDiag->Start / 10 + instance->oldK + parVal; int value = (instance->ConvertTime(start * 10) - instance->newStart) / 10 - instance->newK; instance->oldK += parVal; instance->newK += value; curParam->Set(value); break; } default: return; } }