elanhickler

create SM from array of rates v3

Dec 2nd, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. void CreateStretchMarkerRateEnvelope(MediaItem_Take* take, const vector<double>& pos, const vector<double>& rate) {
  2.     double take_rate = GetMediaItemTakeInfo_Value(take, "D_PLAYRATE");
  3.     double take_offset = GetMediaItemTakeInfo_Value(take, "D_STARTOFFS");
  4.     auto item = (MediaItem*)GetSetMediaItemTakeInfo(take, "P_ITEM", nullptr);
  5.     double item_len = GetMediaItemInfo_Value(item, "D_LENGTH");
  6.     int num_sm = GetTakeNumStretchMarkers(take);
  7.  
  8.     // convert input item positions to take positions
  9.     vector<double> tpos; tpos.reserve(pos.size());
  10.     for (auto& p : pos) tpos.push_back(p * take_rate + take_offset);
  11.  
  12.     // prepare for stetch marker calculation
  13.     vector<double> slope, tp;
  14.     slope.reserve(pos.size());
  15.     tp.reserve(pos.size());
  16.     double dpp, disp, p, ro, dss;
  17.     dpp = 0.0;
  18.     disp = 0.0;
  19.     p = 0.0;   
  20.  
  21.     // calculate stretch markers
  22.     for (size_t i = 0; i < tpos.size()-1; ++i) {
  23.         p  += dpp;
  24.         dss = tpos[i+1] - tpos[i];
  25.         ro  = rate[i+1] + rate[i];
  26.         disp += dpp - dss;
  27.         dpp = dss / (ro/2);
  28.  
  29.         slope.push_back(1 - (2 * rate[i]) / ro);
  30.         tp.push_back(p);       
  31.     }
  32.     dpp = dss / rate.back();
  33.     tp.push_back(p + dpp);
  34.     slope.push_back(0);
  35.  
  36.     // add stretch markers
  37.     for (int i = 0; i < pos.size(); ++i) SetTakeStretchMarker(take, -1, tp[i], &tpos[i]);
  38.  
  39.     // modify new stretch markers
  40.     for (size_t i = 0; i < tp.size(); ++i) {
  41.         SetTakeStretchMarker(take, i, tp[i], nullptr);
  42.         SetTakeStretchMarkerSlope(take, i, slope[i]);
  43.     }
  44.  
  45.     // set new item length
  46.     SetMediaItemInfo_Value(item, "D_LENGTH", item_len + (disp + dpp) / take_rate);
  47. }
Advertisement
Add Comment
Please, Sign In to add comment