Guest User

Untitled

a guest
May 21st, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. bool VapourSynthScriptProcessor::recreatePreviewNode(NodePair & a_nodePair)
  2. {
  3. if(!a_nodePair.pOutputNode)
  4. return false;
  5.  
  6. if(!m_cpVSAPI)
  7. return false;
  8.  
  9. if(a_nodePair.pPreviewNode)
  10. {
  11. m_cpVSAPI->freeNode(a_nodePair.pPreviewNode);
  12. a_nodePair.pPreviewNode = nullptr;
  13. }
  14.  
  15. const VSVideoInfo * cpVideoInfo =
  16. m_cpVSAPI->getVideoInfo(a_nodePair.pOutputNode);
  17. if(!cpVideoInfo)
  18. return false;
  19. const VSFormat * cpFormat = cpVideoInfo->format;
  20.  
  21. if(cpFormat->id == pfCompatBGR32)
  22. {
  23. a_nodePair.pPreviewNode =
  24. m_cpVSAPI->cloneNodeRef(a_nodePair.pOutputNode);
  25. return true;
  26. }
  27.  
  28. bool isYUV = ((cpFormat->colorFamily == cmYUV) ||
  29. (cpFormat->id == pfCompatYUY2));
  30. bool canSubsample = (isYUV || (cpFormat->colorFamily == cmYCoCg));
  31.  
  32. VSCore * pCore = m_pVSScriptLibrary->getCore(m_pVSScript);
  33. VSPlugin * pResizePlugin = m_cpVSAPI->getPluginById(
  34. "com.vapoursynth.resize", pCore);
  35. const char * resizeName = "Point";
  36.  
  37. VSMap * pArgumentMap = m_cpVSAPI->createMap();
  38. m_cpVSAPI->propSetNode(pArgumentMap, "clip", a_nodePair.pOutputNode,
  39. paReplace);
  40. m_cpVSAPI->propSetInt(pArgumentMap, "format", pfCompatBGR32, paReplace);
  41.  
  42. if(canSubsample)
  43. {
  44. switch(m_chromaResamplingFilter)
  45. {
  46. case ResamplingFilter::Point:
  47. resizeName = "Point";
  48. break;
  49. case ResamplingFilter::Bilinear:
  50. resizeName = "Bilinear";
  51. break;
  52. case ResamplingFilter::Bicubic:
  53. resizeName = "Bicubic";
  54. m_cpVSAPI->propSetFloat(pArgumentMap, "filter_param_a_uv",
  55. m_resamplingFilterParameterA, paReplace);
  56. m_cpVSAPI->propSetFloat(pArgumentMap, "filter_param_b_uv",
  57. m_resamplingFilterParameterB, paReplace);
  58. break;
  59. case ResamplingFilter::Lanczos:
  60. resizeName = "Lanczos";
  61. m_cpVSAPI->propSetFloat(pArgumentMap, "filter_param_a_uv",
  62. m_resamplingFilterParameterA, paReplace);
  63. break;
  64. case ResamplingFilter::Spline16:
  65. resizeName = "Spline16";
  66. break;
  67. case ResamplingFilter::Spline36:
  68. resizeName = "Spline36";
  69. break;
  70. default:
  71. assert(false);
  72. }
  73. }
  74.  
  75. m_cpVSAPI->propSetInt(pArgumentMap, "prefer_props", 1, paReplace);
  76.  
  77. if(isYUV)
  78. {
  79. const char * matrixInS = nullptr;
  80. switch(m_yuvMatrix)
  81. {
  82. case YuvMatrixCoefficients::m709:
  83. matrixInS = "709";
  84. break;
  85. case YuvMatrixCoefficients::m470BG:
  86. matrixInS = "470bg";
  87. break;
  88. case YuvMatrixCoefficients::m170M:
  89. matrixInS = "170m";
  90. break;
  91. case YuvMatrixCoefficients::m2020_NCL:
  92. matrixInS = "2020ncl";
  93. break;
  94. case YuvMatrixCoefficients::m2020_CL:
  95. matrixInS = "2020cl";
  96. break;
  97. default:
  98. assert(false);
  99. }
  100.  
  101. int matrixStringLength = (int)strlen(matrixInS);
  102. m_cpVSAPI->propSetData(pArgumentMap, "matrix_in_s",
  103. matrixInS, matrixStringLength, paReplace);
  104.  
  105. if(m_yuvMatrix == YuvMatrixCoefficients::m2020_CL)
  106. {
  107. const char * transferIn = "709";
  108. const char * transferOut = "2020_10";
  109.  
  110. m_cpVSAPI->propSetData(pArgumentMap, "transfer_in_s",
  111. transferIn, (int)strlen(transferIn), paReplace);
  112. m_cpVSAPI->propSetData(pArgumentMap, "transfer_s",
  113. transferOut, (int)strlen(transferOut), paReplace);
  114. }
  115. }
  116.  
  117. if(canSubsample)
  118. {
  119. int64_t chromaLoc = 0;
  120. switch(m_chromaPlacement)
  121. {
  122. case ChromaPlacement::MPEG1:
  123. chromaLoc = 1;
  124. break;
  125. case ChromaPlacement::MPEG2:
  126. chromaLoc = 0;
  127. break;
  128. case ChromaPlacement::DV:
  129. chromaLoc = 2;
  130. break;
  131. default:
  132. assert(false);
  133. }
  134. m_cpVSAPI->propSetInt(pArgumentMap, "chromaloc",
  135. chromaLoc, paReplace);
  136. }
  137.  
  138. VSMap * pResultMap = m_cpVSAPI->invoke(pResizePlugin, resizeName,
  139. pArgumentMap);
  140.  
  141. m_cpVSAPI->freeMap(pArgumentMap);
  142.  
  143. const char * cpResultError = m_cpVSAPI->getError(pResultMap);
  144.  
  145. if(cpResultError)
  146. {
  147. m_error = trUtf8("Failed to convert to RGB:\n");
  148. m_error += cpResultError;
  149. emit signalWriteLogMessage(mtCritical, m_error);
  150. m_cpVSAPI->freeMap(pResultMap);
  151. return false;
  152. }
  153.  
  154. VSNodeRef * pPreviewNode = m_cpVSAPI->propGetNode(pResultMap, "clip", 0,
  155. nullptr);
  156. assert(pPreviewNode);
  157. a_nodePair.pPreviewNode = pPreviewNode;
  158.  
  159. m_cpVSAPI->freeMap(pResultMap);
  160.  
  161. return true;
  162. }
Add Comment
Please, Sign In to add comment