Thread: HCenc 027
View Single Post
Old 25th October 2013, 22:15   #16  |  Link
Groucho2004
 
Join Date: Mar 2006
Location: Barcelona
Posts: 5,034
In case you're interested, here is some sample code using the new API that has been working well for me:
Code:
#include <windows.h>
#include <wintrust.h>
#include <imagehlp.h>
#include <string>
#include "avisynth26.h"

BOOL AvisynthExportsAVSLinkage();
const AVS_Linkage *AVS_linkage = 0;

int main(int argc, char* argv[])
{
 //Check if avisynth exports "AVS_Linkage" to make sure at least Avisynth 2.6 Alpha 4 is used
 if (!AvisynthExportsAVSLinkage())
 {
  printf("\nAvisynth 2.6 (Alpha 4 and above) is required.\n");
  return -1;
 }

 HINSTANCE hDLL = ::LoadLibrary("avisynth");
 if (!hDLL)
 {
  cs_avserror = "Failed to load avisynth.dll";
  return -1;
 }

 try 
 {
  IScriptEnvironment *(__stdcall *CreateEnvironment)(int) = (IScriptEnvironment *(__stdcall *)(int))::GetProcAddress(hDLL, "CreateScriptEnvironment");
  if (!CreateEnvironment)
  {
   printf("\nFailed to load CreateScriptEnvironment()\n");
   ::FreeLibrary(hDLL);
   return -1;
  }
 
  IScriptEnvironment *AVS_env = CreateEnvironment(AVISYNTH_INTERFACE_VERSION);
  if (!AVS_env)
  {
   printf("\nCould not create IScriptenvironment\n");
   ::FreeLibrary(hDLL);
   return -1;
  }

  AVS_linkage = AVS_env->GetAVSLinkage();

  AVSValue AVS_main;
  AVS_main = AVS_env->Invoke("Import", argv[1]);

  if (!AVS_main.IsClip()) //not a clip
   AVS_env->ThrowError("Script did not return a video clip:\n(%s)", argv[1]);

  PClip AVS_clip;
  PVideoFrame AVS_frame;
  VideoInfo AVS_vidinfo;

  AVS_clip = AVS_main.AsClip();
  AVS_vidinfo = AVS_clip->GetVideoInfo();
  unsigned int uiFrames = (unsigned int)AVS_vidinfo.num_frames;

  //read frames
  for (unsigned int n = 0; n < uiFrames; n++)
  {
   AVS_frame = AVS_clip->GetFrame(n, AVS_env);
   //...
   //...
  }

  AVS_frame = 0;
  AVS_clip = 0;
  AVS_main = 0;
  AVS_env->DeleteScriptEnvironment();
 }
 catch(AvisynthError err) 
 {
  //...
 }

 AVS_linkage = 0;
 ::FreeLibrary(hDLL);

 return 0;
}


BOOL AvisynthExportsAVSLinkage()
{
 BOOL bRet = FALSE;

 LOADED_IMAGE li;
 BOOL bLoaded = MapAndLoad("avisynth", NULL, &li, TRUE, TRUE);
 if (!bLoaded)
  return bRet;

 DWORD expVA = li.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
 PIMAGE_EXPORT_DIRECTORY pExp = (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(li.FileHeader, li.MappedAddress, expVA, NULL);

 DWORD rvaNames = pExp->AddressOfNames;
 DWORD *prvaNames = (DWORD*)ImageRvaToVa(li.FileHeader, li.MappedAddress, rvaNames, NULL);
 string sName = "";
 int iPos = 0;

 for (DWORD i = 0; i < pExp->NumberOfNames; ++i)
 {
  DWORD rvaName = prvaNames[i];
  sName = (char *)ImageRvaToVa(li.FileHeader, li.MappedAddress, rvaName, NULL);
  iPos = (int)sName.find("AVS_Linkage");
  if (iPos >= 0)
  {
   bRet = TRUE;
   break;
  }
 }

 UnMapAndLoad(&li);

 return bRet;
}

Last edited by Groucho2004; 25th October 2013 at 22:20.
Groucho2004 is offline   Reply With Quote