Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void CreateStretchMarkerRateEnvelope(MediaItem_Take* take, const vector<double>& pos, const vector<double>& rate) {
- double take_rate = GetMediaItemTakeInfo_Value(take, "D_PLAYRATE");
- double take_offset = GetMediaItemTakeInfo_Value(take, "D_STARTOFFS");
- auto item = (MediaItem*)GetSetMediaItemTakeInfo(take, "P_ITEM", nullptr);
- double item_len = GetMediaItemInfo_Value(item, "D_LENGTH");
- int num_sm = GetTakeNumStretchMarkers(take);
- // convert input item positions to take positions
- vector<double> tpos; tpos.reserve(pos.size());
- for (auto& p : pos) tpos.push_back(p * take_rate + take_offset);
- // prepare for stetch marker calculation
- vector<double> slope, tp;
- slope.reserve(pos.size());
- tp.reserve(pos.size());
- double dpp, disp, p, ro, dss;
- dpp = 0.0;
- disp = 0.0;
- p = 0.0;
- // calculate stretch markers
- for (size_t i = 0; i < tpos.size()-1; ++i) {
- p += dpp;
- dss = tpos[i+1] - tpos[i];
- ro = rate[i+1] + rate[i];
- disp += dpp - dss;
- dpp = dss / (ro/2);
- slope.push_back(1 - (2 * rate[i]) / ro);
- tp.push_back(p);
- }
- dpp = dss / rate.back();
- tp.push_back(p + dpp);
- slope.push_back(0);
- // add stretch markers
- for (int i = 0; i < pos.size(); ++i) SetTakeStretchMarker(take, -1, tp[i], &tpos[i]);
- // modify new stretch markers
- for (size_t i = 0; i < tp.size(); ++i) {
- SetTakeStretchMarker(take, i, tp[i], nullptr);
- SetTakeStretchMarkerSlope(take, i, slope[i]);
- }
- // set new item length
- SetMediaItemInfo_Value(item, "D_LENGTH", item_len + (disp + dpp) / take_rate);
- }
Advertisement
Add Comment
Please, Sign In to add comment