poikilos
5 years ago
committed by
Jacob Gustafson
42 changed files with 8494 additions and 0 deletions
@ -0,0 +1 @@ |
|||
to Python via cpp2python.txt |
@ -0,0 +1,244 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Copyright (C) 1998-2002 Avery Lee |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with self program; if not, to the Free Software |
|||
# Foundation, Inc., Mass Ave, Cambridge, 02139, USA. |
|||
# |
|||
# |
|||
# FILTER EXEMPTION: |
|||
# |
|||
# As a special exemption to the GPL in order to permit creation of |
|||
# filters that work with multiple programs as well as VirtualDub, |
|||
# compiling with self header file shall not be considered creation |
|||
# of a derived work; that is, act of compiling with self header |
|||
# file does not require your source code or the resulting module |
|||
# to be released in source code form or under a GPL-compatible |
|||
# license according to parts (2) and (3) of the GPL. A filter built |
|||
# using self header file may thus be licensed or dual-licensed so |
|||
# that it may be used with VirtualDub as well as an alternative |
|||
# product whose license is incompatible with the GPL. |
|||
# |
|||
# Nothing in self exemption shall be consTrued as applying to |
|||
# VirtualDub itself -- that is, exemption does not give you |
|||
# permission to use parts of VirtualDub's source besides self |
|||
# header file, to dynamically link with VirtualDub as part |
|||
# of the filter load process, a fashion not permitted by the |
|||
# GPL. |
|||
|
|||
|
|||
#ifndef f_FILTER_H |
|||
#define f_FILTER_H |
|||
|
|||
#include <windows.h> |
|||
|
|||
# This is really dumb, necessary to support VTbls in C++. |
|||
|
|||
struct FilterVTbls |
|||
void *pvtblVBitmap |
|||
|
|||
|
|||
#ifdef VDEXT_MAIN |
|||
struct FilterVTbls g_vtbls |
|||
#elif defined(VDEXT_NOTMAIN) |
|||
extern struct FilterVTbls g_vtbls |
|||
#endif |
|||
|
|||
#define INITIALIZE_VTBLS ff.InitVTables(&g_vtbls) |
|||
|
|||
#include "VBitmap.h" |
|||
|
|||
######### |
|||
|
|||
struct CScriptObject |
|||
|
|||
######### |
|||
|
|||
enum |
|||
FILTERPARAM_SWAP_BUFFERS = 0x00000001L, |
|||
FILTERPARAM_NEEDS_LAST = 0x00000002L, |
|||
|
|||
|
|||
#define FILTERPARAM_HAS_LAG(frames) ((int)(frames) << 16) |
|||
|
|||
#########/ |
|||
|
|||
class VFBitmap |
|||
class FilterActivation |
|||
struct FilterFunctions |
|||
|
|||
typedef int (*FilterInitProc )(FilterActivation *fa, *ff) |
|||
typedef void (*FilterDeinitProc )(FilterActivation *fa, *ff) |
|||
typedef int (*FilterRunProc )( FilterActivation *fa, *ff) |
|||
typedef long (*FilterParamProc )(FilterActivation *fa, *ff) |
|||
typedef int (*FilterConfigProc )(FilterActivation *fa, *ff, hWnd) |
|||
typedef void (*FilterStringProc )( FilterActivation *fa, *ff, *buf) |
|||
typedef int (*FilterStartProc )(FilterActivation *fa, *ff) |
|||
typedef int (*FilterEndProc )(FilterActivation *fa, *ff) |
|||
typedef bool (*FilterScriptStrProc)(FilterActivation *fa, *, *, int) |
|||
typedef void (*FilterStringProc2 )( FilterActivation *fa, *ff, *buf, maxlen) |
|||
typedef int (*FilterSerialize )(FilterActivation *fa, *ff, *buf, maxbuf) |
|||
typedef void (*FilterDeserialize )(FilterActivation *fa, *ff, *buf, maxbuf) |
|||
typedef void (*FilterCopy )(FilterActivation *fa, *ff, *dst) |
|||
|
|||
typedef int (__cdecl *FilterModuleInitProc)(struct FilterModule *fm, *ff, vdfd_ver, vdfd_compat) |
|||
typedef void (__cdecl *FilterModuleDeinitProc)(struct FilterModule *fm, *ff) |
|||
|
|||
##### |
|||
|
|||
typedef void (__cdecl *FilterPreviewButtonCallback)(bool fNewState, *pData) |
|||
typedef void (__cdecl *FilterPreviewSampleCallback)(VFBitmap *, lFrame, lCount, *pData) |
|||
|
|||
class IFilterPreview |
|||
public: |
|||
virtual void SetButtonCallback(FilterPreviewButtonCallback, *)=0 |
|||
virtual void SetSampleCallback(FilterPreviewSampleCallback, *)=0 |
|||
|
|||
virtual bool isPreviewEnabled()=0 |
|||
virtual void Toggle(HWND)=0 |
|||
virtual void Display(HWND, bool)=0 |
|||
virtual void RedoFrame()=0 |
|||
virtual void RedoSystem()=0 |
|||
virtual void UndoSystem()=0 |
|||
virtual void InitButton(HWND)=0 |
|||
virtual void Close()=0 |
|||
virtual bool SampleCurrentFrame()=0 |
|||
virtual long SampleFrames()=0 |
|||
|
|||
|
|||
##### |
|||
|
|||
#define VIRTUALDUB_FILTERDEF_VERSION (8) |
|||
#define VIRTUALDUB_FILTERDEF_COMPATIBLE (4) |
|||
|
|||
# v3: added lCurrentSourceFrame to FrameStateInfo |
|||
# v4 (1.2): lots of additions (VirtualDub 1.2) |
|||
# v5 (1.3d): lots of bugfixes - stretchblt bilinear, non-zero startproc |
|||
# v6 (1.4): added error handling functions |
|||
# v7 (1.4d): added frame lag, handling |
|||
# v8 (1.4.11): |
|||
|
|||
typedef struct FilterModule |
|||
struct FilterModule *next, *prev |
|||
HINSTANCE hInstModule |
|||
FilterModuleInitProc initProc |
|||
FilterModuleDeinitProc deinitProc |
|||
} FilterModule |
|||
|
|||
typedef struct FilterDefinition |
|||
|
|||
struct FilterDefinition *next, *prev |
|||
FilterModule *module |
|||
|
|||
char * name |
|||
char * desc |
|||
char * maker |
|||
void * private_data |
|||
int inst_data_size |
|||
|
|||
FilterInitProc initProc |
|||
FilterDeinitProc deinitProc |
|||
FilterRunProc runProc |
|||
FilterParamProc paramProc |
|||
FilterConfigProc configProc |
|||
FilterStringProc stringProc |
|||
FilterStartProc startProc |
|||
FilterEndProc endProc |
|||
|
|||
CScriptObject *script_obj |
|||
|
|||
FilterScriptStrProc fssProc |
|||
|
|||
# NEW - 1.4.11 |
|||
FilterStringProc2 stringProc2 |
|||
FilterSerialize serializeProc |
|||
FilterDeserialize deserializeProc |
|||
FilterCopy copyProc |
|||
} FilterDefinition |
|||
|
|||
##### |
|||
|
|||
# FilterStateInfo: contains dynamic info about file being processed |
|||
|
|||
class FilterStateInfo |
|||
public: |
|||
long lCurrentFrame; # current output frame |
|||
long lMicrosecsPerFrame; # microseconds per output frame |
|||
long lCurrentSourceFrame; # current source frame |
|||
long lMicrosecsPerSrcFrame; # microseconds per source frame |
|||
long lSourceFrameMS; # source frame timestamp |
|||
long lDestFrameMS; # output frame timestamp |
|||
|
|||
|
|||
# VFBitmap: VBitmap extended to hold filter-specific information |
|||
|
|||
class VFBitmap : public VBitmap |
|||
public: |
|||
enum |
|||
NEEDS_HDC = 0x00000001L, |
|||
|
|||
|
|||
DWORD dwFlags |
|||
HDC hdc |
|||
|
|||
|
|||
# FilterActivation: This is what is actually passed to filters at runtime. |
|||
|
|||
class FilterActivation |
|||
public: |
|||
FilterDefinition *filter |
|||
void *filter_data |
|||
VFBitmap &dst, &src |
|||
VFBitmap *__reserved0, last |
|||
unsigned long x1, y1, x2, y2 |
|||
|
|||
FilterStateInfo *pfsi |
|||
IFilterPreview *ifp |
|||
|
|||
FilterActivation(VFBitmap& _dst, _src, *_last) : dst(_dst), src(_src), last(_last) { |
|||
FilterActivation( FilterActivation& fa, _dst, _src, *_last) |
|||
|
|||
|
|||
# These flags must match those in cpuaccel.h! |
|||
|
|||
#ifndef f_VIRTUALDUB_CPUACCEL_H |
|||
#define CPUF_SUPPORTS_CPUID (0x00000001L) |
|||
#define CPUF_SUPPORTS_FPU (0x00000002L) |
|||
#define CPUF_SUPPORTS_MMX (0x00000004L) |
|||
#define CPUF_SUPPORTS_INTEGER_SSE (0x00000008L) |
|||
#define CPUF_SUPPORTS_SSE (0x00000010L) |
|||
#define CPUF_SUPPORTS_SSE2 (0x00000020L) |
|||
#define CPUF_SUPPORTS_3DNOW (0x00000040L) |
|||
#define CPUF_SUPPORTS_3DNOW_EXT (0x00000080L) |
|||
#endif |
|||
|
|||
struct FilterFunctions |
|||
FilterDefinition *(*addFilter)(FilterModule *, *, fd_len) |
|||
void (*removeFilter)(FilterDefinition *) |
|||
bool (*isFPUEnabled)() |
|||
bool (*isMMXEnabled)() |
|||
void (*InitVTables)(struct FilterVTbls *) |
|||
|
|||
# These functions permit you to throw MyError exceptions from a filter. |
|||
# YOU MUST ONLY CALL THESE IN runProc, initProc, startProc. |
|||
|
|||
void (*ExceptOutOfMemory)(); # ADDED: V6 (VirtualDub 1.4) |
|||
void (*Except)( char *format, ...); # ADDED: V6 (VirtualDub 1.4) |
|||
|
|||
# These functions are callable at any time. |
|||
|
|||
long (*getCPUFlags)(); # ADDED: V6 (VirtualDub 1.4) |
|||
long (*getHostVersionInfo)(char *buffer, len); # ADDED: V7 (VirtualDub 1.4d) |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,95 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Copyright (C) 1998-2002 Avery Lee |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with self program; if not, to the Free Software |
|||
# Foundation, Inc., Mass Ave, Cambridge, 02139, USA. |
|||
# |
|||
# |
|||
# FILTER EXEMPTION: |
|||
# |
|||
# As a special exemption to the GPL in order to permit creation of |
|||
# filters that work with multiple programs as well as VirtualDub, |
|||
# compiling with self header file shall not be considered creation |
|||
# of a derived work; that is, act of compiling with self header |
|||
# file does not require your source code or the resulting module |
|||
# to be released in source code form or under a GPL-compatible |
|||
# license according to parts (2) and (3) of the GPL. A filter built |
|||
# using self header file may thus be licensed or dual-licensed so |
|||
# that it may be used with VirtualDub as well as an alternative |
|||
# product whose license is incompatible with the GPL. |
|||
# |
|||
# Nothing in self exemption shall be consTrued as applying to |
|||
# VirtualDub itself -- that is, exemption does not give you |
|||
# permission to use parts of VirtualDub's source besides self |
|||
# header file, to dynamically link with VirtualDub as part |
|||
# of the filter load process, a fashion not permitted by the |
|||
# GPL. |
|||
|
|||
#ifndef f_SYLIA_SCRIPTERROR_H |
|||
#define f_SYLIA_SCRIPTERROR_H |
|||
|
|||
class CScriptError |
|||
public: |
|||
int err |
|||
|
|||
enum |
|||
PARSE_ERROR=1, |
|||
SEMICOLON_EXPECTED, |
|||
IDENTIFIER_EXPECTED, |
|||
|
|||
TYPE_INT_REQUIRED, |
|||
TYPE_ARRAY_REQUIRED, |
|||
TYPE_FUNCTION_REQUIRED, |
|||
TYPE_OBJECT_REQUIRED, |
|||
|
|||
OBJECT_MEMBER_NAME_REQUIRED, |
|||
FUNCCALLEND_EXPECTED, |
|||
TOO_MANY_PARAMS, |
|||
DIVIDE_BY_ZERO, |
|||
VAR_NOT_FOUND, |
|||
MEMBER_NOT_FOUND, |
|||
OVERLOADED_FUNCTION_NOT_FOUND, |
|||
IDENT_TOO_LONG, |
|||
OPERATOR_EXPECTED, |
|||
CLOSEPARENS_EXPECTED, |
|||
CLOSEBRACKET_EXPECTED, |
|||
|
|||
VAR_UNDEFINED, |
|||
|
|||
OUT_OF_STRING_SPACE, |
|||
OUT_OF_MEMORY, |
|||
INTERNAL_ERROR, |
|||
EXTERNAL_ERROR, |
|||
|
|||
FCALL_OUT_OF_RANGE, |
|||
FCALL_INVALID_PTYPE, |
|||
FCALL_UNKNOWN_STR, |
|||
|
|||
|
|||
CScriptError(int err_num) : err(err_num) { |
|||
|
|||
int getErr() |
|||
return err |
|||
|
|||
|
|||
|
|||
#define SCRIPT_ERROR(x) throw CScriptError(CScriptError.##x) |
|||
|
|||
extern "C" __declspec(dllexport) char * __stdcall TranslateScriptError(int) |
|||
|
|||
char inline *TranslateScriptError(CScriptError cse) |
|||
return TranslateScriptError(cse.getErr()) |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,70 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Copyright (C) 1998-2002 Avery Lee |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with self program; if not, to the Free Software |
|||
# Foundation, Inc., Mass Ave, Cambridge, 02139, USA. |
|||
# |
|||
# |
|||
# FILTER EXEMPTION: |
|||
# |
|||
# As a special exemption to the GPL in order to permit creation of |
|||
# filters that work with multiple programs as well as VirtualDub, |
|||
# compiling with self header file shall not be considered creation |
|||
# of a derived work; that is, act of compiling with self header |
|||
# file does not require your source code or the resulting module |
|||
# to be released in source code form or under a GPL-compatible |
|||
# license according to parts (2) and (3) of the GPL. A filter built |
|||
# using self header file may thus be licensed or dual-licensed so |
|||
# that it may be used with VirtualDub as well as an alternative |
|||
# product whose license is incompatible with the GPL. |
|||
# |
|||
# Nothing in self exemption shall be consTrued as applying to |
|||
# VirtualDub itself -- that is, exemption does not give you |
|||
# permission to use parts of VirtualDub's source besides self |
|||
# header file, to dynamically link with VirtualDub as part |
|||
# of the filter load process, a fashion not permitted by the |
|||
# GPL. |
|||
|
|||
#ifndef f_SYLIA_SCRIPTINTERPRETER_H |
|||
#define f_SYLIA_SCRIPTINTERPRETER_H |
|||
|
|||
class CScriptValue |
|||
class CScriptError |
|||
struct CScriptObject |
|||
class IScriptInterpreter |
|||
|
|||
typedef CScriptValue (*ScriptRootHandlerPtr)(IScriptInterpreter *, *, *) |
|||
|
|||
class IScriptInterpreter |
|||
public: |
|||
virtual void Destroy() =0 |
|||
|
|||
virtual void SetRootHandler(ScriptRootHandlerPtr, *) =0 |
|||
|
|||
virtual void ExecuteLine(char *s) =0 |
|||
|
|||
virtual void ScriptError(int e) =0 |
|||
virtual char* TranslateScriptError(CScriptError& cse) =0 |
|||
virtual char** AllocTempString(long l) =0 |
|||
|
|||
virtual CScriptValue LookupObjectMember(CScriptObject *obj, *, *szIdent) = 0 |
|||
|
|||
|
|||
extern "C" __declspec(dllexport) IScriptInterpreter * __stdcall CreateScriptInterpreter() |
|||
|
|||
#define GETPROC_CREATESCRIPTINTERPRETER(hInst) ((IScriptInterpreter *(__stdcall *)())GetProcAddress(hInst, "_CreateScriptInterpreter@0")) |
|||
|
|||
#define EXT_SCRIPT_ERROR(x) (isi.ScriptError((CScriptError.x))) |
|||
|
|||
#endif |
@ -0,0 +1,171 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Copyright (C) 1998-2002 Avery Lee |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with self program; if not, to the Free Software |
|||
# Foundation, Inc., Mass Ave, Cambridge, 02139, USA. |
|||
# |
|||
# |
|||
# FILTER EXEMPTION: |
|||
# |
|||
# As a special exemption to the GPL in order to permit creation of |
|||
# filters that work with multiple programs as well as VirtualDub, |
|||
# compiling with self header file shall not be considered creation |
|||
# of a derived work; that is, act of compiling with self header |
|||
# file does not require your source code or the resulting module |
|||
# to be released in source code form or under a GPL-compatible |
|||
# license according to parts (2) and (3) of the GPL. A filter built |
|||
# using self header file may thus be licensed or dual-licensed so |
|||
# that it may be used with VirtualDub as well as an alternative |
|||
# product whose license is incompatible with the GPL. |
|||
# |
|||
# Nothing in self exemption shall be consTrued as applying to |
|||
# VirtualDub itself -- that is, exemption does not give you |
|||
# permission to use parts of VirtualDub's source besides self |
|||
# header file, to dynamically link with VirtualDub as part |
|||
# of the filter load process, a fashion not permitted by the |
|||
# GPL. |
|||
|
|||
#ifndef f_SYLIA_SCRIPTVALUE_H |
|||
#define f_SYLIA_SCRIPTVALUE_H |
|||
|
|||
class CScriptArray |
|||
struct CScriptObject |
|||
class CScriptValue |
|||
class IScriptInterpreter |
|||
class VariableTableEntry |
|||
|
|||
typedef CScriptValue (*ScriptObjectLookupFuncPtr)(IScriptInterpreter *, *, *lpVoid, *szName) |
|||
typedef CScriptValue (*ScriptFunctionPtr)(IScriptInterpreter *, *, *, int) |
|||
typedef void (*ScriptVoidFunctionPtr)(IScriptInterpreter *, *, *, int) |
|||
typedef int (*ScriptIntFunctionPtr)(IScriptInterpreter *, *, *, int) |
|||
typedef CScriptValue (*ScriptArrayFunctionPtr)(IScriptInterpreter *, *, int) |
|||
|
|||
typedef struct ScriptFunctionDef |
|||
ScriptFunctionPtr func_ptr |
|||
char *name |
|||
char *arg_list |
|||
} ScriptFunctionDef |
|||
|
|||
typedef struct ScriptObjectDef |
|||
char *name |
|||
CScriptObject *obj |
|||
} ScriptObjectDef |
|||
|
|||
typedef struct CScriptObject |
|||
ScriptObjectLookupFuncPtr Lookup |
|||
ScriptFunctionDef *func_list |
|||
ScriptObjectDef *obj_list |
|||
} CScriptObject |
|||
|
|||
class CScriptValue |
|||
public: |
|||
enum { T_VOID, T_INT, T_PINT, T_STR, T_ARRAY, T_OBJECT, T_FNAME, T_FUNCTION, T_VARLV } type |
|||
CScriptObject *thisPtr |
|||
union |
|||
int i |
|||
int *pi |
|||
char **s |
|||
ScriptArrayFunctionPtr ary |
|||
CScriptObject *obj |
|||
ScriptFunctionPtr func |
|||
ScriptFunctionDef *fname |
|||
VariableTableEntry *vte |
|||
} u |
|||
void *lpVoid |
|||
|
|||
CScriptValue() |
|||
type = T_VOID |
|||
|
|||
CScriptValue(int i) |
|||
type = T_INT |
|||
u.i = i |
|||
|
|||
CScriptValue(int *pi) |
|||
type = T_PINT |
|||
u.pi = pi |
|||
|
|||
CScriptValue(char **s) |
|||
type = T_STR |
|||
u.s = s |
|||
|
|||
CScriptValue(CScriptObject *obj) |
|||
type = T_OBJECT |
|||
u.obj = obj |
|||
|
|||
CScriptValue(CScriptObject *_thisPtr, csa) |
|||
type = T_ARRAY |
|||
u.ary = csa |
|||
thisPtr = _thisPtr |
|||
|
|||
CScriptValue(CScriptObject *_thisPtr, *sfd) |
|||
type = T_FNAME |
|||
u.fname = sfd |
|||
thisPtr = _thisPtr |
|||
|
|||
CScriptValue(CScriptObject *_thisPtr, fn) |
|||
type = T_FUNCTION |
|||
u.func = fn |
|||
thisPtr = _thisPtr |
|||
|
|||
CScriptValue(VariableTableEntry *vte) |
|||
type = T_VARLV |
|||
u.vte = vte |
|||
|
|||
|
|||
bool isVoid() |
|||
return type == T_VOID |
|||
|
|||
bool isInt() |
|||
return type == T_INT |
|||
|
|||
bool isString() |
|||
return type == T_STR |
|||
|
|||
bool isArray() |
|||
return type == T_ARRAY |
|||
|
|||
bool isObject() |
|||
return type == T_OBJECT |
|||
|
|||
bool isFName() |
|||
return type == T_FNAME |
|||
|
|||
bool isFunction() |
|||
return type == T_FUNCTION |
|||
|
|||
bool isVarLV() |
|||
return type == T_VARLV |
|||
|
|||
|
|||
int asInt() |
|||
return u.i |
|||
|
|||
char ** asString() |
|||
return u.s |
|||
|
|||
ScriptArrayFunctionPtr asArray() |
|||
return u.ary |
|||
|
|||
CScriptObject * asObject() |
|||
return u.obj |
|||
|
|||
ScriptFunctionPtr asFunction() |
|||
return u.func |
|||
|
|||
VariableTableEntry* asVarLV() |
|||
return u.vte |
|||
|
|||
|
|||
|
|||
#endif |
@ -0,0 +1,174 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Copyright (C) 1998-2002 Avery Lee |
|||
# |
|||
# This program is free software; you can redistribute it and/or modify |
|||
# it under the terms of the GNU General Public License as published by |
|||
# the Free Software Foundation; either version 2 of the License, or |
|||
# (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with self program; if not, to the Free Software |
|||
# Foundation, Inc., Mass Ave, Cambridge, 02139, USA. |
|||
# |
|||
# |
|||
# FILTER EXEMPTION: |
|||
# |
|||
# As a special exemption to the GPL in order to permit creation of |
|||
# filters that work with multiple programs as well as VirtualDub, |
|||
# compiling with self header file shall not be considered creation |
|||
# of a derived work; that is, act of compiling with self header |
|||
# file does not require your source code or the resulting module |
|||
# to be released in source code form or under a GPL-compatible |
|||
# license according to parts (2) and (3) of the GPL. A filter built |
|||
# using self header file may thus be licensed or dual-licensed so |
|||
# that it may be used with VirtualDub as well as an alternative |
|||
# product whose license is incompatible with the GPL. |
|||
# |
|||
# Nothing in self exemption shall be consTrued as applying to |
|||
# VirtualDub itself -- that is, exemption does not give you |
|||
# permission to use parts of VirtualDub's source besides self |
|||
# header file, to dynamically link with VirtualDub as part |
|||
# of the filter load process, a fashion not permitted by the |
|||
# GPL. |
|||
|
|||
#ifndef f_VIRTUALDUB_VBITMAP_H |
|||
#define f_VIRTUALDUB_VBITMAP_H |
|||
|
|||
#include <windows.h> |
|||
|
|||
typedef unsigned long Pixel |
|||
typedef unsigned long Pixel32 |
|||
typedef unsigned char Pixel8 |
|||
typedef long PixCoord |
|||
typedef long PixDim |
|||
typedef long PixOffset |
|||
|
|||
#ifdef VDEXT_VIDEO_FILTER |
|||
#define NOVTABLE __declspec(novtable) |
|||
#else: |
|||
#define NOVTABLE |
|||
#endif |
|||
|
|||
class NOVTABLE VBitmap |
|||
public: |
|||
Pixel * data |
|||
Pixel * palette |
|||
int depth |
|||
PixCoord w, h |
|||
PixOffset pitch |
|||
PixOffset modulo |
|||
PixOffset size |
|||
PixOffset offset |
|||
|
|||
Pixel *Address(PixCoord x, y) |
|||
return Addressi(x, h-y-1) |
|||
|
|||
|
|||
Pixel *Addressi(PixCoord x, y) |
|||
return (Pixel *)((char *)data + y*pitch + x*(depth>>3)) |
|||
|
|||
|
|||
Pixel *Address16(PixCoord x, y) |
|||
return Address16i(x, h-y-1) |
|||
|
|||
|
|||
Pixel *Address16i(PixCoord x, y) |
|||
return (Pixel *)((char *)data + y*pitch + x*2) |
|||
|
|||
|
|||
Pixel *Address32(PixCoord x, y) |
|||
return Address32i(x, h-y-1) |
|||
|
|||
|
|||
Pixel *Address32i(PixCoord x, y) |
|||
return (Pixel *)((char *)data + y*pitch + x*sizeof(Pixel)) |
|||
|
|||
|
|||
PixOffset PitchAlign4() |
|||
return ((w * depth + 31)/32)*4 |
|||
|
|||
|
|||
PixOffset PitchAlign8() |
|||
return ((w * depth + 63)/64)*8 |
|||
|
|||
|
|||
PixOffset Modulo() |
|||
return pitch - (w*depth+7)/8 |
|||
|
|||
|
|||
PixOffset Size() |
|||
return pitch*h |
|||
|
|||
|
|||
### |
|||
|
|||
VBitmap() throw() |
|||
#ifdef VDEXT_VIDEO_FILTER |
|||
init() |
|||
#endif |
|||
|
|||
VBitmap(void *data, w, h, depth) throw() |
|||
VBitmap(void *data, *) throw() |
|||
|
|||
#ifdef VDEXT_VIDEO_FILTER |
|||
void init() throw() |
|||
*(void **)self = g_vtbls.pvtblVBitmap |
|||
|
|||
#endif |
|||
|
|||
virtual VBitmap& init(void *data, w, h, depth) throw() |
|||
virtual VBitmap& init(void *data, *) throw() |
|||
|
|||
virtual void MakeBitmapHeader(BITMAPINFOHEADER *bih) throw() |
|||
|
|||
virtual void AlignTo4() throw() |
|||
virtual void AlignTo8() throw() |
|||
|
|||
virtual void BitBlt(PixCoord x2, y2, *src, x1, y1, dx, dy) throw() |
|||
virtual void BitBltDither(PixCoord x2, y2, *src, x1, y1, dx, dy, to565) throw() |
|||
virtual void BitBlt565(PixCoord x2, y2, *src, x1, y1, dx, dy) throw() |
|||
|
|||
virtual bool BitBltXlat1(PixCoord x2, y2, *src, x1, y1, dx, dy, *tbl) throw() |
|||
virtual bool BitBltXlat3(PixCoord x2, y2, *src, x1, y1, dx, dy, *tbl) throw() |
|||
|
|||
virtual bool StretchBltNearestFast(PixCoord x1, y1, dx, dy, *src, x2, y2, dx1, dy1) throw() |
|||
|
|||
virtual bool StretchBltBilinearFast(PixCoord x1, y1, dx, dy, *src, x2, y2, dx1, dy1) throw() |
|||
|
|||
virtual bool RectFill(PixCoord x1, y1, dx, dy, c) throw() |
|||
|
|||
enum |
|||
HISTO_LUMA, |
|||
HISTO_GRAY, |
|||
HISTO_RED, |
|||
HISTO_GREEN, |
|||
HISTO_BLUE, |
|||
|
|||
|
|||
virtual bool Histogram(PixCoord x, y, dx, dy, *pHisto, iHistoType) throw() |
|||
|
|||
## NEW AS OF VIRTUALDUB V1.2B |
|||
|
|||
virtual bool BitBltFromYUY2(PixCoord x2, y2, *src, x1, y1, dx, dy) throw() |
|||
virtual bool BitBltFromI420(PixCoord x2, y2, *src, x1, y1, dx, dy) throw() |
|||
|
|||
## NEW AS OF VIRTUALDUB V1.4C |
|||
|
|||
virtual void MakeBitmapHeaderNoPadding(BITMAPINFOHEADER *bih) throw() |
|||
|
|||
#####/ |
|||
|
|||
bool BitBltFromYUY2Fullscale(PixCoord x2, y2, *src, x1, y1, dx, dy) throw() |
|||
|
|||
private: |
|||
bool dualrectclip(PixCoord& x2, y2, *src, x1, y1, dx, dy) throw() |
|||
|
|||
|
|||
#undef NOVTABLE |
|||
|
|||
#endif |
@ -0,0 +1,57 @@ |
|||
#ifndef f_FILTER_H |
|||
#define f_FILTER_H |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
#include <windows.h> |
|||
|
|||
# This is really dumb, necessary to support VTbls in C++. |
|||
|
|||
typedef struct VDXFilterVTbls |
|||
void *pvtblVBitmap |
|||
} FilterVTbls |
|||
|
|||
#ifdef VDEXT_MAIN |
|||
VDXFilterVTbls g_vtbls |
|||
#elif defined(VDEXT_NOTMAIN) |
|||
extern VDXFilterVTbls g_vtbls |
|||
#endif |
|||
|
|||
#define INITIALIZE_VTBLS ff.InitVTables(&g_vtbls) |
|||
|
|||
#include "VBitmap.h" |
|||
|
|||
typedef .VDXFilterInitProc FilterInitProc |
|||
typedef .VDXFilterDeinitProc FilterDeinitProc |
|||
typedef .VDXFilterRunProc FilterRunProc |
|||
typedef .VDXFilterParamProc FilterParamProc |
|||
typedef .VDXFilterConfigProc FilterConfigProc |
|||
typedef .VDXFilterStringProc FilterStringProc |
|||
typedef .VDXFilterStartProc FilterStartProc |
|||
typedef .VDXFilterEndProc FilterEndProc |
|||
typedef .VDXFilterScriptStrProc FilterScriptStrProc |
|||
typedef .VDXFilterStringProc2 FilterStringProc2 |
|||
typedef .VDXFilterSerialize FilterSerialize |
|||
typedef .VDXFilterDeserialize FilterDeserialize |
|||
typedef .VDXFilterCopy FilterCopy |
|||
|
|||
typedef .VDXFilterModuleInitProc FilterModuleInitProc |
|||
typedef .VDXFilterModuleDeinitProc FilterModuleDeinitProc |
|||
|
|||
##### |
|||
|
|||
typedef .VDXFilterPreviewButtonCallback FilterPreviewButtonCallback |
|||
typedef .VDXFilterPreviewSampleCallback FilterPreviewSampleCallback |
|||
|
|||
typedef .IVDXFilterPreview IFilterPreview |
|||
|
|||
##### |
|||
|
|||
typedef .VDXFilterModule FilterModule |
|||
typedef .VDXFilterDefinition FilterDefinition |
|||
typedef .VDXFilterStateInfo FilterStateInfo |
|||
typedef .VDXFBitmap VFBitmap |
|||
|
|||
typedef .VDXFilterActivation FilterActivation |
|||
typedef .VDXFilterFunctions FilterFunctions |
|||
|
|||
#endif |
@ -0,0 +1,8 @@ |
|||
#ifndef f_SYLIA_SCRIPTERROR_H |
|||
#define f_SYLIA_SCRIPTERROR_H |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
typedef .VDXScriptError CScriptError |
|||
|
|||
#endif |
@ -0,0 +1,11 @@ |
|||
#ifndef f_SYLIA_SCRIPTINTERPRETER_H |
|||
#define f_SYLIA_SCRIPTINTERPRETER_H |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
typedef .VDXScriptValue CScriptValue |
|||
typedef .VDXScriptError CScriptError |
|||
typedef .VDXScriptObject CScriptObject |
|||
typedef .IVDXScriptInterpreter IScriptInterpreter |
|||
|
|||
#endif |
@ -0,0 +1,17 @@ |
|||
#ifndef f_SYLIA_SCRIPTVALUE_H |
|||
#define f_SYLIA_SCRIPTVALUE_H |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
typedef .VDXScriptObject CScriptObject |
|||
typedef .VDXScriptValue CScriptValue |
|||
typedef .IVDXScriptInterpreter IScriptInterpreter |
|||
|
|||
typedef .VDXScriptFunctionPtr ScriptFunctionPtr |
|||
typedef .VDXVoidScriptFunctionPtr ScriptVoidFunctionPtr |
|||
typedef .VDXIntScriptFunctionPtr ScriptIntFunctionPtr |
|||
|
|||
typedef .VDXScriptFunctionDef ScriptFunctionDef |
|||
typedef .VDXScriptObject CScriptObject |
|||
|
|||
#endif |
@ -0,0 +1,16 @@ |
|||
#ifndef f_VIRTUALDUB_VBITMAP_H |
|||
#define f_VIRTUALDUB_VBITMAP_H |
|||
|
|||
#include <windows.h> |
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
typedef unsigned Pixel |
|||
typedef unsigned Pixel32 |
|||
typedef unsigned char Pixel8 |
|||
typedef int PixCoord |
|||
typedef int PixDim |
|||
typedef ptrdiff_t PixOffset |
|||
|
|||
typedef .VDXBitmap VBitmap |
|||
|
|||
#endif |
@ -0,0 +1,110 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_VDXFRAME_UNKNOWN_H |
|||
#define f_VD2_VDXFRAME_UNKNOWN_H |
|||
|
|||
#include <vd2/plugin/vdplugin.h> |
|||
|
|||
extern "C" long _InterlockedExchangeAdd(volatile long *p, v) |
|||
#pragma intrinsic(_InterlockedExchangeAdd) |
|||
|
|||
template<class T> class vdxunknown : public T |
|||
public: |
|||
vdxunknown() : mRefCount(0) { |
|||
vdxunknown( vdxunknown<T>& src) : mRefCount(0) {} # do not copy the refcount |
|||
virtual ~vdxunknown() { |
|||
|
|||
vdxunknown<T>& operator=( vdxunknown<T>&) {} # do not copy the refcount |
|||
|
|||
virtual int VDXAPIENTRY AddRef() |
|||
return _InterlockedExchangeAdd(&mRefCount, 1) + 1 |
|||
|
|||
|
|||
virtual int VDXAPIENTRY Release() |
|||
rc = _InterlockedExchangeAdd(&mRefCount, -1) - 1 |
|||
if not mRefCount: |
|||
mRefCount = 1 |
|||
delete self |
|||
return 0 |
|||
|
|||
|
|||
return rc |
|||
|
|||
|
|||
virtual void *VDXAPIENTRY AsInterface(uint32 iid) |
|||
if iid == T.kIID: |
|||
return static_cast<T *>(self) |
|||
|
|||
if iid == IVDXUnknown.kIID: |
|||
return static_cast<IVDXUnknown *>(self) |
|||
|
|||
return NULL |
|||
|
|||
|
|||
protected: |
|||
volatile long mRefCount |
|||
|
|||
|
|||
template<class T1, T2> class vdxunknown2 : public T1, T2 |
|||
public: |
|||
vdxunknown2() : mRefCount(0) { |
|||
vdxunknown2( vdxunknown2& src) : mRefCount(0) {} # do not copy the refcount |
|||
virtual ~vdxunknown2() { |
|||
|
|||
vdxunknown2& operator=( vdxunknown2&) {} # do not copy the refcount |
|||
|
|||
virtual int VDXAPIENTRY AddRef() |
|||
return _InterlockedExchangeAdd(&mRefCount, 1) + 1 |
|||
|
|||
|
|||
virtual int VDXAPIENTRY Release() |
|||
rc = _InterlockedExchangeAdd(&mRefCount, -1) - 1 |
|||
if not mRefCount: |
|||
mRefCount = 1 |
|||
delete self |
|||
return 0 |
|||
|
|||
|
|||
return rc |
|||
|
|||
|
|||
virtual void *VDXAPIENTRY AsInterface(uint32 iid) |
|||
if iid == T1.kIID: |
|||
return static_cast<T1 *>(self) |
|||
|
|||
if iid == T2.kIID: |
|||
return static_cast<T2 *>(self) |
|||
|
|||
if iid == IVDXUnknown.kIID: |
|||
return static_cast<IVDXUnknown *>(static_cast<T1 *>(self)) |
|||
|
|||
return NULL |
|||
|
|||
|
|||
protected: |
|||
volatile long mRefCount |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,220 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_VDXFRAME_VIDEOFILTER_H |
|||
#define f_VD2_VDXFRAME_VIDEOFILTER_H |
|||
|
|||
#include <stdlib.h> |
|||
#include <stddef.h> |
|||
#include <new> |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
#####################################/ |
|||
#/ \class VDXVideoFilter |
|||
#/ |
|||
#/ This class handles most of the grimy work of creating the interface |
|||
#/ between your filter and VirtualDub. |
|||
#/ |
|||
class VDXVideoFilter |
|||
public: |
|||
VDXVideoFilter() |
|||
virtual ~VDXVideoFilter() |
|||
|
|||
void SetHooks(VDXFilterActivation *fa, *ff) |
|||
|
|||
# linkage routines |
|||
|
|||
virtual bool Init() |
|||
virtual uint32 GetParams()=0 |
|||
virtual void Start() |
|||
virtual void Run() = 0 |
|||
virtual void End() |
|||
virtual bool Configure(VDXHWND hwnd) |
|||
virtual void GetSettingString(char *buf, maxlen) |
|||
virtual void GetScriptString(char *buf, maxlen) |
|||
virtual int Serialize(char *buf, maxbuf) |
|||
virtual int Deserialize( char *buf, maxbuf) |
|||
virtual sint64 Prefetch(sint64 frame) |
|||
virtual bool Prefetch2(sint64 frame, *prefetcher) |
|||
|
|||
virtual bool OnEvent(uint32 event, *eventData) |
|||
virtual bool OnInvalidateCaches() |
|||
|
|||
static void __cdecl FilterDeinit (VDXFilterActivation *fa, *ff) |
|||
static int __cdecl FilterRun ( VDXFilterActivation *fa, *ff) |
|||
static long __cdecl FilterParam (VDXFilterActivation *fa, *ff) |
|||
static int __cdecl FilterConfig (VDXFilterActivation *fa, *ff, hWnd) |
|||
static int __cdecl FilterStart (VDXFilterActivation *fa, *ff) |
|||
static int __cdecl FilterEnd (VDXFilterActivation *fa, *ff) |
|||
static void __cdecl FilterString ( VDXFilterActivation *fa, *ff, *buf) |
|||
static bool __cdecl FilterScriptStr(VDXFilterActivation *fa, *, *, int) |
|||
static void __cdecl FilterString2 ( VDXFilterActivation *fa, *ff, *buf, maxlen) |
|||
static int __cdecl FilterSerialize (VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
static void __cdecl FilterDeserialize (VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
static sint64 __cdecl FilterPrefetch( VDXFilterActivation *fa, *ff, frame) |
|||
static bool __cdecl FilterPrefetch2( VDXFilterActivation *fa, *ff, frame, *prefetcher) |
|||
static bool __cdecl FilterEvent( VDXFilterActivation *fa, *ff, event, *eventData) |
|||
|
|||
# member variables |
|||
VDXFilterActivation *fa |
|||
VDXFilterFunctions *ff |
|||
|
|||
static VDXScriptFunctionDef sScriptMethods[] |
|||
|
|||
protected: |
|||
void SafePrintf(char *buf, maxbuf, *format, ...) |
|||
|
|||
|
|||
#####################################/ |
|||
# Script method support |
|||
# |
|||
# To declare a Config() script method, add |
|||
# |
|||
# VDXVF_DECLARE_SCRIPT_METHODS() |
|||
# |
|||
# to the public portion of your class definition, then add a method |
|||
# table at namespace scope: |
|||
# |
|||
# VDXVF_BEGIN_SCRIPT_METHODS(SpatialForegroundRemoverFilter) |
|||
# VDXVF_DEFINE_SCRIPT_METHOD(SpatialForegroundRemoverFilter, ScriptConfig, "iii") |
|||
# VDXVF_END_SCRIPT_METHODS() |
|||
# |
|||
# Use VDXVF_DEFINE_SCRIPT_METHOD() for the first method, then |
|||
# VDXVF_DEFINE_SCRIPT_METHOD2() for any overloads. |
|||
|
|||
#define VDXVF_DECLARE_SCRIPT_METHODS() static VDXScriptFunctionDef sScriptMethods[] |
|||
|
|||
#define VDXVF_BEGIN_SCRIPT_METHODS(klass) VDXScriptFunctionDef klass.sScriptMethods[] =#define VDXVF_DEFINE_SCRIPT_METHOD(klass, method, args) { (VDXScriptFunctionPtr)VDXVideoFilterScriptAdapter<klass, &klass.method>.AdaptFn, "Config", "0" args }, |
|||
#define VDXVF_DEFINE_SCRIPT_METHOD2(klass, method, args) { (VDXScriptFunctionPtr)VDXVideoFilterScriptAdapter<klass, &klass.method>.AdaptFn, NULL, "0" args }, |
|||
#define VDXVF_END_SCRIPT_METHODS() { NULL } |
|||
|
|||
extern char VDXVideoFilterConfigureOverloadTest(bool (VDXVideoFilter.*)(VDXHWND)) |
|||
extern double VDXVideoFilterConfigureOverloadTest(...) |
|||
extern char VDXVideoFilterPrefetchOverloadTest(sint64 (VDXVideoFilter.*)(sint64)) |
|||
extern double VDXVideoFilterPrefetchOverloadTest(...) |
|||
extern char VDXVideoFilterPrefetch2OverloadTest(bool (VDXVideoFilter.*)(sint64, *)) |
|||
extern double VDXVideoFilterPrefetch2OverloadTest(...) |
|||
|
|||
template<class T, void (T.*T_Method)(IVDXScriptInterpreter *, *, int)> |
|||
class VDXVideoFilterScriptAdapter |
|||
public: |
|||
static void AdaptFn(IVDXScriptInterpreter *isi, *fa0, *argv, argc) |
|||
VDXFilterActivation *fa = (VDXFilterActivation *)fa0 |
|||
VDXVideoFilter *base = *(VDXVideoFilter **)fa.filter_data |
|||
(static_cast<T *>(base).*T_Method)(isi, argv, argc) |
|||
|
|||
|
|||
|
|||
template<class T> |
|||
class VDXVideoFilterScriptObjectAdapter |
|||
public: |
|||
static VDXScriptObject sScriptObject |
|||
|
|||
|
|||
template<class T> |
|||
VDXScriptObject VDXVideoFilterScriptObjectAdapter<T>.sScriptObject = |
|||
NULL, (T.sScriptMethods == VDXVideoFilter.sScriptMethods) ? NULL : (VDXScriptFunctionDef *)static_cast< VDXScriptFunctionDef *>(T.sScriptMethods), NULL |
|||
|
|||
|
|||
#####################################/ |
|||
#/ \class VDXVideoFilterDefinition |
|||
#/ |
|||
#/ This template creates the FilterDefinition structure for you based on |
|||
#/ your filter class. |
|||
#/ |
|||
template<class T> |
|||
class VDXVideoFilterDefinition : public VDXFilterDefinition |
|||
public: |
|||
VDXVideoFilterDefinition( char *pszAuthor, *pszName, *pszDescription) |
|||
_next = NULL |
|||
_prev = NULL |
|||
_module = NULL |
|||
|
|||
name = pszName |
|||
desc = pszDescription |
|||
maker = pszAuthor |
|||
private_data = NULL |
|||
inst_data_size = sizeof(T) + sizeof(VDXVideoFilter *) |
|||
|
|||
initProc = FilterInit |
|||
deinitProc = T.FilterDeinit |
|||
runProc = T.FilterRun |
|||
paramProc = T.FilterParam |
|||
configProc = sizeof(VDXVideoFilterConfigureOverloadTest(&T.Configure)) > 1 ? T.FilterConfig : NULL |
|||
stringProc = T.FilterString |
|||
startProc = T.FilterStart |
|||
endProc = T.FilterEnd |
|||
|
|||
script_obj = T.sScriptMethods ? const_cast<VDXScriptObject *>(&VDXVideoFilterScriptObjectAdapter<T>.sScriptObject) : 0 |
|||
fssProc = T.FilterScriptStr |
|||
|
|||
stringProc2 = T.FilterString2 |
|||
serializeProc = T.FilterSerialize |
|||
deserializeProc = T.FilterDeserialize |
|||
copyProc = FilterCopy |
|||
copyProc2 = FilterCopy2 |
|||
|
|||
prefetchProc = sizeof(VDXVideoFilterPrefetchOverloadTest(&T.Prefetch)) > 1 ? T.FilterPrefetch : NULL |
|||
prefetchProc2 = sizeof(VDXVideoFilterPrefetch2OverloadTest(&T.Prefetch2)) > 1 or sizeof(VDXVideoFilterPrefetchOverloadTest(&T.Prefetch)) > 1 ? T.FilterPrefetch2 : NULL |
|||
|
|||
eventProc = T.FilterEvent |
|||
|
|||
|
|||
private: |
|||
static int __cdecl FilterInit (VDXFilterActivation *fa, *ff) |
|||
T *pThis = new((char *)fa.filter_data + sizeof(VDXVideoFilter *)) T |
|||
*(VDXVideoFilter **)fa.filter_data = static_cast<VDXVideoFilter *>(pThis) |
|||
|
|||
pThis.SetHooks(fa, ff) |
|||
|
|||
try |
|||
if not pThis.Init(): |
|||
pThis.~T() |
|||
return 1 |
|||
|
|||
|
|||
return 0 |
|||
|
|||
catch(...) |
|||
pThis.~T() |
|||
throw |
|||
|
|||
|
|||
|
|||
static void __cdecl FilterCopy (VDXFilterActivation *fa, *ff, *dst) |
|||
T *p = new((char *)dst + sizeof(VDXVideoFilter *)) T(*static_cast<T *>(*reinterpret_cast<VDXVideoFilter **>(fa.filter_data))) |
|||
p.ff = ff |
|||
*(VDXVideoFilter **)dst = p |
|||
|
|||
|
|||
static void __cdecl FilterCopy2 (VDXFilterActivation *fa, *ff, *dst, *fanew, *ffnew) |
|||
T *p = new((char *)dst + sizeof(VDXVideoFilter *)) T(*static_cast<T *>(*reinterpret_cast<VDXVideoFilter **>(fa.filter_data))) |
|||
p.ff = ffnew |
|||
p.fa = fanew |
|||
*(VDXVideoFilter **)dst = p |
|||
|
|||
|
|||
|
|||
#endif |
@ -0,0 +1,46 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_VDXFRAME_VIDEOFILTERDIALOG_H |
|||
#define f_VD2_VDXFRAME_VIDEOFILTERDIALOG_H |
|||
|
|||
#include <windows.h> |
|||
|
|||
class VDXVideoFilterDialog |
|||
public: |
|||
VDXVideoFilterDialog() |
|||
|
|||
protected: |
|||
HWND mhdlg |
|||
|
|||
LRESULT Show(HINSTANCE hInst, templName, parent) |
|||
LRESULT Show(HINSTANCE hInst, templName, parent) |
|||
HWND ShowModeless(HINSTANCE hInst, templName, parent) |
|||
HWND ShowModeless(HINSTANCE hInst, templName, parent) |
|||
|
|||
static INT_PTR CALLBACK StaticDlgProc(HWND hdlg, msg, wParam, lParam) |
|||
virtual INT_PTR DlgProc(UINT msg, wParam, lParam) |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,83 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_VDXFRAME_VIDEOFILTERENTRY_H |
|||
#define f_VD2_VDXFRAME_VIDEOFILTERENTRY_H |
|||
|
|||
#include <vd2/plugin/vdvideofilt.h> |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma once |
|||
#endif |
|||
|
|||
struct VDXFilterModule |
|||
struct VDXFilterFunctions |
|||
struct VDXFilterDefinition |
|||
|
|||
#######################################/ |
|||
#/ Video filter module entry point declaration macros |
|||
#/ |
|||
#/ To declare the module init and deinit functions: |
|||
#/ |
|||
#/ VDX_DECLARE_VFMODULE() |
|||
#/ |
|||
#/ By default self declares the module as requiring copy contructor support |
|||
#/ (V9 / VirtualDub 1.4.12). If you need to declare a different minimum |
|||
#/ version, use: |
|||
#/ |
|||
#/ VDX_DECLARE_VFMODULE_APIVER(version) |
|||
#/ |
|||
#define VDX_DECLARE_VFMODULE() VDX_DECLARE_VFMODULE_APIVER(VIRTUALDUB_FILTERDEF_COMPATIBLE_COPYCTOR) |
|||
#define VDX_DECLARE_VFMODULE_APIVER(apiver) \ |
|||
extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(struct VDXFilterModule *fm, *ff, vdfd_ver, vdfd_compat) { \ |
|||
return VDXVideoFilterModuleInit2(fm, ff, vdfd_ver, vdfd_compat, (apiver)); \ |
|||
} \ |
|||
\ |
|||
extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(struct VDXFilterModule *fm, *ff) { \ |
|||
VDXVideoFilterModuleDeinit(fm, ff); \ |
|||
|
|||
|
|||
#######################################/ |
|||
#/ Video filter declaration macros |
|||
#/ |
|||
#/ To declare video filters, the following pattern: |
|||
#/ |
|||
#/ VDX_DECLARE_VIDEOFILTERS_BEGIN() |
|||
#/ VDX_DECLARE_VIDEOFILTER(definitionSymbolName) |
|||
#/ VDX_DECLARE_VIDEOFILTERS_END() |
|||
#/ |
|||
#/ Each entry points to a variable of type VDXFilterDefinition. Note that these must |
|||
#/ be declared as _non-const_ for compatibility with older versions of VirtualDub. |
|||
#/ Video filters declared self way are automatically registered by the module init |
|||
#/ routine. |
|||
#/ |
|||
#define VDX_DECLARE_VIDEOFILTERS_BEGIN() VDXFilterDefinition *VDXGetVideoFilterDefinition(int index)#define VDX_DECLARE_VIDEOFILTER(defVarName) if (not index--) { extern VDXFilterDefinition defVarName; return &defVarName; |
|||
#define VDX_DECLARE_VIDEOFILTERS_END() return NULL; \ |
|||
|
|||
def VDXVideoFilterModuleInit2(self, VDXFilterModule *fm, *ff, vdfd_ver, vdfd_compat, ver_compat_target): |
|||
def VDXVideoFilterModuleDeinit(self, VDXFilterModule *fm, *ff): |
|||
|
|||
def VDXGetVideoFilterAPIVersion(self): |
|||
|
|||
#endif |
@ -0,0 +1,148 @@ |
|||
#ifndef f_VD2_PLUGIN_VDAUDIOFILT_H |
|||
#define f_VD2_PLUGIN_VDAUDIOFILT_H |
|||
|
|||
#####################################/ |
|||
# |
|||
# Audio filter support |
|||
|
|||
struct VDAudioFilterDefinition |
|||
struct VDXWaveFormat |
|||
struct VDPluginCallbacks |
|||
|
|||
enum |
|||
kVDPlugin_AudioAPIVersion = 2 |
|||
|
|||
|
|||
struct VDAudioFilterPin |
|||
unsigned mGranularity; # Block size a filter reads/writes self pin. |
|||
unsigned mDelay; # Delay in samples on self input. |
|||
unsigned mBufferSize; # The size, samples, the buffer. |
|||
unsigned mCurrentLevel; # The number of samples currently in the buffer. |
|||
sint64 mLength; # Approximate length of self stream in us. |
|||
VDXWaveFormat *mpFormat |
|||
bool mbVBR |
|||
bool mbEnded |
|||
char _pad[2] |
|||
void *mpBuffer |
|||
unsigned mSamplesWritten; # The number of samples just written to the buffer. |
|||
unsigned mAvailSpace; # Available room pointed to by mpBuffer (output pins only). |
|||
|
|||
uint32 (VDAPIENTRY *mpReadProc)(VDAudioFilterPin *pPin, *dst, samples, bAllowFill, format) |
|||
|
|||
# These helpers are non-virtual inlines and are compiled into filters. |
|||
uint32 Read(void *dst, samples, bAllowFill, format) |
|||
return mpReadProc(self, dst, samples, bAllowFill, format) |
|||
|
|||
|
|||
|
|||
struct VDAudioFilterContext |
|||
|
|||
struct VDAudioFilterCallbacks |
|||
VDXWaveFormat *(VDAPIENTRY *AllocPCMWaveFormat)(unsigned sampling_rate, channels, bits, bFloat) |
|||
VDXWaveFormat *(VDAPIENTRY *AllocCustomWaveFormat)(unsigned extra_size) |
|||
VDXWaveFormat *(VDAPIENTRY *CopyWaveFormat)( VDXWaveFormat *) |
|||
void (VDAPIENTRY *FreeWaveFormat)( VDXWaveFormat *) |
|||
void (VDAPIENTRY *Wake)( VDAudioFilterContext *pContext) |
|||
|
|||
|
|||
struct VDAudioFilterContext |
|||
void *mpFilterData |
|||
VDAudioFilterPin **mpInputs |
|||
VDAudioFilterPin **mpOutputs |
|||
IVDPluginCallbacks *mpServices |
|||
VDAudioFilterCallbacks *mpAudioCallbacks |
|||
VDAudioFilterDefinition *mpDefinition |
|||
uint32 mAPIVersion |
|||
uint32 mInputSamples; # Number of input samples available on all pins. |
|||
uint32 mInputGranules; # Number of input granules available on all pins. |
|||
uint32 mInputsEnded; # Number of inputs that have ended. |
|||
uint32 mOutputSamples; # Number of output sample spaces available on all pins. |
|||
uint32 mOutputGranules; # Number of output granule spaces available on all pins. |
|||
uint32 mCommonSamples; # Number of input samples and output sample spaces. |
|||
uint32 mCommonGranules; # Number of input and output granules. |
|||
|
|||
|
|||
# This structure is intentionally identical to WAVEFORMATEX, one |
|||
# exception -- mExtraSize is *always* present, for PCM. |
|||
|
|||
struct VDXWaveFormat |
|||
enum { kTagPCM = 1 |
|||
|
|||
uint16 mTag |
|||
uint16 mChannels |
|||
uint32 mSamplingRate |
|||
uint32 mDataRate |
|||
uint16 mBlockSize |
|||
uint16 mSampleBits |
|||
uint16 mExtraSize |
|||
|
|||
|
|||
enum |
|||
kVFARun_OK = 0, |
|||
kVFARun_Finished = 1, |
|||
kVFARun_InternalWork = 2, |
|||
|
|||
kVFAPrepare_OK = 0, |
|||
kVFAPrepare_BadFormat = 1 |
|||
|
|||
|
|||
enum |
|||
kVFARead_Native = 0, |
|||
kVFARead_PCM8 = 1, |
|||
kVFARead_PCM16 = 2, |
|||
kVFARead_PCM32F = 3 |
|||
|
|||
|
|||
typedef void * (VDAPIENTRY *VDAudioFilterExtProc )( VDAudioFilterContext *pContext, *pInterfaceName) |
|||
typedef uint32 (VDAPIENTRY *VDAudioFilterRunProc )( VDAudioFilterContext *pContext) |
|||
typedef sint64 (VDAPIENTRY *VDAudioFilterSeekProc )( VDAudioFilterContext *pContext, microsecs) |
|||
typedef uint32 (VDAPIENTRY *VDAudioFilterPrepareProc )( VDAudioFilterContext *pContext) |
|||
typedef void (VDAPIENTRY *VDAudioFilterStartProc )( VDAudioFilterContext *pContext) |
|||
typedef void (VDAPIENTRY *VDAudioFilterStopProc )( VDAudioFilterContext *pContext) |
|||
typedef void (VDAPIENTRY *VDAudioFilterInitProc )( VDAudioFilterContext *pContext) |
|||
typedef void (VDAPIENTRY *VDAudioFilterDestroyProc )( VDAudioFilterContext *pContext) |
|||
typedef unsigned (VDAPIENTRY *VDAudioFilterSuspendProc )( VDAudioFilterContext *pContext, *dst, size) |
|||
typedef void (VDAPIENTRY *VDAudioFilterResumeProc )( VDAudioFilterContext *pContext, *src, size) |
|||
typedef unsigned (VDAPIENTRY *VDAudioFilterGetParamProc )( VDAudioFilterContext *pContext, idx, *dst, size) |
|||
typedef void (VDAPIENTRY *VDAudioFilterSetParamProc )( VDAudioFilterContext *pContext, idx, *src, variant_count) |
|||
typedef bool (VDAPIENTRY *VDAudioFilterConfigProc )( VDAudioFilterContext *pContext, HWND__ *hwnd) |
|||
|
|||
enum |
|||
kVFAF_Zero = 0, |
|||
kVFAF_HasConfig = 1, # Filter has a configuration dialog. |
|||
kVFAF_SerializedIO = 2, # Filter must execute in the serialized I/O thread. |
|||
|
|||
kVFAF_Max = 0xFFFFFFFF, |
|||
|
|||
|
|||
struct VDAudioFilterVtbl |
|||
uint32 mSize |
|||
VDAudioFilterDestroyProc mpDestroy |
|||
VDAudioFilterPrepareProc mpPrepare |
|||
VDAudioFilterStartProc mpStart |
|||
VDAudioFilterStopProc mpStop |
|||
VDAudioFilterRunProc mpRun |
|||
VDAudioFilterSeekProc mpSeek |
|||
VDAudioFilterSuspendProc mpSuspend |
|||
VDAudioFilterResumeProc mpResume |
|||
VDAudioFilterGetParamProc mpGetParam |
|||
VDAudioFilterSetParamProc mpSetParam |
|||
VDAudioFilterConfigProc mpConfig |
|||
VDAudioFilterExtProc mpExt |
|||
|
|||
|
|||
struct VDAudioFilterDefinition |
|||
uint32 mSize; # size of self structure in bytes |
|||
uint32 mFlags |
|||
|
|||
uint32 mFilterDataSize |
|||
uint32 mInputPins |
|||
uint32 mOutputPins |
|||
|
|||
VDXPluginConfigEntry *mpConfigInfo |
|||
|
|||
VDAudioFilterInitProc mpInit |
|||
VDAudioFilterVtbl *mpVtbl |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,284 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Plugin headers |
|||
# Copyright (C) 1998-2007 Avery Lee, Rights Reserved. |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_PLUGIN_VDINPUTDRIVER_H |
|||
#define f_VD2_PLUGIN_VDINPUTDRIVER_H |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma once |
|||
#pragma pack(push, 8) |
|||
#endif |
|||
|
|||
#include "vdplugin.h" |
|||
|
|||
#/ Unsigned 32-bit fraction. |
|||
struct VDXFraction |
|||
uint32 mNumerator |
|||
uint32 mDenominator |
|||
|
|||
|
|||
typedef struct VDXHWNDStruct *VDXHWND |
|||
typedef struct VDXBITMAPINFOHEADERStruct |
|||
enum { kCompressionRGB = 0 |
|||
uint32 mSize |
|||
sint32 mWidth |
|||
sint32 mHeight |
|||
uint16 mPlanes |
|||
uint16 mBitCount |
|||
uint32 mCompression |
|||
uint32 mSizeImage |
|||
sint32 mXPelsPerMeter |
|||
sint32 mYPelsPerMeter |
|||
uint32 mClrUsed |
|||
uint32 mClrImportant |
|||
} VDXBITMAPINFOHEADER |
|||
|
|||
typedef struct VDXWAVEFORMATEXStruct |
|||
enum { kFormatPCM = 1 |
|||
uint16 mFormatTag |
|||
uint16 mChannels |
|||
uint32 mSamplesPerSec |
|||
uint32 mAvgBytesPerSec |
|||
uint16 mBlockAlign |
|||
uint16 mBitsPerSample |
|||
uint16 mExtraSize |
|||
} VDXWAVEFORMATEX |
|||
|
|||
struct VDXStreamSourceInfo |
|||
VDXFraction mSampleRate |
|||
sint64 mSampleCount |
|||
VDXFraction mPixelAspectRatio |
|||
|
|||
|
|||
# V3+ (1.7.X) only |
|||
struct VDXStreamSourceInfoV3 |
|||
VDXStreamSourceInfo mInfo |
|||
|
|||
enum |
|||
kFlagVariableSizeSamples = 0x00000001 |
|||
|
|||
|
|||
uint32 mFlags |
|||
uint32 mfccHandler; #/< If non-zero, the FOURCC of a codec handler that should be preferred. |
|||
|
|||
|
|||
class IVDXStreamSource : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 's', 't', 's') |
|||
|
|||
virtual void VDXAPIENTRY GetStreamSourceInfo(VDXStreamSourceInfo&) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY Read(sint64 lStart, lCount, *lpBuffer, cbBuffer, *lBytesRead, *lSamplesRead) = 0 |
|||
|
|||
virtual void * VDXAPIENTRY GetDirectFormat() = 0 |
|||
virtual int VDXAPIENTRY GetDirectFormatLen() = 0 |
|||
|
|||
enum ErrorMode |
|||
kErrorModeReportAll = 0, |
|||
kErrorModeConceal, |
|||
kErrorModeDecodeAnyway, |
|||
kErrorModeCount |
|||
|
|||
|
|||
virtual ErrorMode VDXAPIENTRY GetDecodeErrorMode() = 0 |
|||
virtual void VDXAPIENTRY SetDecodeErrorMode(ErrorMode mode) = 0 |
|||
virtual bool VDXAPIENTRY IsDecodeErrorModeSupported(ErrorMode mode) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY IsVBR() = 0 |
|||
virtual sint64 VDXAPIENTRY TimeToPositionVBR(sint64 us) = 0 |
|||
virtual sint64 VDXAPIENTRY PositionToTimeVBR(sint64 samples) = 0 |
|||
|
|||
|
|||
# V3+ (1.7.X) |
|||
class IVDXStreamSourceV3 : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 's', 't', '2') |
|||
|
|||
virtual void VDXAPIENTRY GetStreamSourceInfoV3(VDXStreamSourceInfoV3&) = 0 |
|||
|
|||
|
|||
class IVDXVideoDecoderModel : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'v', 'd', 'm') |
|||
|
|||
virtual void VDXAPIENTRY Reset() = 0 |
|||
virtual void VDXAPIENTRY SetDesiredFrame(sint64 frame_num) = 0 |
|||
virtual sint64 VDXAPIENTRY GetNextRequiredSample(bool& is_preroll) = 0 |
|||
virtual int VDXAPIENTRY GetRequiredCount() = 0 |
|||
|
|||
|
|||
class IVDXVideoDecoder : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'v', 'd', 'e') |
|||
|
|||
virtual void * VDXAPIENTRY DecodeFrame( void *inputBuffer, data_len, is_preroll, sampleNumber, targetFrame) = 0 |
|||
virtual uint32 VDXAPIENTRY GetDecodePadding() = 0 |
|||
virtual void VDXAPIENTRY Reset() = 0 |
|||
virtual bool VDXAPIENTRY IsFrameBufferValid() = 0 |
|||
virtual VDXPixmap& VDXAPIENTRY GetFrameBuffer() = 0 |
|||
virtual bool VDXAPIENTRY SetTargetFormat(int format, useDIBAlignment) = 0 |
|||
virtual bool VDXAPIENTRY SetDecompressedFormat( VDXBITMAPINFOHEADER *pbih) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY IsDecodable(sint64 sample_num) = 0 |
|||
virtual void * VDXAPIENTRY GetFrameBufferBase() = 0 |
|||
|
|||
|
|||
enum VDXVideoFrameType |
|||
kVDXVFT_Independent, |
|||
kVDXVFT_Predicted, |
|||
kVDXVFT_Bidirectional, |
|||
kVDXVFT_Null, |
|||
|
|||
|
|||
struct VDXVideoFrameInfo |
|||
char mTypeChar |
|||
uint8 mFrameType |
|||
sint64 mBytePosition |
|||
|
|||
|
|||
struct VDXVideoSourceInfo |
|||
enum DecoderModel |
|||
kDecoderModelCustom, #/< A custom decoder model is provided. |
|||
kDecoderModelDefaultIP #/< Use the default I/P decoder model. |
|||
|
|||
|
|||
enum Flags |
|||
kFlagNone = 0, |
|||
kFlagKeyframeOnly = 0x00000001, |
|||
kFlagAll = 0xFFFFFFFF |
|||
|
|||
|
|||
public: |
|||
uint32 mFlags |
|||
uint32 mWidth |
|||
uint32 mHeight |
|||
uint8 mDecoderModel |
|||
uint8 unused[3] |
|||
|
|||
|
|||
class IVDXVideoSource : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'v', 'd', 's') |
|||
|
|||
virtual void VDXAPIENTRY GetVideoSourceInfo(VDXVideoSourceInfo& info) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY CreateVideoDecoderModel(IVDXVideoDecoderModel **) = 0 |
|||
virtual bool VDXAPIENTRY CreateVideoDecoder(IVDXVideoDecoder **) = 0 |
|||
|
|||
virtual void VDXAPIENTRY GetSampleInfo(sint64 sample_num, frameInfo) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY IsKey(sint64 sample_num) = 0 |
|||
|
|||
virtual sint64 VDXAPIENTRY GetFrameNumberForSample(sint64 sample_num) = 0 |
|||
virtual sint64 VDXAPIENTRY GetSampleNumberForFrame(sint64 frame_num) = 0 |
|||
virtual sint64 VDXAPIENTRY GetRealFrame(sint64 frame_num) = 0 |
|||
|
|||
virtual sint64 VDXAPIENTRY GetSampleBytePosition(sint64 sample_num) = 0 |
|||
|
|||
|
|||
struct VDXAudioSourceInfo |
|||
public: |
|||
uint32 mFlags |
|||
|
|||
|
|||
class IVDXAudioSource : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'a', 'd', 's') |
|||
|
|||
virtual void VDXAPIENTRY GetAudioSourceInfo(VDXAudioSourceInfo& info) = 0 |
|||
|
|||
|
|||
class IVDXInputOptions : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'i', 'o', 'p') |
|||
|
|||
virtual uint32 VDXAPIENTRY Write(void *buf, buflen) = 0 |
|||
|
|||
|
|||
class IVDXInputFile : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'i', 'f', 'l') |
|||
|
|||
virtual bool VDXAPIENTRY PromptForOptions(VDXHWND, **ppOptions) = 0 |
|||
virtual bool VDXAPIENTRY CreateOptions( void *buf, len, **ppOptions) = 0 |
|||
|
|||
virtual void VDXAPIENTRY Init( wchar_t *path, *options) = 0 |
|||
virtual bool VDXAPIENTRY Append( wchar_t *path) = 0 |
|||
|
|||
virtual void VDXAPIENTRY DisplayInfo(VDXHWND hwndParent) = 0 |
|||
|
|||
virtual bool VDXAPIENTRY GetVideoSource(int index, **ppVS) = 0 |
|||
virtual bool VDXAPIENTRY GetAudioSource(int index, **ppAS) = 0 |
|||
|
|||
|
|||
#######################################/ |
|||
# IVDXInputFileDriver |
|||
# |
|||
class IVDXInputFileDriver : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'i', 'f', 'd') |
|||
|
|||
virtual int VDXAPIENTRY DetectBySignature( void *pHeader, nHeaderSize, *pFooter, nFooterSize, nFileSize) = 0 |
|||
virtual bool VDXAPIENTRY CreateInputFile(uint32 flags, **ppFile) = 0 |
|||
|
|||
|
|||
struct VDXInputDriverContext |
|||
uint32 mAPIVersion |
|||
IVDPluginCallbacks *mpCallbacks |
|||
|
|||
|
|||
typedef bool (VDXAPIENTRY *VDXInputDriverCreateProc)( VDXInputDriverContext *pContext, **) |
|||
|
|||
struct VDXInputDriverDefinition |
|||
enum |
|||
kFlagNone = 0x00000000, |
|||
kFlagSupportsVideo = 0x00000001, |
|||
kFlagSupportsAudio = 0x00000002, |
|||
kFlagCustomSignature = 0x00010000, |
|||
kFlagAll = 0xFFFFFFFF |
|||
|
|||
uint32 mSize; # size of self structure in bytes |
|||
uint32 mFlags |
|||
sint32 mPriority |
|||
uint32 mSignatureLength |
|||
void *mpSignature |
|||
wchar_t *mpFilenameDetectPattern |
|||
wchar_t *mpFilenamePattern |
|||
wchar_t *mpDriverTagName |
|||
|
|||
VDXInputDriverCreateProc mpCreate |
|||
|
|||
|
|||
enum |
|||
# V1 (1.7.4.28204): Initial version |
|||
# V2 (1.7.5): Default I/P frame model fixed. |
|||
kVDXPlugin_InputDriverAPIVersion = 2 |
|||
|
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma pack(pop) |
|||
#endif |
|||
|
|||
#endif |
@ -0,0 +1,206 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Plugin headers |
|||
# Copyright (C) 1998-2007 Avery Lee, Rights Reserved. |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_PLUGIN_VDPLUGIN_H |
|||
#define f_VD2_PLUGIN_VDPLUGIN_H |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma once |
|||
#pragma pack(push, 8) |
|||
#endif |
|||
|
|||
#include <stddef.h> |
|||
|
|||
# Copied from <vd2/system/vdtypes.h>. Must be in sync. |
|||
#ifndef VD_STANDARD_TYPES_DECLARED |
|||
#if defined(_MSC_VER) |
|||
typedef signed __int64 sint64 |
|||
typedef unsigned __int64 uint64 |
|||
#elif defined(__GNUC__) |
|||
typedef signed long long sint64 |
|||
typedef unsigned long long uint64 |
|||
#endif |
|||
typedef signed int sint32 |
|||
typedef unsigned int uint32 |
|||
typedef signed short sint16 |
|||
typedef unsigned short uint16 |
|||
typedef signed char sint8 |
|||
typedef unsigned char uint8 |
|||
|
|||
typedef sint64 int64 |
|||
typedef sint32 int32 |
|||
typedef sint16 int16 |
|||
typedef sint8 int8 |
|||
|
|||
typedef ptrdiff_t sintptr |
|||
typedef size_t uintptr |
|||
#endif |
|||
|
|||
#ifndef VDXAPIENTRY |
|||
#define VDXAPIENTRY __stdcall |
|||
#endif |
|||
|
|||
#ifndef VDXAPIENTRYV |
|||
#define VDXAPIENTRYV __cdecl |
|||
#endif |
|||
|
|||
enum VDXCPUFeatureFlags |
|||
kVDXCPUF_CPUID = 0x00000001, |
|||
kVDXCPUF_MMX = 0x00000004, |
|||
kVDXCPUF_ISSE = 0x00000008, |
|||
kVDXCPUF_SSE = 0x00000010, |
|||
kVDXCPUF_SSE2 = 0x00000020, |
|||
kVDXCPUF_3DNOW = 0x00000040, |
|||
kVDXCPUF_3DNOW_EXT = 0x00000080, |
|||
kVDXCPUF_SSE3 = 0x00000100, |
|||
kVDXCPUF_SSSE3 = 0x00000200 |
|||
|
|||
|
|||
enum |
|||
kVDXPlugin_APIVersion = 10 |
|||
|
|||
|
|||
|
|||
enum |
|||
kVDXPluginType_Video, # Updated video filter API is not yet complete. |
|||
kVDXPluginType_Audio, |
|||
kVDXPluginType_Input |
|||
|
|||
|
|||
struct VDXPluginInfo |
|||
uint32 mSize; # size of self structure in bytes |
|||
wchar_t *mpName |
|||
wchar_t *mpAuthor |
|||
wchar_t *mpDescription |
|||
uint32 mVersion; # (major<<24) + (minor<<16) + build. 1.4.1000 would be 0x010403E8. |
|||
uint32 mType |
|||
uint32 mFlags |
|||
uint32 mAPIVersionRequired |
|||
uint32 mAPIVersionUsed |
|||
uint32 mTypeAPIVersionRequired |
|||
uint32 mTypeAPIVersionUsed |
|||
void * mpTypeSpecificInfo |
|||
|
|||
|
|||
typedef VDXPluginInfo * *(VDXAPIENTRY *tpVDXGetPluginInfo)() |
|||
|
|||
typedef VDXPluginInfo VDPluginInfo |
|||
typedef tpVDXGetPluginInfo tpVDPluginInfo |
|||
|
|||
class IVDXPluginCallbacks |
|||
public: |
|||
virtual void * VDXAPIENTRY GetExtendedAPI( char *pExtendedAPIName) = 0 |
|||
virtual void VDXAPIENTRYV SetError( char *format, ...) = 0 |
|||
virtual void VDXAPIENTRY SetErrorOutOfMemory() = 0 |
|||
virtual uint32 VDXAPIENTRY GetCPUFeatureFlags() = 0 |
|||
|
|||
|
|||
typedef IVDXPluginCallbacks IVDPluginCallbacks |
|||
|
|||
struct VDXPluginConfigEntry |
|||
enum Type |
|||
kTypeInvalid = 0, |
|||
kTypeU32 = 1, |
|||
kTypeS32, |
|||
kTypeU64, |
|||
kTypeS64, |
|||
kTypeDouble, |
|||
kTypeAStr, |
|||
kTypeWStr, |
|||
kTypeBlock |
|||
|
|||
|
|||
VDXPluginConfigEntry *next |
|||
|
|||
unsigned idx |
|||
uint32 type |
|||
wchar_t *name |
|||
wchar_t *label |
|||
wchar_t *desc |
|||
|
|||
|
|||
struct VDXPixmap |
|||
void *data |
|||
uint32 *palette |
|||
sint32 w |
|||
sint32 h |
|||
ptrdiff_t pitch |
|||
sint32 format |
|||
|
|||
# Auxiliary planes are always byte-per-pixel. |
|||
void *data2; # Cb (U) for YCbCr |
|||
ptrdiff_t pitch2 |
|||
void *data3; # Cr (V) for YCbCr |
|||
ptrdiff_t pitch3 |
|||
|
|||
|
|||
struct VDXPixmapLayout |
|||
ptrdiff_t data |
|||
uint32 *palette |
|||
sint32 w |
|||
sint32 h |
|||
ptrdiff_t pitch |
|||
sint32 format |
|||
|
|||
# Auxiliary planes are always byte-per-pixel. |
|||
ptrdiff_t data2; # Cb (U) for YCbCr |
|||
ptrdiff_t pitch2 |
|||
ptrdiff_t data3; # Cr (V) for YCbCr |
|||
ptrdiff_t pitch3 |
|||
|
|||
|
|||
namespace nsVDXPixmap |
|||
enum VDXPixmapFormat |
|||
kPixFormat_Null = 0, |
|||
kPixFormat_XRGB1555 = 5, |
|||
kPixFormat_RGB565 = 6, |
|||
kPixFormat_RGB888 = 7, |
|||
kPixFormat_XRGB8888 = 8, |
|||
kPixFormat_Y8 = 9, |
|||
kPixFormat_YUV422_UYVY = 10, |
|||
kPixFormat_YUV422_YUYV = 11, |
|||
kPixFormat_YUV444_Planar = 13, |
|||
kPixFormat_YUV422_Planar = 14, |
|||
kPixFormat_YUV420_Planar = 15, |
|||
kPixFormat_YUV411_Planar = 16, |
|||
kPixFormat_YUV410_Planar = 17 |
|||
|
|||
|
|||
|
|||
#define VDXMAKEFOURCC(a, b, c, d) ((uint32)(uint8)(d) + ((uint32)(uint8)(c) << 8) + ((uint32)(uint8)(b) << 16) + ((uint32)(uint8)(a) << 24)) |
|||
|
|||
class IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'u', 'n', 'k') |
|||
virtual int VDXAPIENTRY AddRef() = 0 |
|||
virtual int VDXAPIENTRY Release() = 0 |
|||
virtual void *VDXAPIENTRY AsInterface(uint32 iid) = 0 |
|||
|
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma pack(pop) |
|||
#endif |
|||
|
|||
#endif |
@ -0,0 +1,549 @@ |
|||
# VirtualDub - Video processing and capture application |
|||
# Plugin headers |
|||
# Copyright (C) 1998-2007 Avery Lee, Rights Reserved. |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#ifndef f_VD2_PLUGIN_VDVIDEOFILT_H |
|||
#define f_VD2_PLUGIN_VDVIDEOFILT_H |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma once |
|||
#pragma pack(push, 8) |
|||
#endif |
|||
|
|||
#include <stddef.h> |
|||
|
|||
#include "vdplugin.h" |
|||
|
|||
typedef struct VDXHINSTANCEStruct *VDXHINSTANCE |
|||
typedef struct VDXHDCStruct *VDXHDC |
|||
typedef struct VDXHWNDStruct *VDXHWND |
|||
|
|||
######### |
|||
|
|||
struct VDXScriptObject |
|||
struct VDXFilterVTbls |
|||
|
|||
######### |
|||
|
|||
enum |
|||
#/ Request distinct source and destination buffers. Otherwise, source and destination buffers |
|||
#/ alias (in-place mode). |
|||
FILTERPARAM_SWAP_BUFFERS = 0x00000001L, |
|||
|
|||
#/ Request an extra buffer for the previous source frame. |
|||
FILTERPARAM_NEEDS_LAST = 0x00000002L, |
|||
|
|||
#/ Filter supports image formats other than RGB32. Filters that support format negotiation must |
|||
#/ set self flag for all calls to paramProc. |
|||
FILTERPARAM_SUPPORTS_ALTFORMATS = 0x00000004L, |
|||
|
|||
#/ Filter requests 16 byte alignment for source and destination buffers. This guarantees that: |
|||
#/ |
|||
#/ - data and pitch fields are multiples of 16 bytes (aligned) |
|||
#/ - an integral number of 16 byte vectors may be read, if the last vector includes |
|||
#/ some bytes beyond the end of the scanline (their values are undefined) |
|||
#/ - an integral number of 16 byte vectors may be written, if the last vector includes |
|||
#/ some bytes beyong the end of the scanline (their values are ignored) |
|||
#/ |
|||
FILTERPARAM_ALIGN_SCANLINES = 0x00000008L, |
|||
|
|||
#/ Filter's output is purely a function of configuration parameters and source image data, not |
|||
#/ source or output frame numbers. In other words, output frames produced by a filter instance |
|||
#/ can be assumed to be identical images if: |
|||
#/ |
|||
#/ - the same number of source frames are prefetched |
|||
#/ - the same type of prefetches are performed (direct vs. non-direct) |
|||
#/ - the frame numbers for the two prefetch lists, in order, to identical |
|||
#/ source frames |
|||
#/ - the prefetch cookies match |
|||
#/ |
|||
#/ Enabling self flag improves the ability of the host to identify identical frames and drop them |
|||
#/ in preview or in the output file. |
|||
#/ |
|||
FILTERPARAM_PURE_TRANSFORM = 0x00000010L, |
|||
|
|||
#/ Filter cannot support the requested source format. Note that self sets all bits, the meaning |
|||
#/ of other bits is ignored. The one exception is that FILTERPARAM_SUPPORTS_ALTFORMATS is assumed |
|||
#/ to be implicitly set. |
|||
FILTERPARAM_NOT_SUPPORTED = (long)0xFFFFFFFF |
|||
|
|||
|
|||
#/ The filter has a delay from source to output. For instance, lag of 3 indicates that the |
|||
#/ filter internally buffers three frames, when it is fed frames in sequence, 0 emerges |
|||
#/ after frame 3 has been processed. The host attempts to correct timestamps in order to compensate. |
|||
#/ |
|||
#/ VirtualDub 1.9.1 or later: Setting self flag can have a performance penalty, it causes the host |
|||
#/ to request additional frames to try to produce the correct requested output frames. |
|||
#/ |
|||
#define FILTERPARAM_HAS_LAG(frames) ((int)(frames) << 16) |
|||
|
|||
#########/ |
|||
|
|||
class VDXFBitmap |
|||
class VDXFilterActivation |
|||
struct VDXFilterFunctions |
|||
struct VDXFilterModule |
|||
class IVDXVideoPrefetcher |
|||
|
|||
enum |
|||
kVDXVFEvent_None = 0, |
|||
kVDXVFEvent_InvalidateCaches = 1 |
|||
|
|||
|
|||
typedef int (__cdecl *VDXFilterInitProc )(VDXFilterActivation *fa, *ff) |
|||
typedef void (__cdecl *VDXFilterDeinitProc )(VDXFilterActivation *fa, *ff) |
|||
typedef int (__cdecl *VDXFilterRunProc )( VDXFilterActivation *fa, *ff) |
|||
typedef long (__cdecl *VDXFilterParamProc )(VDXFilterActivation *fa, *ff) |
|||
typedef int (__cdecl *VDXFilterConfigProc )(VDXFilterActivation *fa, *ff, hWnd) |
|||
typedef void (__cdecl *VDXFilterStringProc )( VDXFilterActivation *fa, *ff, *buf) |
|||
typedef int (__cdecl *VDXFilterStartProc )(VDXFilterActivation *fa, *ff) |
|||
typedef int (__cdecl *VDXFilterEndProc )(VDXFilterActivation *fa, *ff) |
|||
typedef bool (__cdecl *VDXFilterScriptStrProc)(VDXFilterActivation *fa, *, *, int) |
|||
typedef void (__cdecl *VDXFilterStringProc2 )( VDXFilterActivation *fa, *ff, *buf, maxlen) |
|||
typedef int (__cdecl *VDXFilterSerialize )(VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
typedef void (__cdecl *VDXFilterDeserialize )(VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
typedef void (__cdecl *VDXFilterCopy )(VDXFilterActivation *fa, *ff, *dst) |
|||
typedef sint64 (__cdecl *VDXFilterPrefetch )( VDXFilterActivation *fa, *ff, frame) |
|||
typedef void (__cdecl *VDXFilterCopy2Proc )(VDXFilterActivation *fa, *ff, *dst, *fa2, *ff2) |
|||
typedef bool (__cdecl *VDXFilterPrefetch2Proc)( VDXFilterActivation *fa, *ff, frame, *prefetcher) |
|||
typedef bool (__cdecl *VDXFilterEventProc )( VDXFilterActivation *fa, *ff, event, *eventData) |
|||
|
|||
typedef int (__cdecl *VDXFilterModuleInitProc)(VDXFilterModule *fm, *ff, vdfd_ver, vdfd_compat) |
|||
typedef void (__cdecl *VDXFilterModuleDeinitProc)(VDXFilterModule *fm, *ff) |
|||
|
|||
##### |
|||
|
|||
typedef void (__cdecl *VDXFilterPreviewButtonCallback)(bool fNewState, *pData) |
|||
typedef void (__cdecl *VDXFilterPreviewSampleCallback)(VDXFBitmap *, lFrame, lCount, *pData) |
|||
|
|||
class IVDXFilterPreview |
|||
public: |
|||
virtual void SetButtonCallback(VDXFilterPreviewButtonCallback, *)=0 |
|||
virtual void SetSampleCallback(VDXFilterPreviewSampleCallback, *)=0 |
|||
|
|||
virtual bool isPreviewEnabled()=0 |
|||
virtual void Toggle(VDXHWND)=0 |
|||
virtual void Display(VDXHWND, bool)=0 |
|||
virtual void RedoFrame()=0 |
|||
virtual void RedoSystem()=0 |
|||
virtual void UndoSystem()=0 |
|||
virtual void InitButton(VDXHWND)=0 |
|||
virtual void Close()=0 |
|||
virtual bool SampleCurrentFrame()=0 |
|||
virtual long SampleFrames()=0 |
|||
|
|||
|
|||
class IVDXFilterPreview2 : public IVDXFilterPreview |
|||
public: |
|||
virtual bool IsPreviewDisplayed() = 0 |
|||
|
|||
|
|||
class IVDXVideoPrefetcher : public IVDXUnknown |
|||
public: |
|||
enum { kIID = VDXMAKEFOURCC('X', 'v', 'p', 'f') |
|||
|
|||
#/ Request a video frame fetch from an upstream source. |
|||
virtual void VDXAPIENTRY PrefetchFrame(sint32 srcIndex, frame, cookie) = 0 |
|||
|
|||
#/ Request a video frame fetch from an upstream source in direct mode. |
|||
#/ This specifies that the output frame is the same as the input frame. |
|||
#/ There cannot be more than one direct fetch and there must be no standard |
|||
#/ fetches at the same time. There can, however, symbolic fetches. |
|||
virtual void VDXAPIENTRY PrefetchFrameDirect(sint32 srcIndex, frame) = 0 |
|||
|
|||
#/ Request a symbolic fetch from a source. This does not actually fetch |
|||
#/ any frames, marks an association from source to output. This is |
|||
#/ useful for indicating the approximate center of where an output derives |
|||
#/ in a source, if those frames aren't fetched (perhaps due to caching). |
|||
#/ There may be either zero or one symbolic fetch per source. |
|||
#/ |
|||
#/ If no symbolic fetches are performed, symbolic frame is assumed to |
|||
#/ be the rounded mean of the fetched source frames. |
|||
virtual void VDXAPIENTRY PrefetchFrameSymbolic(sint32 srcIndex, frame) = 0 |
|||
|
|||
|
|||
##### |
|||
|
|||
enum |
|||
# This is the highest API version supported by self header file. |
|||
VIRTUALDUB_FILTERDEF_VERSION = 14, |
|||
|
|||
# This is the absolute lowest API version supported by self header file. |
|||
# Note that V4 is rather old, to VirtualDub 1.2. |
|||
# Chances are you will need to declare a higher version. |
|||
VIRTUALDUB_FILTERDEF_COMPATIBLE = 4, |
|||
|
|||
# API V9 is a slightly saner baseline, it is the first API |
|||
# version that has copy constructor support. You may still need to |
|||
# declare a higher vdfd_compat version in your module init if you |
|||
# need features beyond V9 (VirtualDub 1.4.12). |
|||
VIRTUALDUB_FILTERDEF_COMPATIBLE_COPYCTOR = 9 |
|||
|
|||
|
|||
|
|||
# v3: added lCurrentSourceFrame to FrameStateInfo |
|||
# v4 (1.2): lots of additions (VirtualDub 1.2) |
|||
# v5 (1.3d): lots of bugfixes - stretchblt bilinear, non-zero startproc |
|||
# v6 (1.4): added error handling functions |
|||
# v7 (1.4d): added frame lag, handling |
|||
# v8 (1.4.11): added string2 proc |
|||
# v9 (1.4.12): added (working) copy constructor |
|||
# v10 (1.5.10): added preview flag |
|||
# v11 (1.7.0): guaranteed src structure setup before configProc; added IVDFilterPreview2 |
|||
# v12 (1.8.0): support for frame alteration |
|||
# v13 (1.8.2): added mOutputFrame field to VDXFilterStateInfo |
|||
# v14 (1.9.1): added copyProc2, prefetchProc2, input/output frame arrays |
|||
|
|||
struct VDXFilterDefinition |
|||
void *_next; # deprecated - set to NULL |
|||
void *_prev; # deprecated - set to NULL |
|||
void *_module; # deprecated - set to NULL |
|||
|
|||
char * name |
|||
char * desc |
|||
char * maker |
|||
void * private_data |
|||
int inst_data_size |
|||
|
|||
VDXFilterInitProc initProc |
|||
VDXFilterDeinitProc deinitProc |
|||
VDXFilterRunProc runProc |
|||
VDXFilterParamProc paramProc |
|||
VDXFilterConfigProc configProc |
|||
VDXFilterStringProc stringProc |
|||
VDXFilterStartProc startProc |
|||
VDXFilterEndProc endProc |
|||
|
|||
VDXScriptObject *script_obj |
|||
|
|||
VDXFilterScriptStrProc fssProc |
|||
|
|||
# NEW - 1.4.11 |
|||
VDXFilterStringProc2 stringProc2 |
|||
VDXFilterSerialize serializeProc |
|||
VDXFilterDeserialize deserializeProc |
|||
VDXFilterCopy copyProc |
|||
|
|||
VDXFilterPrefetch prefetchProc; # (V12/V1.7.4+) |
|||
|
|||
# NEW - V14 / 1.9.1 |
|||
VDXFilterCopy2Proc copyProc2 |
|||
VDXFilterPrefetch2Proc prefetchProc2 |
|||
VDXFilterEventProc eventProc |
|||
|
|||
|
|||
##### |
|||
|
|||
# FilterStateInfo: contains dynamic info about file being processed |
|||
|
|||
class VDXFilterStateInfo |
|||
public: |
|||
sint32 lCurrentFrame; # current sequence frame (previously called output frame) |
|||
sint32 lMicrosecsPerFrame; # microseconds per sequence frame |
|||
sint32 lCurrentSourceFrame; # current source frame |
|||
sint32 lMicrosecsPerSrcFrame; # microseconds per source frame |
|||
sint32 lSourceFrameMS; # source frame timestamp |
|||
sint32 lDestFrameMS; # output frame timestamp |
|||
|
|||
enum |
|||
kStateNone = 0x00000000, |
|||
kStatePreview = 0x00000001, # (V1.5.10+) Job output is not being saved to disk. |
|||
kStateRealTime = 0x00000002, # (V1.5.10+) Operation is running in real-time (capture, playback). |
|||
kStateMax = 0xFFFFFFFF |
|||
|
|||
|
|||
uint32 flags; # (V10 / 1.5.10+ only) |
|||
|
|||
sint32 mOutputFrame; # (V13/V1.8.2+) current output frame |
|||
|
|||
|
|||
# VDXFBitmap: VBitmap extended to hold filter-specific information |
|||
|
|||
class VDXBitmap |
|||
public: |
|||
void * _vtable; # Reserved - do not use. |
|||
uint32 * data; # Pointer to start of _bottom-most_ scanline of plane 0. |
|||
uint32 * palette; # Pointer to palette (reserved - set to NULL). |
|||
sint32 depth; # Bit depth, bits. Set to zero if mpPixmap/mpPixmapLayout are active. |
|||
sint32 w; # Width of bitmap, pixels. |
|||
sint32 h; # Height of bitmap, pixels. |
|||
ptrdiff_t pitch; # Distance, bytes, the start of one scanline in plane 0 to the next. |
|||
ptrdiff_t modulo; # Distance, bytes, the end of one scanline in plane 0 to the start of the next. |
|||
ptrdiff_t size; # Size of plane 0, padding. |
|||
ptrdiff_t offset; # Offset from beginning of buffer to beginning of plane 0. |
|||
|
|||
uint32 *Address32(int x, y) |
|||
return Address32i(x, h-y-1) |
|||
|
|||
|
|||
uint32 *Address32i(int x, y) |
|||
return (uint32 *)((char *)data + y*pitch + x*4) |
|||
|
|||
|
|||
void AlignTo4() |
|||
pitch = w << 2 |
|||
|
|||
|
|||
void AlignTo8() |
|||
pitch = ((w+1)&~1) << 2 |
|||
|
|||
|
|||
|
|||
class VDXFBitmap : public VDXBitmap |
|||
public: |
|||
enum |
|||
#/ Set in paramProc if the filter requires a Win32 GDI display context |
|||
#/ for a bitmap. (Deprecated as of API V12 - do not use) |
|||
NEEDS_HDC = 0x00000001L, |
|||
|
|||
|
|||
uint32 dwFlags |
|||
VDXHDC hdc |
|||
|
|||
uint32 mFrameRateHi; # Frame rate numerator (V1.7.4+) |
|||
uint32 mFrameRateLo; # Frame rate denominator (V1.7.4+) |
|||
sint64 mFrameCount; # Frame count; -1 if unlimited or indeterminate (V1.7.4+) |
|||
|
|||
VDXPixmapLayout *mpPixmapLayout |
|||
VDXPixmap *mpPixmap |
|||
|
|||
uint32 mAspectRatioHi; #/< Pixel aspect ratio fraction (numerator). 0/0 = unknown |
|||
uint32 mAspectRatioLo; #/< Pixel aspect ratio fraction (denominator). |
|||
|
|||
sint64 mFrameNumber; #/< Current frame number (zero based). |
|||
sint64 mFrameTimestampStart; #/< Starting timestamp of frame, 100ns units. |
|||
sint64 mFrameTimestampEnd; #/< Ending timestamp of frame, 100ns units. |
|||
sint64 mCookie; #/< Cookie supplied when frame was requested. |
|||
|
|||
|
|||
# VDXFilterActivation: This is what is actually passed to filters at runtime. |
|||
|
|||
class VDXFilterActivation |
|||
public: |
|||
VDXFilterDefinition *filter; # |
|||
void *filter_data |
|||
VDXFBitmap& dst |
|||
VDXFBitmap& src |
|||
VDXFBitmap *_reserved0 |
|||
VDXFBitmap * last |
|||
uint32 x1 |
|||
uint32 y1 |
|||
uint32 x2 |
|||
uint32 y2 |
|||
|
|||
VDXFilterStateInfo *pfsi |
|||
IVDXFilterPreview *ifp |
|||
IVDXFilterPreview2 *ifp2; # (V11+) |
|||
|
|||
uint32 mSourceFrameCount; # (V14+) |
|||
VDXFBitmap * *mpSourceFrames; # (V14+) |
|||
VDXFBitmap * *mpOutputFrames; # (V14+) |
|||
|
|||
|
|||
# These flags must match those in cpuaccel.h! |
|||
|
|||
#ifndef f_VIRTUALDUB_CPUACCEL_H |
|||
#define CPUF_SUPPORTS_CPUID (0x00000001L) |
|||
#define CPUF_SUPPORTS_FPU (0x00000002L) |
|||
#define CPUF_SUPPORTS_MMX (0x00000004L) |
|||
#define CPUF_SUPPORTS_INTEGER_SSE (0x00000008L) |
|||
#define CPUF_SUPPORTS_SSE (0x00000010L) |
|||
#define CPUF_SUPPORTS_SSE2 (0x00000020L) |
|||
#define CPUF_SUPPORTS_3DNOW (0x00000040L) |
|||
#define CPUF_SUPPORTS_3DNOW_EXT (0x00000080L) |
|||
#endif |
|||
|
|||
struct VDXFilterFunctions |
|||
VDXFilterDefinition *(__cdecl *addFilter)(VDXFilterModule *, *, fd_len) |
|||
void (__cdecl *removeFilter)(VDXFilterDefinition *) |
|||
bool (__cdecl *isFPUEnabled)() |
|||
bool (__cdecl *isMMXEnabled)() |
|||
void (__cdecl *InitVTables)(VDXFilterVTbls *) |
|||
|
|||
# These functions permit you to throw MyError exceptions from a filter. |
|||
# YOU MUST ONLY CALL THESE IN runProc, initProc, startProc. |
|||
|
|||
void (__cdecl *ExceptOutOfMemory)(); # ADDED: V6 (VirtualDub 1.4) |
|||
void (__cdecl *Except)( char *format, ...); # ADDED: V6 (VirtualDub 1.4) |
|||
|
|||
# These functions are callable at any time. |
|||
|
|||
long (__cdecl *getCPUFlags)(); # ADDED: V6 (VirtualDub 1.4) |
|||
long (__cdecl *getHostVersionInfo)(char *buffer, len); # ADDED: V7 (VirtualDub 1.4d) |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
#####################################/ |
|||
|
|||
class VDXScriptValue |
|||
class VDXScriptError |
|||
struct VDXScriptObject |
|||
|
|||
class VDXScriptError |
|||
public: |
|||
enum |
|||
PARSE_ERROR=1, |
|||
SEMICOLON_EXPECTED, |
|||
IDENTIFIER_EXPECTED, |
|||
|
|||
TYPE_INT_REQUIRED, |
|||
TYPE_ARRAY_REQUIRED, |
|||
TYPE_FUNCTION_REQUIRED, |
|||
TYPE_OBJECT_REQUIRED, |
|||
|
|||
OBJECT_MEMBER_NAME_REQUIRED, |
|||
FUNCCALLEND_EXPECTED, |
|||
TOO_MANY_PARAMS, |
|||
DIVIDE_BY_ZERO, |
|||
VAR_NOT_FOUND, |
|||
MEMBER_NOT_FOUND, |
|||
OVERLOADED_FUNCTION_NOT_FOUND, |
|||
IDENT_TOO_LONG, |
|||
OPERATOR_EXPECTED, |
|||
CLOSEPARENS_EXPECTED, |
|||
CLOSEBRACKET_EXPECTED, |
|||
|
|||
VAR_UNDEFINED, |
|||
|
|||
OUT_OF_STRING_SPACE, |
|||
OUT_OF_MEMORY, |
|||
INTERNAL_ERROR, |
|||
EXTERNAL_ERROR, |
|||
|
|||
FCALL_OUT_OF_RANGE, |
|||
FCALL_INVALID_PTYPE, |
|||
FCALL_UNKNOWN_STR, |
|||
|
|||
ARRAY_INDEX_OUT_OF_BOUNDS, |
|||
|
|||
NUMERIC_OVERFLOW, |
|||
STRING_NOT_AN_INTEGER_VALUE, |
|||
STRING_NOT_A_REAL_VALUE, |
|||
|
|||
ASSERTION_FAILED, |
|||
AMBIGUOUS_CALL, |
|||
CANNOT_CAST |
|||
|
|||
|
|||
|
|||
class IVDXScriptInterpreter |
|||
public: |
|||
virtual void _placeholder1() { |
|||
virtual void _placeholder2(void *, *) { |
|||
virtual void _placeholder3(char *s) { |
|||
|
|||
virtual void ScriptError(int e)=0 |
|||
virtual void _placeholder4(VDXScriptError& cse) { |
|||
virtual char** AllocTempString(long l)=0 |
|||
|
|||
virtual void _placeholder5() { |
|||
|
|||
|
|||
#define EXT_SCRIPT_ERROR(x) (isi.ScriptError((VDXScriptError.x))) |
|||
|
|||
typedef VDXScriptValue (*VDXScriptFunctionPtr)(IVDXScriptInterpreter *, *, *, int) |
|||
typedef void (*VDXScriptVoidFunctionPtr)(IVDXScriptInterpreter *, *, *, int) |
|||
typedef int (*VDXScriptIntFunctionPtr)(IVDXScriptInterpreter *, *, *, int) |
|||
|
|||
struct VDXScriptFunctionDef |
|||
VDXScriptFunctionPtr func_ptr |
|||
char *name |
|||
char *arg_list |
|||
|
|||
|
|||
struct VDXScriptObject |
|||
void *_lookup; # reserved - set to NULL |
|||
VDXScriptFunctionDef *func_list |
|||
void *_obj_list; # reserved - set to NULL |
|||
|
|||
|
|||
class VDXScriptValue |
|||
public: |
|||
enum { T_VOID, T_INT, T_PINT, T_STR, T_ARRAY, T_OBJECT, T_FNAME, T_FUNCTION, T_VARLV, T_LONG, T_DOUBLE } type |
|||
VDXScriptObject *thisPtr |
|||
union |
|||
int i |
|||
char **s |
|||
sint64 l |
|||
double d |
|||
} u |
|||
|
|||
VDXScriptValue() |
|||
type = T_VOID |
|||
|
|||
VDXScriptValue(int i) |
|||
type = T_INT |
|||
u.i = i |
|||
|
|||
VDXScriptValue(sint64 l) |
|||
type = T_LONG |
|||
u.l = l |
|||
|
|||
VDXScriptValue(double d) |
|||
type = T_DOUBLE |
|||
u.d = d |
|||
|
|||
VDXScriptValue(char **s) |
|||
type = T_STR |
|||
u.s = s |
|||
|
|||
|
|||
bool isVoid() |
|||
return type == T_VOID |
|||
|
|||
bool isInt() |
|||
return type == T_INT |
|||
|
|||
bool isString() |
|||
return type == T_STR |
|||
|
|||
bool isLong() |
|||
return type == T_LONG |
|||
|
|||
bool isDouble() |
|||
return type == T_DOUBLE |
|||
|
|||
|
|||
int asInt() |
|||
return u.i |
|||
|
|||
sint64 asLong() |
|||
return u.l |
|||
|
|||
double asDouble() |
|||
return u.d |
|||
|
|||
char ** asString() |
|||
return u.s |
|||
|
|||
|
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma pack(pop) |
|||
#endif |
|||
|
|||
#endif |
@ -0,0 +1,127 @@ |
|||
#ifndef f_VD2_PLUGIN_VDVIDEOUTIL_H |
|||
#define f_VD2_PLUGIN_VDVIDEOUTIL_H |
|||
|
|||
template<class T> |
|||
T *vd_ptroffset(T *p, diff) |
|||
return (T *)((char *)p + diff) |
|||
|
|||
|
|||
template<class T> |
|||
class vd_row_iter |
|||
public: |
|||
vd_row_iter() { |
|||
vd_row_iter(T *p, pitch) : mp(p), mpitch(pitch) { |
|||
vd_row_iter(T *p, pitch, y) : mp(vd_ptroffset(p, pitch*y)), mpitch(pitch) { |
|||
|
|||
vd_row_iter( VFBitmap& bm, x = 0, y = 0) : mp(vd_ptroffset((T*)bm.data, bm.pitch*(bm.h - 1 - y))+x), mpitch(-bm.pitch) { |
|||
|
|||
operator T*() |
|||
return mp |
|||
|
|||
T& operator[](int x) |
|||
return mp[x] |
|||
|
|||
|
|||
void mulstep(int x) |
|||
mpitch *= x |
|||
|
|||
|
|||
vd_row_iter<T>& operator+=(int y) |
|||
mp = vd_ptroffset(mp, * y) |
|||
return *self |
|||
|
|||
|
|||
vd_row_iter<T>& operator-=(int y) |
|||
mp = vd_ptroffset(mp, -(mpitch * y)) |
|||
return *self |
|||
|
|||
|
|||
vd_row_iter<T>& operator++() |
|||
mp = vd_ptroffset(mp, mpitch) |
|||
return *self |
|||
|
|||
|
|||
vd_row_iter<T> operator++(int) |
|||
vd_row_iter<T> temp(*self) |
|||
mp = vd_ptroffset(mp, mpitch) |
|||
return temp |
|||
|
|||
|
|||
vd_row_iter<T>& operator--() |
|||
mp = vd_ptroffset(mp, -mpitch) |
|||
return *self |
|||
|
|||
|
|||
vd_row_iter<T> operator--(int) |
|||
vd_row_iter<T> temp(*self) |
|||
mp = vd_ptroffset(mp, -mpitch) |
|||
return temp |
|||
|
|||
|
|||
protected: |
|||
T *mp |
|||
ptrdiff_t mpitch |
|||
|
|||
|
|||
typedef vd_row_iter<uint32> vd_pixrow_iter |
|||
|
|||
inline uint32 vd_pixavg_down(uint32 x, y) |
|||
return (x&y) + (((x^y)&0xfefefefe)>>1) |
|||
|
|||
|
|||
inline uint32 vd_pixavg_up(uint32 x, y) |
|||
return (x|y) - (((x^y)&0xfefefefe)>>1) |
|||
|
|||
|
|||
inline void vd_pixunpack(uint32 px, r, g, b) |
|||
r = (px>>16)&255 |
|||
g = (px>> 8)&255 |
|||
b = (px )&255 |
|||
|
|||
|
|||
inline uint32 vd_pixpack(int r, g, b) |
|||
if ((unsigned)r >= 256) r = ~(r>>31) & 255 |
|||
if ((unsigned)g >= 256) g = ~(g>>31) & 255 |
|||
if ((unsigned)b >= 256) b = ~(b>>31) & 255 |
|||
|
|||
return (r<<16) + (g<<8) + b |
|||
|
|||
|
|||
inline uint32 vd_pixpackfast(int r, g, b) |
|||
return (r<<16) + (g<<8) + b |
|||
|
|||
|
|||
struct vd_transform_pixmap_helper |
|||
vd_transform_pixmap_helper( VFBitmap& dst) |
|||
: p((uint32 *)dst.data) |
|||
, pitch(dst.pitch) |
|||
, w(dst.w) |
|||
, h(dst.h) { |
|||
|
|||
operator bool() |
|||
return False |
|||
|
|||
|
|||
uint32 *p |
|||
ptrdiff_t pitch |
|||
int w, h |
|||
|
|||
|
|||
#define vd_transform_pixmap_blt(dst, src) \ |
|||
if(dstinfo = dst);else \ |
|||
if(srcinfo = src);else \ |
|||
for(y = 0, h = dstinfo.h, w = dstinfo.w; y < h; ++y, dstinfo.p=vd_ptroffset(dstinfo.p, dstinfo.pitch), srcinfo.p=vd_ptroffset(srcinfo.p, srcinfo.pitch)) \ |
|||
for(x = 0; x < dstinfo.w; ++x) \ |
|||
switch(out = dstinfo.p[x]) case 0: default: \ |
|||
switch( in = srcinfo.p[x]) case 0: default: |
|||
|
|||
#define vd_transform_pixmap_inplace(dst) \ |
|||
if(dstinfo = dst);else \ |
|||
for(y = 0, h = dstinfo.h, w = dstinfo.w; y < h; ++y, dstinfo.p=vd_ptroffset(dstinfo.p, dstinfo.pitch)) \ |
|||
for(x = 0; x < dstinfo.w; ++x) \ |
|||
switch(px = dstinfo.p[x]) case 0: default: \ |
|||
|
|||
#define vd_maketable256_16(x) formula((x+0)),formula((x+1)),formula((x+2)),formula((x+3)),formula((x+4)),formula((x+5)),formula((x+6)),formula((x+7)),formula((x+8)),formula((x+9)),formula((x+10)),formula((x+11)),formula((x+12)),formula((x+13)),formula((x+14)),formula((x+15)) |
|||
#define vd_maketable256 vd_maketable256_16(0x00),vd_maketable256_16(0x10),vd_maketable256_16(0x20),vd_maketable256_16(0x30),vd_maketable256_16(0x40),vd_maketable256_16(0x50),vd_maketable256_16(0x60),vd_maketable256_16(0x70),vd_maketable256_16(0x80),vd_maketable256_16(0x90),vd_maketable256_16(0xA0),vd_maketable256_16(0xB0),vd_maketable256_16(0xC0),vd_maketable256_16(0xD0),vd_maketable256_16(0xE0),vd_maketable256_16(0xF0), |
|||
|
|||
#endif |
@ -0,0 +1,144 @@ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
''' |
|||
Compile thusly: |
|||
cc -o yuv2ppm yuv2ppm.c |
|||
''' |
|||
''' example.ppm |
|||
P3 |
|||
# feep.ppm |
|||
4 4 |
|||
15 |
|||
0 0 0 0 0 0 0 0 0 15 0 15 |
|||
0 0 0 0 15 7 0 0 0 0 0 0 |
|||
0 0 0 0 0 0 0 15 7 0 0 0 |
|||
15 0 15 0 0 0 0 0 0 0 0 0 |
|||
''' |
|||
''' |
|||
Use "P6" for binary data, or "P3" for ascii data. |
|||
''' |
|||
def make_outfile(self, *outfile, *infile): int i |
|||
for(i=0; infile[i]; i++) |
|||
outfile[i] = infile[i] |
|||
outfile[i++] = '.' |
|||
outfile[i++] = 'p' |
|||
outfile[i++] = 'p' |
|||
outfile[i++] = 'm' |
|||
outfile[i++] = 0 |
|||
return 0 |
|||
|
|||
|
|||
def yuv2rgb(self, y, u, v): unsigned int pixel32 |
|||
unsigned char *pixel = (unsigned char *)&pixel32 |
|||
int r, g, b |
|||
#if 0 |
|||
''' |
|||
One formula I found: (not the right one) |
|||
R = 1.164(Y - 16) + 1.596(Cr - 128) |
|||
G = 1.164(Y - 16) - 0.813(Cr - 128) - 0.391(Cb - 128) |
|||
B = 1.164(Y - 16) + 2.018(Cb - 128) |
|||
''' |
|||
r = (1.164 * (y - 16)) |
|||
+ (2.018 * (v - 128)) |
|||
g = (1.164 * (y - 16)) |
|||
- (0.813 * (u - 128)) |
|||
- (0.391 * (v - 128)) |
|||
b = (1.164 * (y - 16)) |
|||
+ (1.596 * (u - 128)) |
|||
#else: |
|||
''' |
|||
Another formula I found: (seems to work) |
|||
R = Y + 1.370705 (V-128) |
|||
G = Y - 0.698001 (V-128) - 0.337633 (U-128) |
|||
B = Y + 1.732446 (U-128) |
|||
''' |
|||
r = y + (1.370705 * (v-128)) |
|||
g = y - (0.698001 * (v-128)) - (0.337633 * (u-128)) |
|||
b = y + (1.732446 * (u-128)) |
|||
#endif |
|||
# Even with proper conversion, values still need clipping. |
|||
if (r > 255) r = 255 |
|||
if (g > 255) g = 255 |
|||
if (b > 255) b = 255 |
|||
if (r < 0) r = 0 |
|||
if (g < 0) g = 0 |
|||
if (b < 0) b = 0 |
|||
# Values only go from 0-220.. Why? |
|||
pixel[0] = r * 220 / 256 |
|||
pixel[1] = g * 220 / 256 |
|||
pixel[2] = b * 220 / 256 |
|||
pixel[3] = 0 |
|||
''' Debug |
|||
printf("yuv2rgb(%i, %i, %i) . %i, %i, %i (0x%x)\n", |
|||
y, u, v, |
|||
pixel[0], pixel[1], pixel[2], |
|||
pixel32) |
|||
''' |
|||
return pixel32 |
|||
|
|||
|
|||
def yuv2ppm(self, *infile, *outfile): FILE *in, *out |
|||
int i |
|||
unsigned int pixel_16 |
|||
unsigned char pixel_24[3] |
|||
unsigned int pixel32 |
|||
int y, u, v, y2 |
|||
char *ppmheader = "P6\n# Generated by yuv2ppm\n720 486\n255\n" |
|||
in = fopen(infile, "rb") |
|||
out = fopen(outfile, "wb") |
|||
if (not in or not out) return 0 |
|||
fprintf(out, ppmheader) |
|||
for(i=0; i<720*486/2; i++) |
|||
fread(&pixel_16, 4, 1, in) |
|||
pixel_24[0] = pixel_24[1] = pixel_24[2] = 0 |
|||
u = ((pixel_16 & 0x000000ff)) |
|||
y = ((pixel_16 & 0x0000ff00)>>8) |
|||
v = ((pixel_16 & 0x00ff0000)>>16) |
|||
y2 = ((pixel_16 & 0xff000000)>>24) |
|||
pixel32 = yuv2rgb(y, u, v) |
|||
pixel_24[0] = (pixel32 & 0x000000ff) |
|||
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8 |
|||
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16 |
|||
# For binary PPM |
|||
fwrite(pixel_24, 3, 1, out) |
|||
# For ascii PPM |
|||
#fprintf(out, "%i %i %i\n", |
|||
# pixel_24[0], |
|||
# pixel_24[1], |
|||
# pixel_24[2]) |
|||
pixel32 = yuv2rgb(y2, u, v) |
|||
pixel_24[0] = (pixel32 & 0x000000ff) |
|||
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8 |
|||
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16 |
|||
# For binary PPM |
|||
fwrite(pixel_24, 3, 1, out) |
|||
# For ascii PPM |
|||
#fprintf(out, "%i %i %i\n", |
|||
# pixel_24[0], |
|||
# pixel_24[1], |
|||
# pixel_24[2]) |
|||
|
|||
fclose(in) |
|||
fclose(out) |
|||
return 1 |
|||
|
|||
|
|||
def main(self, argc, **argv): char *infile, outfile[256] |
|||
int i |
|||
int success |
|||
for(i=1; i<argc; i++) |
|||
success = 0 |
|||
infile = argv[i] |
|||
make_outfile(outfile, infile) |
|||
printf("%s . %s... ", infile, outfile) |
|||
fflush(stdout) |
|||
success = yuv2ppm(infile, outfile) |
|||
if success: |
|||
printf("Done.\n") |
|||
|
|||
else: |
|||
printf("Failed. Aborting.\n") |
|||
return 1 |
|||
|
|||
|
|||
return 0 |
@ -0,0 +1,21 @@ |
|||
#{{NO_DEPENDENCIES} |
|||
# Microsoft Visual C++ generated include file. |
|||
# Used by SpatialForegroundRemover.rc |
|||
# |
|||
#define IDCANCEL2 3 |
|||
#define IDC_PREVIEW 3 |
|||
#define IDD_FILTER_SPATIALFOREGROUNDREMOVER 101 |
|||
#define IDC_REACH 1001 |
|||
#define IDC_RADIALSAMPLES 1002 |
|||
#define IDC_DIFFUSION 1003 |
|||
|
|||
# Next default values for objects |
|||
# |
|||
#ifdef APSTUDIO_INVOKED |
|||
#ifndef APSTUDIO_READONLY_SYMBOLS |
|||
#define _APS_NEXT_RESOURCE_VALUE 102 |
|||
#define _APS_NEXT_COMMAND_VALUE 40001 |
|||
#define _APS_NEXT_CONTROL_VALUE 1002 |
|||
#define _APS_NEXT_SYMED_VALUE 101 |
|||
#endif |
|||
#endif |
File diff suppressed because it is too large
@ -0,0 +1,60 @@ |
|||
#ifndef COLORSPACETRANSFORM_H |
|||
#define COLORSPACETRANSFORM_H |
|||
|
|||
#include <cstdio> |
|||
#include <cstdlib> #rand etc |
|||
#include <string> |
|||
#include <iostream> |
|||
#include <climits> #<limits.h> |
|||
|
|||
##define CT_TESTLIMITS |
|||
|
|||
#include "frameworkdummy.h" |
|||
#include "preporting.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
char c255=(char)255 |
|||
extern float YCToRgb_fMaxY |
|||
extern float YCToRgb_fMaxU |
|||
extern float YCToRgb_fMaxV |
|||
extern float YCToRgb_fMinY |
|||
extern float YCToRgb_fMinU |
|||
extern float YCToRgb_fMinV |
|||
extern float RgbToYC_fMaxY |
|||
extern float RgbToYC_fMaxU |
|||
extern float RgbToYC_fMaxV |
|||
extern float RgbToYC_fMinY |
|||
extern float RgbToYC_fMinU |
|||
extern float RgbToYC_fMinV |
|||
extern float YCToRgb_byMaxR |
|||
extern float YCToRgb_byMaxG |
|||
extern float YCToRgb_byMaxB |
|||
extern float YCToRgb_byMinR |
|||
extern float YCToRgb_byMinB |
|||
extern float YCToRgb_byMinG |
|||
#class CONVERT_FAKESTATIC_CLASS#public: |
|||
# static byte ToByte(float val) |
|||
# static byte ToByte(double val) |
|||
# static char ToChar8(float val) |
|||
# static char ToChar8(double val) |
|||
# |
|||
def GetCurrentOrPrevFrameFor(self, sAnyFrameFile, iFrame): |
|||
def IsDigit(self, val): |
|||
#void YUV4xxSubsampledPlanarToYUV444NonPlanar(unsigned char* dest, bAddDestAlpha, char* source, char* source_Stride, int source_J, int source_a, int source_b, int w, int h) |
|||
#void RgbToYC(byte &Y, &U, &V, r, g, b) |
|||
def RgbToYC(self, char &Y, char &U, char &V, char r, char g, char b): |
|||
#void YCToRgb(byte &r, &g, &b, Y, U, V) |
|||
def YCToRgb(self, char &r, char &g, char &b, char Y, char U, char V): |
|||
def YUV444NonPlanarToRGB(self, char* dest, bDestHasAlphaChannel, bSetDestAlphaTo255_IgnoredIfNoDestAlpha, char* source, int iPixels): |
|||
void CopySurface_BitdepthSensitive(unsigned char* dest, int dest_BytesPP, int dest_Stride, char* source, int source_BytesPP, int source_Stride, int w, int h); # void CopySurface_BitdepthSensitive(unsigned char* dest, int dest_BytesPP, char* source, int source_BytesPP, int iTotalPixels) |
|||
def CopyPlaneToNonPlanar(self, char* dest, int DestChannelIndex, int dest_BytesPP, char* source, int source_Stride, int w, int h, bSamplesOnSecondLineOfSource): |
|||
def CopyNonPlanarToPlane(self, char* dest, int dest_Stride, bSamplesOnSecondLineOfDest, char* source, int SourceChannelIndex, int source_BytesPP, int w, int h): |
|||
def SaveRaw(self, sFile, char* buffer, iBytes): |
|||
def Heal_ToNearestPixel(self, char* dest, int dest_BytesPP, int dest_Stride, char* mask, int mask_BytesPP, int mask_Stride, int mask_Channel, int w, int h, rReachMultiplier_UNUSED, rRadialSampleSpacing_UNUSED, rDiffusionMultiplier): |
|||
def Heal_WithAveraging_Permutations(self, char* dest0, int dest_BytesPP, int dest_Stride, char* mask0, int mask_BytesPP, int mask_Stride, int mask_Channel, int w, int h, rReachMultiplier, rRadialSampleSpacing, rDiffusionMultiplier, bHorizonalSearch, bVerticalSearch): |
|||
def Diffuse(self, char* dest0, int dest_w, int dest_h, int dest_BytesPP, int dest_Stride, at_x, at_y, char* brush0, int brush_w, int brush_y, int brush_BytesPP, int brush_Stride, int brush_Channel, iPixelsRadius, bRandom): |
|||
def Heal_WithAveraging_Sequential(self, char* dest, int dest_BytesPP, int dest_Stride, char* mask, int mask_BytesPP, int mask_Stride, int mask_Channel, int w, int h, rReachMultiplier, rRadialSampleSpacing, rDiffusionMultiplier): |
|||
}#end namespace |
|||
#endif |
@ -0,0 +1,20 @@ |
|||
#ifndef PMATH_CPP |
|||
#define PMATH_CPP |
|||
|
|||
|
|||
############/ UNUSED: see Convert in frameworkdummy.h and ByRound in pmath.h |
|||
|
|||
|
|||
#include "pconvert.h" |
|||
#include <cmath>#<math.h> |
|||
|
|||
namespace ProtoArmor |
|||
def Abs(self, val): |
|||
return (val>=255.0f) ? 255 : ((val<=0.0f)?0:(byte)val) |
|||
|
|||
def Abs(self, val): |
|||
return (val>=255.0) ? 255 : ((val<=0.0)?0:(byte)val) |
|||
|
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,19 @@ |
|||
#ifndef PCONVERT_H |
|||
#define PCONVERT_H |
|||
|
|||
#include <string> |
|||
#include <climits> #<limits.h> |
|||
#include "preporting.h" |
|||
#include "frameworkdummy.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
class PConvert |
|||
public: |
|||
static void ToByte(float val) |
|||
static void ToByte(float val) |
|||
|
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,585 @@ |
|||
##define WIN32_LEAN_AND_MEAN |
|||
#include <windows.h> |
|||
#include <commctrl.h> |
|||
#include <stdio.h> |
|||
#include <vd2/VDXFrame/VideoFilter.h> |
|||
#include <vd2/VDXFrame/VideoFilterDialog.h> |
|||
#include "../resource.h" |
|||
#include "f_spatialforegroundremover.h" |
|||
#include <ctime> |
|||
#include "pimage.h" |
|||
#include "pmath.h" |
|||
|
|||
extern int g_VFVAPIVersion |
|||
|
|||
using namespace ProtoArmor |
|||
|
|||
#######################################/ |
|||
|
|||
PMathStatic* pmathstatic=NULL |
|||
|
|||
def DlgProc(self, msg, wParam, lParam): |
|||
switch(msg) |
|||
case WM_INITDIALOG: |
|||
return not OnInit() |
|||
|
|||
case WM_DESTROY: |
|||
OnDestroy() |
|||
break |
|||
|
|||
case WM_COMMAND: |
|||
if OnCommand(LOWORD(wParam)): |
|||
return TRUE |
|||
break |
|||
|
|||
case WM_HSCROLL: |
|||
if mifp and SaveToConfig(): |
|||
mifp.RedoFrame() |
|||
return TRUE |
|||
|
|||
|
|||
return FALSE |
|||
|
|||
|
|||
def OnInit(self): |
|||
mOldConfig = mConfig |
|||
|
|||
SendDlgItemMessage(mhdlg, IDC_REACH, TBM_SETRANGE, TRUE, MAKELONG(0, 2000)) |
|||
SendDlgItemMessage(mhdlg, IDC_RADIALSAMPLES, TBM_SETRANGE, TRUE, MAKELONG(0, 2000)) |
|||
SendDlgItemMessage(mhdlg, IDC_DIFFUSION, TBM_SETRANGE, TRUE, MAKELONG(0, 2000)) |
|||
|
|||
LoadFromConfig() |
|||
|
|||
hwndFirst = GetDlgItem(mhdlg, IDC_REACH) |
|||
if hwndFirst: |
|||
SendMessage(mhdlg, WM_NEXTDLGCTL, (WPARAM)hwndFirst, TRUE) |
|||
|
|||
hwndPreview = GetDlgItem(mhdlg, IDC_PREVIEW) |
|||
if hwndPreview and mifp: |
|||
EnableWindow(hwndPreview, TRUE) |
|||
mifp.InitButton((VDXHWND)hwndPreview) |
|||
|
|||
|
|||
return False |
|||
|
|||
|
|||
def OnDestroy(self): |
|||
if mifp: |
|||
mifp.InitButton(NULL) |
|||
|
|||
|
|||
def OnCommand(self, cmd): |
|||
switch(cmd) |
|||
case IDOK: |
|||
SaveToConfig() |
|||
EndDialog(mhdlg, True) |
|||
return True |
|||
|
|||
case IDCANCEL: |
|||
mConfig = mOldConfig |
|||
EndDialog(mhdlg, False) |
|||
return True |
|||
|
|||
case IDC_PREVIEW: |
|||
if mifp: |
|||
mifp.Toggle((VDXHWND)mhdlg) |
|||
return True |
|||
|
|||
|
|||
return False |
|||
|
|||
|
|||
def LoadFromConfig(self): |
|||
SendDlgItemMessage(mhdlg, IDC_REACH, TBM_SETPOS, TRUE, (int)(0.5f + mConfig.mReach * 1000.0f)) |
|||
SendDlgItemMessage(mhdlg, IDC_RADIALSAMPLES, TBM_SETPOS, TRUE, (int)(0.5f + mConfig.mRadialSamples * 1000.0f)) |
|||
SendDlgItemMessage(mhdlg, IDC_DIFFUSION, TBM_SETPOS, TRUE, (int)(0.5f + mConfig.mDiffusion * 1000.0f)) |
|||
|
|||
|
|||
def SaveToConfig(self): |
|||
fReach = (float)SendDlgItemMessage(mhdlg, IDC_REACH, TBM_GETPOS, 0, 0) / 1000.0f |
|||
fRadialSamples = (float)SendDlgItemMessage(mhdlg, IDC_RADIALSAMPLES, TBM_GETPOS, 0, 0) / 1000.0f |
|||
fDiffusion = (float)SendDlgItemMessage(mhdlg, IDC_DIFFUSION, TBM_GETPOS, 0, 0) / 1000.0f |
|||
|
|||
if (fReach != mConfig.mReach |
|||
or fRadialSamples != mConfig.mRadialSamples |
|||
or fDiffusion != mConfig.mDiffusion) |
|||
mConfig.mReach = fReach |
|||
mConfig.mRadialSamples = fRadialSamples |
|||
mConfig.mDiffusion = fDiffusion |
|||
return True |
|||
|
|||
|
|||
return False |
|||
|
|||
|
|||
VDXVF_BEGIN_SCRIPT_METHODS(SpatialForegroundRemoverFilter) |
|||
VDXVF_DEFINE_SCRIPT_METHOD(SpatialForegroundRemoverFilter, ScriptConfig, "iii") |
|||
VDXVF_END_SCRIPT_METHODS() |
|||
|
|||
SpatialForegroundRemoverFilter.~SpatialForegroundRemoverFilter() |
|||
if pmathstatic!=NULL: |
|||
delete pmathstatic |
|||
pmathstatic=NULL |
|||
|
|||
if fx_buffer!=NULL: |
|||
free(fx_buffer) |
|||
fx_buffer=NULL |
|||
|
|||
|
|||
|
|||
def GetParams(self): |
|||
if g_VFVAPIVersion >= 12: |
|||
switch(fa.src.mpPixmapLayout.format) |
|||
case nsVDXPixmap.kPixFormat_XRGB8888: |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV444_Planar: |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV422_Planar: |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV420_Planar: |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV411_Planar: |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV410_Planar: |
|||
break |
|||
default: |
|||
return FILTERPARAM_NOT_SUPPORTED |
|||
|
|||
|
|||
|
|||
fa.dst.offset = fa.src.offset |
|||
return FILTERPARAM_SUPPORTS_ALTFORMATS |
|||
|
|||
|
|||
|
|||
def Start(self): |
|||
#PReporting.setIsMegaDebug(True);#debug only |
|||
if (pmathstatic==NULL) pmathstatic=new PMathStatic();#PMathStatic pmathstatic |
|||
|
|||
fx_buffer_w=0 |
|||
fx_buffer_h=0 |
|||
fx_buffer_BytesPP=0 |
|||
fx_buffer_Stride=0 |
|||
fx_buffer=NULL |
|||
fx_buffer_BytesTotal=0 |
|||
time_t rawtime; ##include <ctime> #<time.h> |
|||
struct tm * timeinfo |
|||
time(&rawtime) |
|||
timeinfo=localtime(&rawtime) |
|||
cerr<<(timeinfo.tm_year+1900)<<"-"<<(timeinfo.tm_mon+1)<<"-"<<(timeinfo.tm_mday)<<" "<<timeinfo.tm_hour<<":"<<timeinfo.tm_min<<":"<<timeinfo.tm_sec<<endl |
|||
|
|||
|
|||
def DrawDebugSquareTo_fx_buffer(self): |
|||
for (int iDebug=0; iDebug<=fa.pfsi.lCurrentSourceFrame; iDebug++) |
|||
for (int yDebug=0; yDebug<=fa.pfsi.lCurrentSourceFrame; yDebug++) |
|||
if iDebug<fa.dst.w and yDebug<fa.dst.h: |
|||
int iLocDebug=yDebug*fx_buffer_Stride+iDebug*fx_buffer_BytesPP |
|||
fx_buffer[iLocDebug]=128 |
|||
if fx_buffer_BytesPP>2: |
|||
fx_buffer[iLocDebug+1]=128 |
|||
fx_buffer[iLocDebug+2]=128 |
|||
|
|||
#targaMask.arrbyData[yDebug*targaMask.Stride()+iDebug*targaMask.BytesPP()+mask_Channel]=255;#fx_buffer[iLocDebug+3]=255;#alpha |
|||
|
|||
|
|||
|
|||
}#end DrawDebugSquareTo_fx_buffer |
|||
def DrawDebugCircleTo_fx_buffer(self): |
|||
for (int iDebug=0; iDebug<PMath.ppiCache_Used and iDebug<fa.pfsi.lCurrentSourceFrame; iDebug++) |
|||
if PMath.ppiCache[iDebug].x<fa.dst.w and PMath.ppiCache[iDebug].y<fa.dst.h: |
|||
int iLocDebug=PMath.ppiCache[iDebug].y*fx_buffer_Stride+PMath.ppiCache[iDebug].x*fx_buffer_BytesPP |
|||
fx_buffer[iLocDebug]=255 |
|||
fx_buffer[iLocDebug+1]=255 |
|||
fx_buffer[iLocDebug+2]=255 |
|||
#targaMask.arrbyData[PMath.ppiCache[iDebug].y*targaMask.Stride()+PMath.ppiCache[iDebug].x*targaMask.BytesPP()+mask_Channel]=255;#fx_buffer[iLocDebug+3]=255;#alpha |
|||
}#if within range |
|||
}#debug only (result should be WHITE circle inside GRAY square) |
|||
|
|||
|
|||
def Run(self): |
|||
#PReporting.setIsUltraDebug(True) |
|||
#mConfig.mReach |
|||
#mConfig.mRadialSamples |
|||
#mConfig.mDiffusion |
|||
bool bHorizontalSearch=True |
|||
bool bVerticalSearch=False |
|||
|
|||
bool bUnknownPixelFormat=False |
|||
bool bGood=False |
|||
cerr<<"SpatialForegroundRemoverFilter.Run..."<<endl |
|||
try |
|||
#*fa.pfsi.lCurrentFrame#current sequence frame, called output frame |
|||
cerr<<"SpatialForegroundRemoverFilter.Run: frame "<<fa.pfsi.lCurrentSourceFrame<<"..."<<endl |
|||
string MaskFile_Name="" |
|||
string MaskFile_UserInput="spatialforegroundremover.tga";#in current working dir (which is the VirtualDub folder) |
|||
for (int iDigits=0; iDigits<10; iDigits++) |
|||
string sDigits=string("") |
|||
for (int iBuild=0; iBuild<iDigits; iBuild++) |
|||
sDigits+=string("0") |
|||
|
|||
string sFileTheoretical=string("spatialforegroundremover")+sDigits+string(".tga") |
|||
if File.Exists(sFileTheoretical) : |
|||
MaskFile_UserInput=sFileTheoretical |
|||
#cerr<<sFileTheoretical<<" sequence start frame found"<<endl |
|||
break |
|||
|
|||
#else cerr<<sFileTheoretical<<" sequence start frame not found"<<endl |
|||
|
|||
#string MaskFile_Test1="C:\\Documents and Settings\\Owner\\Desktop\\heal-mask1c-80662.tga" |
|||
#string MaskFile_Test2="E:\\Videos\\Projects\\etc\\OldFHC,The\\heal-mask1c-80662.tga" |
|||
if (File.Exists(MaskFile_UserInput)) MaskFile_Name=MaskFile_UserInput |
|||
#elif (File.Exists(MaskFile_Test1)) MaskFile_Name=MaskFile_Test1 |
|||
#elif (File.Exists(MaskFile_Test2)) MaskFile_Name=MaskFile_Test2 |
|||
if MaskFile_Name!="": |
|||
string MaskFile_CurrentOrPrev_AbsOrRelName=GetCurrentOrPrevFrameFor(MaskFile_Name,fa.pfsi.lCurrentFrame); #GetCurrentOrPrevFrameFor(MaskFile_Name,fa.pfsi.lCurrentSourceFrame) |
|||
cerr<<"SpatialForegroundRemoverFilter.Run: Loading Mask "<<MaskFile_CurrentOrPrev_AbsOrRelName<<"..."<<flush |
|||
bool bTest=self.targaMask.Load(MaskFile_CurrentOrPrev_AbsOrRelName) |
|||
cerr<<(bTest?"OK":"FAILED")<<endl |
|||
}#end if mask found |
|||
else: |
|||
cerr<<"SpatialForegroundRemoverFilter.Run: Using Mask (none, continue)"<<endl |
|||
|
|||
unsigned int mask_Channel=0; #NOTE: uses blue if mask is 32- or 24-bit |
|||
rRadialSampleSpacing = ((double)mConfig.mRadialSamples*360.0>1.0) ? (360.0/((double)mConfig.mRadialSamples*360.0)) : 360.0 |
|||
cerr<<"{Reach:"<<mConfig.mReach<<"; RadialSamples:"<<mConfig.mRadialSamples<<"; RadialSampleSpacing:"<<rRadialSampleSpacing<<"; Diffusion:"<<mConfig.mDiffusion<<"; PReporting.iDebugLevel:"<<PReporting.getDebugLevel()<<"}..."<<endl;#Console.Error.WriteLine(Convert.ToString("{Reach:")+Convert.ToString(mConfig.mReach)+Convert.ToString("; RadialSamples:")+Convert.ToString(mConfig.mRadialSamples)+Convert.ToString("; Diffusion:")+Convert.ToString(mConfig.mDiffusion)+Convert.ToString("}...")) |
|||
unsigned int vdpixmapSource_BytesPP=3 |
|||
#unsigned int targaTemp_BytesPP=4 |
|||
if g_VFVAPIVersion >= 12: |
|||
vdpixmapDest = *fa.dst.mpPixmap |
|||
vdpixmapSource = *fa.src.mpPixmap |
|||
#int sw |
|||
#int sh |
|||
#NOTES: |
|||
#-data and pitch are Y |
|||
#-data2 and pitch2 are Cb (U) |
|||
#-data3 and pitch3 are Cr (V) |
|||
|
|||
#Steps: |
|||
#-load targaMask: if loaded but frame is less than current frame, for a later one <= current |
|||
#-prepare fx_buffer (will become interleaved YUV444) |
|||
#-transfer dest frame to fx_buffer |
|||
# --if BGR24 then transfer using memcpy |
|||
# --if YUV (even if 444 since planar) then transfer using YUV4xxSubsampledPlanarToYUV444NonPlanar adding alpha channel |
|||
# --if BGRA32 transfer using CopySurface_BitdepthSensitive(fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,vdpixmapSource.data,vdpixmapSource_BytesPP,vdpixmapSource.pitch,h) |
|||
#-NOTE: after previous step it is fine for fx_buffer to be either YUV444 or RGB24 |
|||
#-DEPRECATED 2010-06: Create targaTemp (re-Init only if different size than dest), at 32-bit |
|||
#-calculate healed color for each pixel of the color channels of of 32-bit (YUV4444 or BGRA) targa where targaMask is nonzero |
|||
# --using fx_buffer |
|||
# --keep in mind that self may place YUV values into targa |
|||
# --NEW 2010-06: use mask to alpha blend the intensity of the effect |
|||
#-DEPRECATED 2010-06: copy value of targaMask to alpha channel of targaTemp |
|||
#-DEPRECATED 2010-06: overlay targaTemp to fx_buffer using alpha |
|||
#-NEW 2010-06: using the three appropriate CopyNonPlanarToPlane calls, healed fx_buffer directly to virtualdub dst planes. |
|||
#-if dest is (YUV444 non-planar [RARE] OR BGR24) copy fx_buffer directly to dest using memcpy |
|||
# --elif dest is BGRA32 copy using CopySurface_BitdepthSensitive(vdpixmapSource.data,vdpixmapSource_BytesPP,fx_buffer,fx_buffer_BytesPP,h*w) |
|||
# --else dest is neither YUV444 nor RGB nor RGBA: Copy using YUV444ToYUV4xx |
|||
|
|||
cerr<<"VirtualDub API version 12 or higher found"<<endl |
|||
CTBufferInit(vdpixmapSource.w,vdpixmapSource.h,4);#fx_buffer=malloc etc |
|||
|
|||
bool bShowDebugCircle=False;#to be changed below |
|||
bool bShowDebugSquare=False;#to be changed below |
|||
#bool bShowTargaTempDebugCircle |
|||
#bool bShowTargaTempDebugSquare |
|||
bool HasFullLumaRes=True |
|||
bool bSamplesOnSecondLine=False |
|||
switch(vdpixmapSource.format) |
|||
case nsVDXPixmap.kPixFormat_XRGB8888: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=4 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using xRGB32") |
|||
#NOTE: outermost "else" case should use same steps as self case! |
|||
# --EXCEPT accessing fa instead of *fa.dst.mpPixmap (a.k.a. vdpixmapSource) |
|||
CopySurface_BitdepthSensitive((unsigned char*)fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,(unsigned char*)vdpixmapSource.data,vdpixmapSource_BytesPP,vdpixmapSource.pitch,vdpixmapSource.w,vdpixmapSource.h) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
|
|||
#if PReporting.getIsUltraDebug(): # CopySurface_BitdepthSensitive((unsigned char*)targaTemp.arrbyData,targaTemp.BytesPP(),targaTemp.Stride(),(unsigned char*)vdpixmapSource.data,vdpixmapSource_BytesPP,vdpixmapSource.pitch,vdpixmapSource.w,vdpixmapSource.h) |
|||
# targaTemp.Save("SpatialForegroundRemover-ARGB32-debug.tga") |
|||
# |
|||
break |
|||
case nsVDXPixmap.kPixFormat_RGB888: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using RGB24") |
|||
memcpy(fx_buffer,vdpixmapSource.data,vdpixmapSource.h*vdpixmapSource.pitch) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
#if PReporting.getIsUltraDebug(): # CopySurface_BitdepthSensitive((unsigned char*)targaTemp.arrbyData,targaTemp.BytesPP(),targaTemp.Stride(),(unsigned char*)vdpixmapSource.data,vdpixmapSource_BytesPP,vdpixmapSource.pitch,vdpixmapSource.w,vdpixmapSource.h) |
|||
# targaTemp.Save("SpatialForegroundRemover-RGB24-debug.tga") |
|||
# |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV444_Planar: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:4:4 Planar") |
|||
HasFullLumaRes=True |
|||
CopyPlaneToNonPlanar(fx_buffer, 0, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data, vdpixmapSource.pitch, vdpixmapSource.w, vdpixmapSource.h, HasFullLumaRes) |
|||
CopyPlaneToNonPlanar(fx_buffer, 1, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data2, vdpixmapSource.pitch2, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
CopyPlaneToNonPlanar(fx_buffer, 2, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data3, vdpixmapSource.pitch3, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,False) |
|||
#if PReporting.getIsUltraDebug(): # YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, (targaTemp.BytesPP()>3)?True:False, False, fx_buffer, fx_buffer_w*fx_buffer_h) |
|||
# SaveRaw("debug-SpatialForegroundRemover-converted-to-YUV444NonPlanar.raw",(unsigned char*)fx_buffer,fx_buffer_Stride*fx_buffer_h) |
|||
# targaTemp.Save("SpatialForegroundRemover-YUV444-debug-to-RGB24.tga") |
|||
# YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV422_Planar: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:2:2 Planar") |
|||
HasFullLumaRes=True |
|||
CopyPlaneToNonPlanar(fx_buffer, 0, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data, vdpixmapSource.pitch, vdpixmapSource.w, vdpixmapSource.h, HasFullLumaRes) |
|||
CopyPlaneToNonPlanar(fx_buffer, 1, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data2, vdpixmapSource.pitch2, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
CopyPlaneToNonPlanar(fx_buffer, 2, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data3, vdpixmapSource.pitch3, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
#if PReporting.getIsUltraDebug(): # SaveRaw("debug-SpatialForegroundRemover-converted-to-YUV444NonPlanar.raw",(unsigned char*)fx_buffer,fx_buffer_Stride*fx_buffer_h) |
|||
# YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, False, False, fx_buffer, vdpixmapSource.w*vdpixmapSource.h) |
|||
# targaTemp.Save("SpatialForegroundRemover-YUV422Planes-debug-to-RGB24.tga") |
|||
# #YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
|
|||
#TransformY8(vdpixmapDest.data, vdpixmapDest.pitch, vdpixmapDest.w, vdpixmapDest.h, mConfig.mYScale) |
|||
#sw = (vdpixmapSource.w + 1) >> 1 |
|||
#sh = vdpixmapSource.h |
|||
#TransformY8(vdpixmapDest.data2, vdpixmapDest.pitch2, sw, sh, mConfig.mUScale) |
|||
#TransformY8(vdpixmapDest.data3, vdpixmapDest.pitch3, sw, sh, mConfig.mVScale) |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV420_Planar: |
|||
bSamplesOnSecondLine=False |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:2:0 Planar") |
|||
HasFullLumaRes=True |
|||
#NOTE: fx_buffer is 32-bit (see CTBufferInit(...) call above) |
|||
CopyPlaneToNonPlanar(fx_buffer, 0, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data, vdpixmapSource.pitch, vdpixmapSource.w, vdpixmapSource.h, HasFullLumaRes) |
|||
CopyPlaneToNonPlanar(fx_buffer, 1, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data2, vdpixmapSource.pitch2, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
CopyPlaneToNonPlanar(fx_buffer, 2, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data3, vdpixmapSource.pitch3, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
#PReporting.setIsUltraDebug(True);#debug only |
|||
#if PReporting.getIsUltraDebug(): #SaveRaw("debug-SpatialForegroundRemover-converted-to-YUV444NonPlanar.raw",(unsigned char*)fx_buffer,fx_buffer_Stride*fx_buffer_h) |
|||
#YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, False, False, fx_buffer, vdpixmapSource.w*vdpixmapSource.h) |
|||
|
|||
#targaTemp.Save("SpatialForegroundRemover-YUV420-debug-YUV420Planes-to-RGB.tga") |
|||
#YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
#TODO: |
|||
#--DEPRECATED 2010-06: copy (without alpha) fx_buffer (444 or BGR) onto targaTemp BGR |
|||
# (need copy before healing; healed fx_buffer will be drawn onto it using mask) |
|||
#Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Copy to targaTemp") |
|||
if PReporting.getIsUltraDebug(): |
|||
if fx_buffer_BytesPP>3: |
|||
unsigned char* lpLineNow=fx_buffer |
|||
unsigned char* lpNow |
|||
for (unsigned int y=0; y<fx_buffer_h; y++) |
|||
lpNow=lpLineNow |
|||
for (unsigned int x=0; x<fx_buffer_w; x++) |
|||
lpNow[3]=255 |
|||
lpNow+=fx_buffer_BytesPP |
|||
}#end for x |
|||
lpLineNow+=fx_buffer_Stride |
|||
}#end for y |
|||
}#end if fx_buffer has alpha channel |
|||
}#end if bUltraDebug |
|||
#CopySurface_BitdepthSensitive(targaTemp.arrbyData, targaTemp.BytesPP(), targaTemp.Stride(), fx_buffer, fx_buffer_BytesPP, fx_buffer_Stride, fx_buffer_w, fx_buffer_h) |
|||
#if PReporting.getIsUltraDebug(): # targaTemp.Save("SpatialForegroundRemover-YUV420-debug1-YUV420Planes-to-RGB.tga") |
|||
# |
|||
#--heal fx_buffer |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: heal fx_buffer...") |
|||
#PReporting.setIsUltraDebug(True);#debug only |
|||
#Heal_WithAveraging_Sequential |
|||
Heal_WithAveraging_Permutations(fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,targaMask.arrbyData,targaMask.BytesPP(),targaMask.Stride(),mask_Channel,fx_buffer_w,fx_buffer_h,(double)mConfig.mReach,rRadialSampleSpacing,(double)mConfig.mDiffusion, bHorizontalSearch, bVerticalSearch) |
|||
#Console.Error.Write("debugging frame "+Convert.ToString(fa.pfsi.lCurrentSourceFrame)) |
|||
#Console.Error.WriteLine("done. (debug circle drawing)") |
|||
#Heal_ToNearestPixel(fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,targaMask.arrbyData,targaMask.BytesPP(),targaMask.Stride(),mask_Channel,fx_buffer_w,fx_buffer_h,(double)mConfig.mReach,rRadialSampleSpacing,(double)mConfig.mDiffusion) |
|||
#if PReporting.getIsUltraDebug(): # #NOTE: copying to targaTemp at self point causes debug to be DESTRUCTIVE |
|||
# #CopySurface_BitdepthSensitive(targaTemp.arrbyData, targaTemp.BytesPP(), targaTemp.Stride(), fx_buffer, fx_buffer_BytesPP, fx_buffer_Stride, fx_buffer_w, fx_buffer_h) |
|||
# #SaveRaw("SpatialForegroundRemover-YUV420-debug-YUV420Planes-to-RGB-AFTERHEAL.raw",(unsigned char*)fx_buffer,vdpixmapSource.w*vdpixmapSource.h*fx_buffer_BytesPP) |
|||
# #targaTemp.Save("SpatialForegroundRemover-YUV420-debug-YUV420Planes-to-RGB-AFTERHEAL-DESTRUCTIVEDEBUG.tga") |
|||
# Targa targaDebug |
|||
# targaDebug.From(fx_buffer_w,fx_buffer_h,fx_buffer_BytesPP,fx_buffer,False) |
|||
# #targaDebug.Init(fx_buffer_w,fx_buffer_h,fx_buffer_BytesPP,True) |
|||
# #targaDebug.CopyBufferFrom(fx_buffer) |
|||
# targaDebug.Save("SpatialForegroundRemover-YUV420-debug2-HEAL-STEP1of2-fx_buffer.tga") |
|||
# targaMask.Save("SpatialForegroundRemover-YUV420-debug0-MASK.tga") |
|||
# |
|||
#--DEPRECATED 2010-06: overlay (with targaMask as alpha) healed fx_buffer (444 or BGR) onto targaTemp BGR |
|||
#Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: overlay healed channels to targaTemp using targaMask...") |
|||
#PImage.Draw(targaTemp.arrbyData,0,0,targaTemp.Width(),targaTemp.Height(),targaTemp.BytesPP(),targaTemp.Stride(),fx_buffer,fx_buffer_w,fx_buffer_h,fx_buffer_BytesPP,fx_buffer_Stride,targaMask.arrbyData,targaMask.BytesPP(),targaMask.Stride(),mask_Channel) |
|||
#if PReporting.getIsUltraDebug(): # targaTemp.Save("SpatialForegroundRemover-YUV420-debug3-HEAL-STEP2of2-444-after-overlay.tga") |
|||
# |
|||
|
|||
if PReporting.getIsMegaDebug(): |
|||
bShowDebugCircle=True |
|||
|
|||
if bShowDebugSquare: |
|||
DrawDebugSquareTo_fx_buffer() |
|||
}#end if bShowDebugSquare |
|||
#Console.Error.Write("...") |
|||
if bShowDebugCircle: |
|||
PReporting.setParticiple("showing debug circle") |
|||
DrawDebugCircleTo_fx_buffer() |
|||
}#end if bShowDebugCircle |
|||
#--DEPRECATED 2010-06: copy non-planar targaTemp (444 or BGR) channels onto vdpixmapDest planes |
|||
#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data,vdpixmapDest.pitch,HasFullLumaRes,targaTemp.arrbyData,0,targaTemp.BytesPP(),targaTemp.Width(),targaTemp.Height());#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data,vdpixmapDest.pitch,bSamplesOnSecondLine,fx_buffer,0,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data2,vdpixmapDest.pitch2,bSamplesOnSecondLine,targaTemp.arrbyData,1,targaTemp.BytesPP(),targaTemp.Width(),targaTemp.Height());#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data2,vdpixmapDest.pitch2,bSamplesOnSecondLine,fx_buffer,1,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data3,vdpixmapDest.pitch3,bSamplesOnSecondLine,targaTemp.arrbyData,2,targaTemp.BytesPP(),targaTemp.Width(),targaTemp.Height());#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data3,vdpixmapDest.pitch3,bSamplesOnSecondLine,fx_buffer,2,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
#--NEW 2010-06: copy fx_buffer non-planar channels to vdpixmapDest planes |
|||
#Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: copy channels to video planes...") |
|||
PReporting.setParticiple("copying planes") |
|||
CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data,vdpixmapDest.pitch,HasFullLumaRes,fx_buffer,0,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h);#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data,vdpixmapDest.pitch,bSamplesOnSecondLine,fx_buffer,0,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data2,vdpixmapDest.pitch2,bSamplesOnSecondLine,fx_buffer,1,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h);#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data2,vdpixmapDest.pitch2,bSamplesOnSecondLine,fx_buffer,1,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data3,vdpixmapDest.pitch3,bSamplesOnSecondLine,fx_buffer,2,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h);#CopyNonPlanarToPlane((unsigned char*)vdpixmapDest.data3,vdpixmapDest.pitch3,bSamplesOnSecondLine,fx_buffer,2,fx_buffer_BytesPP,fx_buffer_w,fx_buffer_h) |
|||
if PReporting.getIsMegaDebug()) Console.Error.WriteLine("Finished case for YUV420Planes-to-RGB in SpatialForegroundRemover": |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV411_Planar: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:1:1") |
|||
HasFullLumaRes=True |
|||
CopyPlaneToNonPlanar(fx_buffer, 0, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data, vdpixmapSource.pitch, vdpixmapSource.w, vdpixmapSource.h, HasFullLumaRes) |
|||
CopyPlaneToNonPlanar(fx_buffer, 1, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data2, vdpixmapSource.pitch2, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
CopyPlaneToNonPlanar(fx_buffer, 2, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data3, vdpixmapSource.pitch3, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
#if PReporting.getIsUltraDebug(): # SaveRaw("SpatialForegroundRemover-converted-to-YUV444NonPlanar.raw",(unsigned char*)fx_buffer,fx_buffer_Stride*fx_buffer_h) |
|||
# YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, False, False, fx_buffer, vdpixmapSource.w*vdpixmapSource.h) |
|||
# targaTemp.Save("SpatialForegroundRemover-YUV420-debug-YUV411Planes-to-RGB.tga") |
|||
# #YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
#TransformY8(vdpixmapDest.data, vdpixmapDest.pitch, vdpixmapDest.w, vdpixmapDest.h, mConfig.mReach) |
|||
|
|||
#sw = (vdpixmapSource.w + 3) >> 2 |
|||
#sh = vdpixmapSource.h |
|||
#TransformY8(vdpixmapDest.data2, vdpixmapDest.pitch2, sw, sh, mConfig.mUScale) |
|||
#TransformY8(vdpixmapDest.data3, vdpixmapDest.pitch3, sw, sh, mConfig.mVScale) |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV410_Planar: |
|||
bSamplesOnSecondLine=False |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:1:0") |
|||
HasFullLumaRes=True |
|||
CopyPlaneToNonPlanar(fx_buffer, 0, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data, vdpixmapSource.pitch, vdpixmapSource.w, vdpixmapSource.h, HasFullLumaRes) |
|||
CopyPlaneToNonPlanar(fx_buffer, 1, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data2, vdpixmapSource.pitch2, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
CopyPlaneToNonPlanar(fx_buffer, 2, fx_buffer_BytesPP, (unsigned char*)vdpixmapSource.data3, vdpixmapSource.pitch3, vdpixmapSource.w, vdpixmapSource.h, bSamplesOnSecondLine) |
|||
|
|||
#targaTemp.Init(vdpixmapSource.w,vdpixmapSource.h,targaTemp_BytesPP,True) |
|||
#if PReporting.getIsUltraDebug(): # SaveRaw("debug-SpatialForegroundRemover-converted-to-YUV444NonPlanar.raw",(unsigned char*)fx_buffer,fx_buffer_Stride*fx_buffer_h) |
|||
# YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, False, False, fx_buffer, vdpixmapSource.w*vdpixmapSource.h) |
|||
# targaTemp.Save("SpatialForegroundRemover-YUV420-debug-YUV410Planes-to-RGB.tga") |
|||
# #YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
#TransformY8(vdpixmapDest.data, vdpixmapDest.pitch, vdpixmapDest.w, vdpixmapDest.h, mConfig.mReach) |
|||
|
|||
#sw = (vdpixmapSource.w + 3) >> 2 |
|||
#sh = (vdpixmapSource.h + 3) >> 2 |
|||
#TransformY8(vdpixmapDest.data2, vdpixmapDest.pitch2, sw, sh, mConfig.mUScale) |
|||
#TransformY8(vdpixmapDest.data3, vdpixmapDest.pitch3, sw, sh, mConfig.mVScale) |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV422_UYVY: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:2:2 UYVY") |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run Error: has not yet implemented YUV422_UYVY") |
|||
break |
|||
case nsVDXPixmap.kPixFormat_YUV422_YUYV: |
|||
bSamplesOnSecondLine=True |
|||
vdpixmapSource_BytesPP=3 |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run: Using YUV 4:2:2 YUYV") |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run Error: has not yet implemented YUV422_YUYV") |
|||
break |
|||
default: |
|||
Console.Error.WriteLine("SpatialForegroundRemoverFilter.Run Error: has not yet implemented less than 24-bit (has only 24- and 32-bit YUV and RGB formats)") |
|||
bUnknownPixelFormat=True |
|||
break |
|||
}#end switch |
|||
bGood=True |
|||
if (bUnknownPixelFormat) bGood=False |
|||
|
|||
else: |
|||
vdpixmapSource_BytesPP=3 |
|||
cerr<<"SpatialForegroundRemoverFilter.Run: using VirtualDub API less than 12"<<endl |
|||
CopySurface_BitdepthSensitive(fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,(unsigned char*)fa.dst.data,vdpixmapSource_BytesPP,fa.dst.pitch,fa.dst.w,fa.dst.h) |
|||
Heal_WithAveraging_Sequential(fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,targaMask.arrbyData,targaMask.BytesPP(),targaMask.Stride(),mask_Channel,fx_buffer_w,fx_buffer_h,(double)mConfig.mReach,rRadialSampleSpacing,(double)mConfig.mDiffusion) |
|||
CopySurface_BitdepthSensitive((unsigned char*)fa.dst.data,vdpixmapSource_BytesPP,fa.dst.pitch,fx_buffer,fx_buffer_BytesPP,fx_buffer_Stride,fx_buffer_w,fx_buffer_h) |
|||
#targaTemp.Init(fa.dst.w,fa.dst.h,targaTemp_BytesPP,True) |
|||
#if PReporting.getIsUltraDebug(): # CopySurface_BitdepthSensitive((unsigned char*)targaTemp.arrbyData, targaTemp.BytesPP(), targaTemp.Stride(), (unsigned char*)fa.dst.data, vdpixmapSource_BytesPP, fa.dst.pitch, fa.dst.w, fa.dst.h);#YUV444NonPlanarToRGB((unsigned char*)targaTemp.arrbyData, False, False, (unsigned char*)fa.dst.data, fa.dst.h*fa.dst.w) |
|||
# targaTemp.Save("SpatialForegroundRemover-RGB(VirtualDub API less than 12)-debug-RGB-to-RGB.tga") |
|||
# #YUV444NonPlanarToRGB(targaTemp.arrbyData,fx_buffer,targaTemp.BytesBuffer) |
|||
# |
|||
bGood=True |
|||
|
|||
|
|||
catch (exception& exn) |
|||
bGood=False |
|||
PReporting.ShowExn(exn,"","SpatialForegroundRemover.Run") |
|||
|
|||
catch (...) |
|||
bGood=False |
|||
PReporting.ShowUnknownExn("","SpatialForegroundRemover.Run") |
|||
|
|||
if PReporting.getIsUltraDebug(): |
|||
Console.Error.WriteLine((bGood?"OK(SpatialForegroundRemover.Run)":"FAILED(SpatialForegroundRemover.Run)")) |
|||
Console.Error.WriteLine("Colorspace Conversion debugging info:") |
|||
Console.Error.WriteLine(Convert.ToString("YCToRgb source (byte to float direct cast) range {") |
|||
+Convert.ToString("Y:")+Convert.ToString(YCToRgb_fMinY)+"to"+Convert.ToString(YCToRgb_fMaxY)+Convert.ToString("; ") |
|||
+Convert.ToString("U:")+Convert.ToString(YCToRgb_fMinU)+"to"+Convert.ToString(YCToRgb_fMaxU)+Convert.ToString("; ") |
|||
+Convert.ToString("V:")+Convert.ToString(YCToRgb_fMinV)+"to"+Convert.ToString(YCToRgb_fMaxV)+Convert.ToString("; ") |
|||
+"}") |
|||
Console.Error.WriteLine(Convert.ToString("YCToRgb destination (float to byte) range {") |
|||
+Convert.ToString("r:")+Convert.ToString(YCToRgb_byMinR)+"to"+Convert.ToString(YCToRgb_byMaxR)+Convert.ToString("; ") |
|||
+Convert.ToString("g:")+Convert.ToString(YCToRgb_byMinG)+"to"+Convert.ToString(YCToRgb_byMaxG)+Convert.ToString("; ") |
|||
+Convert.ToString("b:")+Convert.ToString(YCToRgb_byMinB)+"to"+Convert.ToString(YCToRgb_byMaxB)+Convert.ToString("; ") |
|||
+"}") |
|||
Console.Error.WriteLine(Convert.ToString("RgbToYC destination (byte to float will be rounded to byte) range {") |
|||
+Convert.ToString("y:")+Convert.ToString(RgbToYC_fMinY)+"to"+Convert.ToString(RgbToYC_fMaxY)+Convert.ToString("; ") |
|||
+Convert.ToString("u:")+Convert.ToString(RgbToYC_fMinU)+"to"+Convert.ToString(RgbToYC_fMaxU)+Convert.ToString("; ") |
|||
+Convert.ToString("v:")+Convert.ToString(RgbToYC_fMinV)+"to"+Convert.ToString(RgbToYC_fMaxV)+Convert.ToString("; ") |
|||
+"}") |
|||
|
|||
if (PReporting.getIsMegaDebug()) cerr<<endl<<endl |
|||
return |
|||
}#end SpatialForegroundRemoverFilter.Run |
|||
|
|||
def Configure(self, hwnd): |
|||
SpatialForegroundRemoverFilterDialog dlg(mConfig, fa.ifp) |
|||
return dlg.Show((HWND)hwnd) |
|||
|
|||
|
|||
def GetSettingString(self, *buf, maxlen): |
|||
SafePrintf(buf, maxlen, " (Reach%.1f%%, RSamples%.1f%%, Diffusion%.1f%%)" |
|||
, mConfig.mReach * 100.0f |
|||
, mConfig.mRadialSamples * 100.0f |
|||
, mConfig.mDiffusion * 100.0f |
|||
) |
|||
|
|||
|
|||
def GetScriptString(self, *buf, maxlen): |
|||
SafePrintf(buf, maxlen, "Config(%u, %u, %u)" |
|||
, (unsigned)(mConfig.mReach * 1000.0f + 0.5f) |
|||
, (unsigned)(mConfig.mRadialSamples * 1000.0f + 0.5f) |
|||
, (unsigned)(mConfig.mDiffusion * 1000.0f + 0.5f) |
|||
) |
|||
|
|||
|
|||
def ScriptConfig(self, *isi, *argv, argc): |
|||
mConfig.mReach = argv[0].asInt() / 1000.0f |
|||
mConfig.mRadialSamples = argv[1].asInt() / 1000.0f |
|||
mConfig.mDiffusion = argv[2].asInt() / 1000.0f |
|||
|
|||
|
|||
def CTBufferInit(self, int w, int h, int BytesPP): |
|||
self.fx_buffer_BytesPP=BytesPP |
|||
self.fx_buffer_h=h |
|||
self.fx_buffer_w=w |
|||
self.fx_buffer_Stride=self.fx_buffer_BytesPP*self.fx_buffer_w |
|||
if (self.fx_buffer==NULL: |
|||
or (self.fx_buffer_BytesTotal!=(self.fx_buffer_h*self.fx_buffer_Stride)) ) |
|||
if self.fx_buffer!=NULL: |
|||
free(self.fx_buffer) |
|||
self.fx_buffer=NULL |
|||
|
|||
self.fx_buffer_BytesTotal=self.fx_buffer_h*self.fx_buffer_Stride |
|||
self.fx_buffer=(unsigned char*)malloc(self.fx_buffer_BytesTotal) |
|||
|
|||
}#end CTBufferInit |
|||
|
|||
#######################################/ |
|||
|
|||
extern filterDef_SpatialForegroundRemover = VDXVideoFilterDefinition<SpatialForegroundRemoverFilter>("ProtoArmor", "Spatial Foreground Remover", "Removes the destination's foreground at pixels that are non-zero in the specified mask by gathering information from the surrounding destination pixels where mask's pixel value is zero.") |
@ -0,0 +1,86 @@ |
|||
#ifndef F_SPATIALFOREGROUNDREMOVER_H |
|||
#define F_SPATIALFOREGROUNDREMOVER_H |
|||
|
|||
#include <cstdio> |
|||
#include <string> |
|||
|
|||
#include "targa.h" |
|||
#include "colorspacetransform.h" |
|||
|
|||
using namespace std |
|||
using namespace ProtoArmor |
|||
|
|||
class SpatialForegroundRemoverFilterConfig |
|||
public: |
|||
SpatialForegroundRemoverFilterConfig() |
|||
: mReach(1.0f) |
|||
, mRadialSamples(1.0f) |
|||
, mDiffusion(1.0f) |
|||
|
|||
|
|||
public: |
|||
float mReach |
|||
float mRadialSamples |
|||
float mDiffusion |
|||
|
|||
|
|||
#######################################/ |
|||
|
|||
class SpatialForegroundRemoverFilterDialog : public VDXVideoFilterDialog |
|||
public: |
|||
SpatialForegroundRemoverFilterDialog(SpatialForegroundRemoverFilterConfig& config, *ifp) : mConfig(config), mifp(ifp) { |
|||
|
|||
bool Show(HWND parent) |
|||
return 0 != VDXVideoFilterDialog.Show(NULL, MAKEINTRESOURCE(IDD_FILTER_SPATIALFOREGROUNDREMOVER), parent) |
|||
|
|||
|
|||
virtual INT_PTR DlgProc(UINT msg, wParam, lParam) |
|||
|
|||
protected: |
|||
bool OnInit() |
|||
bool OnCommand(int cmd) |
|||
void OnDestroy() |
|||
|
|||
void LoadFromConfig() |
|||
bool SaveToConfig() |
|||
|
|||
SpatialForegroundRemoverFilterConfig& mConfig |
|||
SpatialForegroundRemoverFilterConfig mOldConfig |
|||
IVDXFilterPreview * mifp |
|||
|
|||
|
|||
#######################################/ |
|||
|
|||
class SpatialForegroundRemoverFilter : public VDXVideoFilter |
|||
public: |
|||
virtual uint32 GetParams() |
|||
virtual void Start() |
|||
virtual void Run() |
|||
virtual bool Configure(VDXHWND hwnd) |
|||
virtual void GetSettingString(char *buf, maxlen) |
|||
virtual void GetScriptString(char *buf, maxlen) |
|||
|
|||
VDXVF_DECLARE_SCRIPT_METHODS() |
|||
~SpatialForegroundRemoverFilter() |
|||
private: |
|||
Targa targaTemp |
|||
Targa targaMask |
|||
void DrawDebugCircleTo_fx_buffer() |
|||
void DrawDebugSquareTo_fx_buffer() |
|||
|
|||
protected: |
|||
unsigned int fx_buffer_w |
|||
unsigned int fx_buffer_h |
|||
unsigned int fx_buffer_BytesPP |
|||
unsigned int fx_buffer_Stride |
|||
unsigned int fx_buffer_BytesTotal |
|||
unsigned char* fx_buffer |
|||
|
|||
void ScriptConfig(IVDXScriptInterpreter *isi, *argv, argc) |
|||
|
|||
void CTBufferInit(unsigned int w, int h, int BytesPP) |
|||
|
|||
SpatialForegroundRemoverFilterConfig mConfig |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,7 @@ |
|||
#include <vd2/VDXFrame/VideoFilterEntry.h> |
|||
|
|||
VDX_DECLARE_VIDEOFILTERS_BEGIN() |
|||
VDX_DECLARE_VIDEOFILTER(filterDef_SpatialForegroundRemover) |
|||
VDX_DECLARE_VIDEOFILTERS_END() |
|||
|
|||
VDX_DECLARE_VFMODULE() |
@ -0,0 +1,274 @@ |
|||
#ifndef PIMAGE_CPP |
|||
#define PIMAGE_CPP |
|||
|
|||
#include "pimage.h" |
|||
#include "pmath.h" |
|||
|
|||
namespace ProtoArmor |
|||
bool PImage.bPushToNearest_ShowMaskChannelError=True |
|||
bool PImage.bPushToNearestNondirectional_ShowMaskChannelError=True |
|||
#/<summary> |
|||
#/Returns nearest pixel where channel mask_Channel is outside mask_Threshold |
|||
#/xStart, should normally be a pixel center (will be rounded to find pixel location) |
|||
#/(nondirectional overload) |
|||
#/</summary> |
|||
#/<param name="xStart"></param> |
|||
#/<param name="yStart"></param> |
|||
#/<return>returns False if edge was found before a near pixel was found</return> |
|||
def PushToNearest(self, xStart, yStart, mask, int mask_w, int mask_h, int mask_BytesPP, int mask_Stride, int mask_Channel, mask_Threshold, bGreaterThanThreshold_FalseForLessThan): |
|||
bool bFound=False |
|||
if mask_Channel>=mask_BytesPP: |
|||
if bPushToNearestNondirectional_ShowMaskChannelError: |
|||
Console.Error.WriteLine("PushToNearest [nondirectional version] error: channel index "+Convert.ToString(mask_Channel)+" (starting from 0) does not exist in "+Convert.ToString(mask_BytesPP*8)+"-bit ("+Convert.ToString(mask_BytesPP)+" bytes per pixel) image--last channel will be used. This message will only be shown once") |
|||
bPushToNearestNondirectional_ShowMaskChannelError=False |
|||
|
|||
mask_Channel=mask_BytesPP-1 |
|||
|
|||
#double closest_Dist=DBL_MAX |
|||
#double closest_X=-1 |
|||
#double closest_Y=-1 |
|||
double mask_rH=(double)mask_h |
|||
double mask_rW=(double)mask_w |
|||
double pointNow_Dist=-1.0 |
|||
#unsigned int uiLoc |
|||
#unsigned int uiLineLoc=mask_Channel |
|||
double rRadNow=0.0 |
|||
double rRadMax=0.0 |
|||
double dAbsNow;#just for caching Abs method result |
|||
#NOTE: Since checks distance to all corners, |
|||
# still works if xStart, is outside of image. |
|||
dAbsNow=PMath.Dist(xStart,yStart,0.0,0.0) |
|||
if (dAbsNow>rRadMax) rRadMax=dAbsNow |
|||
dAbsNow=PMath.Dist(xStart,yStart,0.0,mask_rH) |
|||
if (dAbsNow>rRadMax) rRadMax=dAbsNow |
|||
dAbsNow=PMath.Dist(xStart,yStart,mask_rW,0.0) |
|||
if (dAbsNow>rRadMax) rRadMax=dAbsNow |
|||
dAbsNow=PMath.Dist(xStart,yStart,mask_rW,mask_rH) |
|||
if (dAbsNow>rRadMax) rRadMax=dAbsNow |
|||
double rDegPerPix |
|||
double rAngleNow |
|||
double xNow=xStart |
|||
double yNow=yStart |
|||
unsigned int xRound=(unsigned int)(xNow+.5) |
|||
unsigned int yRound=(unsigned int)(yNow+.5) |
|||
if not (xRound<0orxRound>=mask_woryRound<0oryRound>=mask_h): |
|||
if ( bGreaterThanThreshold_FalseForLessThan |
|||
? (mask[yRound*mask_Stride+xRound*mask_BytesPP+mask_Channel]>mask_Threshold) |
|||
: (mask[yRound*mask_Stride+xRound*mask_BytesPP+mask_Channel]<mask_Threshold) ) |
|||
xStart=(double)xRound |
|||
yStart=(double)yRound |
|||
bFound=True |
|||
|
|||
|
|||
double rRadAdd=.5 |
|||
if ( ((double)xRound!=xStart) or ((double)yRound!=yStart) ) rRadAdd=.25; #in case start is on border |
|||
#unsigned int xRoundPrev=0 |
|||
#unsigned int yRoundPrev=-1 |
|||
if not bFound: |
|||
for (rRadNow=rRadAdd; rRadNow<=rRadMax; rRadNow+=rRadAdd) |
|||
rDegPerPix=PMath.DegreesPerPixelAt(rRadNow) |
|||
if rDegPerPix>0.0: |
|||
for (rAngleNow=0.0; rAngleNow<360.0; rAngleNow+=rDegPerPix) |
|||
xNow=xStart+PMath.XOfRThetaDeg(rRadNow,rAngleNow) |
|||
yNow=yStart+PMath.YOfRThetaDeg(rRadNow,rAngleNow) |
|||
xRound=(unsigned int)(xNow+.5) |
|||
yRound=(unsigned int)(yNow+.5) |
|||
if not (xRound<0orxRound>=mask_woryRound<0oryRound>=mask_h): |
|||
if ( bGreaterThanThreshold_FalseForLessThan |
|||
? (mask[yRound*mask_Stride+xRound*mask_BytesPP+mask_Channel]>mask_Threshold) |
|||
: (mask[yRound*mask_Stride+xRound*mask_BytesPP+mask_Channel]<mask_Threshold) ) |
|||
xStart=(double)xRound |
|||
yStart=(double)yRound |
|||
bFound=True |
|||
break |
|||
}#end if match (outside threshold) |
|||
}#end if in range |
|||
}#end for rAngleNow |
|||
}#end if rDegPerPix>0.0 |
|||
else: |
|||
if PReporting.getIsMegaDebug()) Console.Error.WriteLine("PushToClosest error: rDegPerPix too small {rDegPerPix"+Convert.ToString(rDegPerPix)+"}": |
|||
|
|||
if (bFound) break |
|||
}#end for rRadNow |
|||
}#end if not matched (i.e. if not already on the pixel) |
|||
''' |
|||
for (double y=0; y<mask_rH; y+=1.0) uiLoc=uiLineLoc |
|||
for (double x=0; x<mask_rW; x+=1.0) if ( bGreaterThanThreshold_FalseForLessThan |
|||
? (mask[uiLoc]>mask_Threshold) |
|||
: (mask[uiLoc]<mask_Threshold) ) pointNow_Dist=PMath.Dist(x,y,xStart,yStart) |
|||
if pointNow_Dist<closest_Dist: closest_Dist=pointNow_Dist |
|||
closest_X=x |
|||
closest_X=y |
|||
bFound=True |
|||
|
|||
}#end if outside threshold color |
|||
uiLoc+=mask_BytesPP |
|||
}#end for x |
|||
uiLineLoc+=mask_Stride |
|||
}#end for y |
|||
if bFound: xStart=closest_X |
|||
yStart=closest_Y |
|||
|
|||
''' |
|||
return bFound |
|||
}#end PushToNearest nondirectional version |
|||
#/<summary> |
|||
#/Returns nearest pixel where channel mask_Channel is outside mask_Threshold, |
|||
#only looking at pixels on the line at the given angle rDirection_Deg |
|||
#/xStart, should normally be a pixel center (will be rounded to find pixel location) |
|||
#/; directional overload; does not work with out-of-range starting point (checked after rounding) |
|||
#/</summary> |
|||
#/<param name="xStart"></param> |
|||
#/<param name="yStart"></param> |
|||
#/<return>returns False if edge was found before a near pixel was found</return> |
|||
def PushToNearest(self, xStart, yStart, rDirection_Deg, mask, int mask_w, int mask_h, int mask_BytesPP, int mask_Stride, int mask_Channel, mask_Threshold, bGreaterThanThreshold_FalseForLessThan): |
|||
bool bFound=False |
|||
if mask_Channel>=mask_BytesPP: |
|||
if bPushToNearest_ShowMaskChannelError: |
|||
Console.Error.WriteLine("PushToNearest(...,direction,...): error, index "+Convert.ToString(mask_Channel)+" (starting from 0) does not exist in "+Convert.ToString(mask_BytesPP*8)+"-bit ("+Convert.ToString(mask_BytesPP)+" bytes per pixel) image--last channel will be used. This message will only be shown once") |
|||
bPushToNearest_ShowMaskChannelError=False |
|||
|
|||
mask_Channel=mask_BytesPP-1 |
|||
|
|||
#double xStart, yStart, rDirection_Deg |
|||
#byte* mask |
|||
#uint mask_w, mask_h |
|||
#uint mask_BytesPP |
|||
#uint mask_Stride |
|||
#uint mask_Channel |
|||
#byte mask_Threshold #mask_Needlean |
|||
double dSubsampleSpacing=.125;#not 1 since could be intersecting pixels at any point (.125 is 8x subsampling) |
|||
#use int to avoid out-of-range starting point |
|||
int ixStart |
|||
int iyStart |
|||
unsigned int uiLoc |
|||
int mask_iW=(int)mask_w |
|||
int mask_iH=(int)mask_h |
|||
do |
|||
ixStart=(int)(xStart+.5); #+.5 for rounding |
|||
iyStart=(int)(yStart+.5); #+.5 for rounding |
|||
if (ixStart<0 or ixStart>=mask_iW or iyStart<0 or iyStart>=mask_iH) break |
|||
#if ixStart>=0 and ixStart<mask_iW and iyStart>=0 and iyStart<mask_iH: uiLoc=iyStart*mask_Stride+ixStart*mask_BytesPP+mask_Channel |
|||
if ( bGreaterThanThreshold_FalseForLessThan |
|||
?(mask[uiLoc]>mask_Threshold) |
|||
:(mask[uiLoc]<mask_Threshold) ) |
|||
bFound=True |
|||
break |
|||
|
|||
# |
|||
#else break |
|||
PMath.Travel2d(xStart,yStart,rDirection_Deg,dSubsampleSpacing) |
|||
|
|||
while (not bFound) |
|||
return bFound |
|||
}#end PushToNearest |
|||
#/<summary> |
|||
#/Draws to src0 to dest0 at (xDestStart,yDestStart) using mask0 as alpha for source |
|||
#--alpha is neither modified on dest0 nor used from src0 |
|||
#/</summary> |
|||
#/<param name="mask0">must be same size as source</param> |
|||
def Draw(self, char* dest0, xDestStart, yDestStart, int dest_w, int dest_h, int dest_BytesPP, int dest_Stride, char* src0, int src_w, int src_h, int src_BytesPP, int src_Stride, char* mask0, int mask_BytesPP, int mask_Stride, int mask_Channel): |
|||
bool bGood=True |
|||
try |
|||
if (PReporting.getIsMegaDebug()) cerr<<"Draw(dest,...,src,...,mask,...)..."<<flush |
|||
unsigned int xSrcStart=0 |
|||
unsigned int ySrcStart=0 |
|||
if xDestStart<0: |
|||
xSrcStart=0-xDestStart |
|||
xDestStart=0 |
|||
|
|||
if yDestStart<0: |
|||
ySrcStart=0-yDestStart |
|||
yDestStart=0 |
|||
|
|||
unsigned int xSrc=xSrcStart |
|||
unsigned int ySrc=ySrcStart |
|||
unsigned int xDest=xDestStart |
|||
unsigned int yDest=yDestStart |
|||
float rCookedAlpha |
|||
unsigned int iSrcChan |
|||
unsigned int iDestChan |
|||
#unsigned int Debug_PixelsDone=0;#debug only |
|||
if dest0!=null: |
|||
if src0!=null: |
|||
if mask0!=null: |
|||
if (xDestStart>=0 and xDestStart<dest_w and yDestStart>=0 and yDestStart<dest_h |
|||
and xSrc>=0 and xSrc<src_w and ySrc>=0 and ySrc<src_w) |
|||
unsigned char* destLineLoc=&dest0[yDestStart*dest_Stride+xDestStart*dest_BytesPP] |
|||
unsigned char* srcLineLoc=&src0[ySrc*src_Stride+xSrc*src_BytesPP] |
|||
unsigned char* maskLineLoc=&mask0[mask_Channel+ySrc*mask_Stride+xSrc*mask_BytesPP] |
|||
unsigned char* destLoc |
|||
unsigned char* srcLoc |
|||
unsigned char* maskLoc |
|||
for (yDest=yDestStart; yDest<dest_h and ySrc<src_h; yDest++) |
|||
destLoc=destLineLoc |
|||
srcLoc=srcLineLoc |
|||
maskLoc=maskLineLoc |
|||
xSrc=xSrcStart |
|||
for (xDest=xDestStart; xDest<dest_w and xSrc<src_w; xDest++) |
|||
rCookedAlpha=(float)*maskLoc/255.0f |
|||
float rCookedInverseAlpha=1.0f-rCookedAlpha |
|||
iSrcChan=0 |
|||
for (iDestChan=0; iDestChan<dest_BytesPP; iDestChan++) |
|||
#alpha formula: (src-dest)*alpharatio+dest |
|||
#for each channel of dest (<3 excludes alpha) |
|||
if iDestChan<3: |
|||
*destLoc=PMath.ByRound( (float)( (float)(*srcLoc-*destLoc)*rCookedAlpha + (float)*destLoc ) ) |
|||
#*destLoc=PMath.ByRound( (float)( rCookedInverseAlpha*(float)*destLoc + rCookedAlpha*(float)*srcLoc ) ) |
|||
|
|||
if iSrcChan<src_BytesPP: |
|||
iSrcChan++ |
|||
srcLoc++ |
|||
|
|||
destLoc++ |
|||
|
|||
while (iSrcChan<src_BytesPP) |
|||
iSrcChan++ |
|||
srcLoc++ |
|||
|
|||
maskLoc+=mask_BytesPP; #does NOT need to be incremented during pixel above since only 1 channel is needed |
|||
xSrc++ |
|||
#Debug_PixelsDone++ |
|||
}#end for xDest while xDest&sSrc both in range |
|||
destLineLoc+=dest_Stride |
|||
srcLineLoc+=src_Stride |
|||
maskLineLoc+=mask_Stride |
|||
ySrc++ |
|||
}#end for yDest while yDest*ySrc both in range |
|||
if (PReporting.getIsMegaDebug()) Console.Error.WriteLine((string)"OK (" |
|||
#+"Debug_PixelsDone:"+Convert.ToString(Debug_PixelsDone) |
|||
+"; xDestStart:"+Convert.ToString(xDestStart) |
|||
+"; yDestStart:"+Convert.ToString(yDestStart) |
|||
+"; xDest:"+Convert.ToString(xDest) |
|||
+"; yDest:"+Convert.ToString(yDest) |
|||
+"; dest_w:"+Convert.ToString(dest_w) |
|||
+"; dest_h:"+Convert.ToString(dest_h) |
|||
+"; xSrcStart:"+Convert.ToString(xSrcStart) |
|||
+"; ySrcStart:"+Convert.ToString(ySrcStart) |
|||
+"; xSrc:"+Convert.ToString(xSrc) |
|||
+"; ySrc:"+Convert.ToString(ySrc) |
|||
+"; src_w:"+Convert.ToString(src_w) |
|||
+"; src_h:"+Convert.ToString(src_h) |
|||
+(string)")") |
|||
}#end if any pixels within range |
|||
else: |
|||
if PReporting.getIsMegaDebug(): |
|||
Console.Error.WriteLine("Draw(dest,...,src,...,mask,...): no pixels within range") |
|||
|
|||
|
|||
|
|||
else Console.Error.WriteLine("Draw using mask buffer Error: null mask for source") |
|||
|
|||
else Console.Error.WriteLine("Draw using mask buffer Error: null source") |
|||
|
|||
else Console.Error.WriteLine("Draw using mask buffer Error: null destination") |
|||
|
|||
catch (exception& exn) |
|||
bGood=False |
|||
PReporting.ShowExn(exn,"drawing using mask buffer","PImage.Draw") |
|||
|
|||
return bGood |
|||
}#end Draw using mask buffer |
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,21 @@ |
|||
#ifndef PIMAGE_H |
|||
#define PIMAGE_H |
|||
|
|||
#include <string> |
|||
#include "preporting.h" |
|||
#include "frameworkdummy.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
class PImage |
|||
public: |
|||
static bool bPushToNearest_ShowMaskChannelError |
|||
static bool bPushToNearestNondirectional_ShowMaskChannelError |
|||
static bool PushToNearest(double& xStart, yStart, mask, int mask_w, int mask_h, int mask_BytesPP, int mask_Stride, int mask_Channel, mask_Threshold, bGreaterThanThreshold_FalseForLessThan) |
|||
static bool PushToNearest(double& xStart, yStart, rDirection_Deg, mask, int mask_w, int mask_h, int mask_BytesPP, int mask_Stride, int mask_Channel, mask_Threshold, bGreaterThanThreshold_FalseForLessThan) |
|||
static bool Draw(unsigned char* dest0, xDestStart, yDestStart, int dest_w, int dest_h, int dest_BytesPP, int dest_Stride, char* src0, int src_w, int src_h, int src_BytesPP, int src_Stride, char* mask0, int mask_BytesPP, int mask_Stride, int mask_Channel) |
|||
|
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,39 @@ |
|||
#ifndef PSTRING_CPP |
|||
#define PSTRING_CPP |
|||
|
|||
#include "pstring.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
char PString.carrDigit[]= {'0','1','2','3','4','5','6','7','8','9'}; #char carrDigit[10] |
|||
''' |
|||
PString.carrDigit[0]='0' |
|||
PString.carrDigit[1]='1' |
|||
PString.carrDigit[2]='2' |
|||
PString.carrDigit[3]='3' |
|||
PString.carrDigit[4]='4' |
|||
PString.carrDigit[5]='5' |
|||
PString.carrDigit[6]='6' |
|||
PString.carrDigit[7]='7' |
|||
PString.carrDigit[8]='8' |
|||
PString.carrDigit[9]='9' |
|||
''' |
|||
def SequenceDigits(self, val, iMinDigits): |
|||
string sReturn=Convert.ToString(val) |
|||
while ((int)sReturn.length()<iMinDigits) sReturn="0"+sReturn |
|||
return sReturn |
|||
}#end SequenceDigits |
|||
def IsDigit(self, val): |
|||
bool bReturn=False |
|||
for (int i=0; i<=9; i++) |
|||
if val==PString.carrDigit[i]: |
|||
bReturn=True |
|||
break |
|||
|
|||
|
|||
return bReturn |
|||
}#end IsDigit |
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,21 @@ |
|||
#ifndef PSTRING_H |
|||
#define PSTRING_H |
|||
|
|||
#include <cstdio> |
|||
#include <string> |
|||
#include <iostream> |
|||
#include "frameworkdummy.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
class PString |
|||
public: |
|||
#static char carrDigit[10] |
|||
static char carrDigit[] |
|||
static string SequenceDigits(int val, iMinDigits) |
|||
static bool IsDigit(char val) |
|||
|
|||
}#end namespace |
|||
|
|||
#endif |
File diff suppressed because it is too large
@ -0,0 +1,131 @@ |
|||
#ifndef TARGA_H |
|||
#define TARGA_H |
|||
|
|||
#include <iostream> |
|||
#include <iomanip> |
|||
#include <fstream> |
|||
#include <memory> |
|||
#include "frameworkdummy.h" |
|||
|
|||
using namespace std |
|||
namespace ProtoArmor |
|||
#Sequential targa.TypeTarga values: |
|||
TypeNoImageData = 0 |
|||
TypeUncompressedColorMapped = 1 |
|||
TypeUncompressedTrueColor = 2 |
|||
TypeUncompressedGrayscale = 3 |
|||
TypeCompressedColorMapped = 9 |
|||
TypeCompressedTrueColor = 10 |
|||
TypeCompressedGrayscale = 11 |
|||
TypeCompressedColorMappedHuffmanAndDeltaAndRLE = 32 |
|||
TypeCompressedColorMappedHuffmanAndDeltaAndRLE4PassQuadTree = 33 |
|||
#Sequential targa.MapType values |
|||
MapType256 = 1 |
|||
#targa.bitsDescriptor bits: |
|||
lownibble565Or888NoAlpha = 0; #bit3 |
|||
lownibbleAlpha5551 = 1; #bit3 #TODO: read GGGBBBBB ARRRRRGG since targa is always low-high (little endian) |
|||
lownibbleAlpha8888 = 8; #bit3 |
|||
bitReserved4 = 16; #bit4 |
|||
bitNoFlip_NonTruevision = 32; #bit5 #Truevision is a registered trademark of Truevision |
|||
bitInterleave4Way = 64; #bit6 |
|||
bitInterleave2Way = 128; #bit7 |
|||
##region prototypes |
|||
def RLESizeUncompressed(self, arrbySrc, iStart, iSrcSize, iBytesPerChunk): |
|||
def Compare(self, arrbySrc1, iSrcLoc1, arrbySrc2, iSrcLoc2, iRun): |
|||
def RLECompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse, bCountOnlyAndReturnNull): |
|||
def RLECompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse): |
|||
def RLEUncompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse, bCountOnlyAndReturnNull): |
|||
def RLEUncompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse): |
|||
def RLEUncompress(self, arrbyDest, iDestSize, arrbySrc, iSrcSize, iBytesPerChunk): |
|||
def RLEUncompress(self, arrbyDest, iDestSizeIrrelevantIfCountOnlyIsTrue, arrbySrc, iSrcSize, iBytesPerChunk, iDestStart, iSrcStart, bCountOnlyAndDontTouchDest): |
|||
|
|||
##region TargaFooter |
|||
class TargaFooter |
|||
private: |
|||
byte *dump |
|||
uint u32SizeofDump |
|||
public: |
|||
TargaFooter() |
|||
TargaFooter(byte* lpbyDataPointerToKeep, u32Size) |
|||
TargaFooter(byte* arrbyDataSrcToCopyFrom, u32Start, u32Count, u32ActualSourceBufferSize) |
|||
~TargaFooter() |
|||
bool Init() |
|||
bool Init(byte* lpbyDataPointerToKeep, u32Size) |
|||
bool Init(FILE* fileNowToReadToEnd) |
|||
bool Init(byte* arrbyDataSrc, u32SrcStart, u32Count, u32ActualSourceBufferSize) |
|||
int TargaFooter.WriteTo(FILE* pfileAlreadyOpen_ToNotCloseInThisMethod) |
|||
int WriteTo(char* byarrDest, iAtDest, iSizeOfDest) |
|||
uint ByteCount() |
|||
|
|||
##endregion TargaFooter |
|||
|
|||
##endregion prototypes |
|||
class Targa |
|||
public: |
|||
string sFile |
|||
TargaFooter footer |
|||
byte *arrbyData |
|||
|
|||
Targa() |
|||
~Targa() |
|||
int BytesPP() |
|||
int Stride() |
|||
int BytesAsUncompressed() |
|||
int BytesBuffer() |
|||
bool Init(int iSetWidth, iSetHeight, iSetBytesPP, bReallocateBuffers) |
|||
bool CopyTo(Targa &targaDest) |
|||
bool DrawFast(byte* arrbyDest, xAtDest, yAtDest, iDestWidth, iDestHeight, iDestBytesPP, iDestStride) |
|||
void ToRect(ref_Rectangle rectReturn) |
|||
void ToRect(ref_RectangleF rectReturn) |
|||
bool From(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, bUsePointerNotCopyData) |
|||
bool From(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, bUsePointerNotCopyData, u32SrcStart) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen, bReInitializeAll) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen, u32SrcStart, bReInitializeAll) |
|||
#int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, fileNow, u32SrcRealLen) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, fileNow, bReInitializeAll) |
|||
#int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, fileNow, u32SrcStart, bReInitializeAll) |
|||
byte* GetBufferPointer() |
|||
bool IsLoaded() |
|||
bool Save() |
|||
bool Save(string sFileNow) |
|||
bool Load(string sFileNow) |
|||
bool IsOK() |
|||
bool Flip() |
|||
bool HasAttrib(byte bit) |
|||
bool IsSavedAsFlipped() |
|||
bool IsCompressed() |
|||
bool SetCompressionRLE(bool bOn) |
|||
string Dump() |
|||
string Dump(bool bDumpFull) |
|||
string Description() |
|||
string Description(bool bVerbose) |
|||
private: |
|||
void DeriveVars() |
|||
void InitNull() |
|||
bool MarkAsCompressed(bool bAsCompressed) |
|||
#header: |
|||
#(byte)(length of id),(byte)(int)MapType,(byte)(int)TypeTarga,(ushort)iMapOrigin,(ushort)iMapLength,(byte)iMapBitDepth,(ushort)xImageLeft,(ushort)yImageBottom,(ushort)iWidth,(ushort)iHeight,(byte)iBitDepth,(byte)bitsDescriptor,(byte[length of id])sID,(byte[iMapLength])(arrbyColorMap),(byte[iBytesAsUncompressed])(arrbyData) |
|||
#int iIDLength; #1 byte implied (length of sID) |
|||
int MapType; #1 byte |
|||
int TypeTarga; #1 byte |
|||
int iMapOrigin; #2 bytes |
|||
int iMapLength; #2 bytes |
|||
int iMapBitDepth; #1 byte |
|||
int xImageLeft; #2 bytes |
|||
int yImageBottom; #2 bytes #TODO: don't flip if not zero |
|||
int iWidth; #2 bytes |
|||
int iHeight; #2 bytes |
|||
int iBitDepth; #1 byte #TODO: 16 is 5.5.5.1 (not !not )IF(not !not ) low nibble of descriptor is 1 (otherwise 5.6.5 and descriptor low nibble is zero) |
|||
byte bitsDescriptor; #1 byte #(default zero) |
|||
string sID; #array of [iTagLength] bytes #[bySizeofID] -- custom non-terminated string |
|||
byte *arrbyColorMap; #array of [] bytes #[byMapBitDepth*wMapLength] -- the palette |
|||
#arrbyData |
|||
#derived fields: |
|||
int iBytesPP |
|||
int iStride |
|||
int iBytesAsUncompressed;#byte sizeof image data only |
|||
int iBytesBuffer |
|||
};#end class Targa |
|||
}#end namespace |
|||
#endif |
File diff suppressed because it is too large
@ -0,0 +1,151 @@ |
|||
#ifndef TARGA_H |
|||
#define TARGA_H |
|||
|
|||
#include <iostream> |
|||
#include <iomanip> |
|||
#include <fstream> |
|||
#include <memory> |
|||
#include "frameworkdummy.h" |
|||
#include "pmemory.h" |
|||
#include "preporting.h" |
|||
|
|||
using namespace std |
|||
|
|||
namespace ProtoArmor |
|||
#Sequential targa.TypeTarga values: |
|||
TypeNoImageData = 0 |
|||
TypeUncompressedColorMapped = 1 |
|||
TypeUncompressedTrueColor = 2 |
|||
TypeUncompressedGrayscale = 3 |
|||
TypeCompressedColorMapped = 9 |
|||
TypeCompressedTrueColor = 10 |
|||
TypeCompressedGrayscale = 11 |
|||
TypeCompressedColorMappedHuffmanAndDeltaAndRLE = 32 |
|||
TypeCompressedColorMappedHuffmanAndDeltaAndRLE4PassQuadTree = 33 |
|||
#Sequential targa.MapType values |
|||
MapType256 = 1 |
|||
#targa.bitsDescriptor low nibble sequential values: |
|||
lownibble565Or888NoAlpha = 0; #bits 0-3 |
|||
lownibbleAlpha5551 = 1; #bits 0-3 #TODO: read GGGBBBBB ARRRRRGG since targa is always low-high (little endian) |
|||
lownibbleAlpha8888 = 8; #bits 0-3 |
|||
#targa.bitsDescriptor bits: |
|||
bitReserved4 = 16; #bit4 |
|||
bitNoFlip_NonTruevision = 32; #bit5 #Truevision is a registered trademark of Truevision |
|||
bitInterleave4Way = 64; #bit6 (of 0 to 7) |
|||
bitInterleave2Way = 128; #bit7 (highest bit) |
|||
##region prototypes |
|||
def RLESizeUncompressed(self, arrbySrc, iStart, iSrcSize, iBytesPerChunk): |
|||
def Compare(self, arrbySrc1, iSrcLoc1, arrbySrc2, iSrcLoc2, iRun): |
|||
def RLECompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse, bCountOnlyAndReturnNull): |
|||
def RLECompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse): |
|||
def RLEUncompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse, bCountOnlyAndReturnNull): |
|||
def RLEUncompress(self, iReturnLength, arrbySrc, iSrcStart, iBytesPerChunk, iBytesToParse): |
|||
def RLEUncompress(self, arrbyDest, iDestSize, arrbySrc, iSrcSize, iBytesPerChunk): |
|||
def RLEUncompress(self, arrbyDest, iDestSizeIrrelevantIfCountOnlyIsTrue, arrbySrc, iSrcSize, iBytesPerChunk, iDestStart, iSrcStart, bCountOnlyAndDontTouchDest): |
|||
##endregion prototypes |
|||
|
|||
##region TargaFooter |
|||
class TargaFooter |
|||
private: |
|||
byte *dump |
|||
uint dump_Length |
|||
public: |
|||
TargaFooter() |
|||
TargaFooter(byte* lpbyDataPointerToKeep, u32Size) |
|||
TargaFooter(byte* arrbyDataSrcToCopyFrom, u32Start, u32Count, u32ActualSourceBufferSize) |
|||
~TargaFooter() |
|||
bool Init() |
|||
bool Init(BinaryReader& streamIn_ToReadToEnd) |
|||
bool Init(byte* lpbyDataPointerToKeep, u32Size) |
|||
bool Init(byte* arrbyDataSrc, u32SrcStart, u32Count, u32ActualSourceBufferSize) |
|||
bool WriteTo(BinaryWriter &streamOut) |
|||
uint ByteCount() |
|||
|
|||
##endregion TargaFooter |
|||
|
|||
class Targa |
|||
public: |
|||
string sFile |
|||
TargaFooter footer |
|||
byte *arrbyData |
|||
|
|||
Targa() |
|||
~Targa() |
|||
int Width() |
|||
int Height() |
|||
int BytesPP() |
|||
int Stride() |
|||
int BytesAsUncompressed() |
|||
int BytesBuffer() |
|||
bool Init(int iSetWidth, iSetHeight, iSetBytesPP, bReallocateBuffers) |
|||
bool CopyTo(Targa &targaDest) |
|||
bool DrawFast(byte* arrbyDest, xAtDest, yAtDest, iDestWidth, iDestHeight, iDestBytesPP, iDestStride) |
|||
void ToRect(ref_Rectangle rectReturn) |
|||
void ToRect(ref_RectangleF rectReturn) |
|||
bool From(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, bUsePointerNotCopyData) |
|||
bool From(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, bUsePointerNotCopyData, u32SrcStart) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, &streamIn, bReInitializeAll) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen, bReInitializeAll) |
|||
int SafeCopyFrom(int iWidthTo, iHeightTo, iBytesPP, arrbySrc, u32SrcRealLen, u32SrcStart, bReInitializeAll) |
|||
byte* GetBufferPointer() |
|||
bool IsLoaded() |
|||
bool Save() |
|||
bool Save(string sFileNow) |
|||
bool Load(string sFileNow) |
|||
bool IsOK() |
|||
bool Flip() |
|||
bool HasAttrib(byte bit) |
|||
bool IsSavedAsFlipped() |
|||
bool IsCompressed() |
|||
bool SetCompressionRLE(bool bOn) |
|||
string Dump() |
|||
string Dump(bool bDumpFull) |
|||
string Description() |
|||
string Description(bool bVerbose) |
|||
void Reflect(int& x, y) |
|||
void Wrap(int& x, y) |
|||
int getChannel_Fast(int x, y, iChan) |
|||
int getChannelReflected(int x, y, iChan) |
|||
void getColorRgbReflected(byte& R, G, B, x, y) |
|||
void getColorArgbReflected(byte& A, R, G, B, x, y) |
|||
void getColorRgb_Fast(byte& R, G, B, x, y) |
|||
void getColorArgb_Fast(byte& A, R, G, B, x, y) |
|||
private: |
|||
void DeriveVars() |
|||
void InitNull() |
|||
bool MarkAsCompressed(bool bAsCompressed) |
|||
#header: |
|||
#(byte)(length of id),(byte)(int)MapType,(byte)(int)TypeTarga,(ushort)iMapOrigin,(ushort)iMapLength,(byte)iMapBitDepth,(ushort)xImageLeft,(ushort)yImageBottom,(ushort)iWidth,(ushort)iHeight,(byte)iBitDepth,(byte)bitsDescriptor,(byte[length of id])sID,(byte[iMapLength])(arrbyColorMap),(byte[iBytesAsUncompressed])(arrbyData) |
|||
#int iIDLength; #1 byte implied (length of sID) |
|||
int MapType; #1 byte |
|||
int TypeTarga; #1 byte |
|||
int iMapOrigin; #2 bytes |
|||
int iMapLength; #2 bytes |
|||
int iMapBitDepth; #1 byte |
|||
int xImageLeft; #2 bytes |
|||
int yImageBottom; #2 bytes #TODO: don't flip if not zero |
|||
int iWidth; #2 bytes |
|||
int iHeight; #2 bytes |
|||
int iBitDepth; #1 byte #TODO: 16 is 5.5.5.1 (not !not )IF(not !not ) low nibble of descriptor is 1 (otherwise 5.6.5 and descriptor low nibble is zero) |
|||
|
|||
#/<summary> |
|||
#/Bits 0-3: number of bits of the pixel that are the alpha channel (i.e. 8 for BGRA32 or 1 for 5551 or 0 for BGRx32) |
|||
#/Bit 4: reserved |
|||
#/Bit 5: screen origin -- {0:lower left; 1:upper left} usually 0 |
|||
#/Bits 7-6: interleaving nibble {00:non-interleaved; 01:even-odd; 10:four way; 11: reserved |
|||
#/</summary> |
|||
byte bitsDescriptor; #1 byte #(usually zero; 17th byte) |
|||
|
|||
string sID; #array of [iTagLength] bytes #[bySizeofID] -- custom non-terminated string |
|||
byte *arrbyColorMap; #array of [] bytes #[byMapBitDepth*wMapLength] -- the palette |
|||
#arrbyData |
|||
#derived fields: |
|||
int iBytesPP |
|||
int iStride |
|||
int iBytesAsUncompressed;#byte sizeof image data only |
|||
int iBytesBuffer |
|||
|
|||
}#end namespace |
|||
|
|||
#endif |
@ -0,0 +1,33 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#define _CRT_SECURE_NO_DEPRECATE |
|||
#define _CRT_SECURE_NO_WARNINGS |
|||
#include <stddef.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
#include <math.h> |
|||
|
|||
#include <windows.h> |
@ -0,0 +1,220 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#include "stdafx.h" |
|||
#include <vd2/VDXFrame/VideoFilter.h> |
|||
|
|||
#####################################/ |
|||
|
|||
VDXVideoFilter.VDXVideoFilter() |
|||
|
|||
|
|||
VDXVideoFilter.~VDXVideoFilter() |
|||
|
|||
|
|||
def SetHooks(self, *fa, *ff): |
|||
self.fa = fa |
|||
self.ff = ff |
|||
|
|||
|
|||
#####################################/ |
|||
|
|||
def Init(self): |
|||
return True |
|||
|
|||
|
|||
def Start(self): |
|||
|
|||
|
|||
def End(self): |
|||
|
|||
|
|||
def Configure(self, hwnd): |
|||
return hwnd != NULL |
|||
|
|||
|
|||
def GetSettingString(self, *buf, maxlen): |
|||
|
|||
|
|||
def GetScriptString(self, *buf, maxlen): |
|||
|
|||
|
|||
def Serialize(self, *buf, maxbuf): |
|||
return 0 |
|||
|
|||
|
|||
def Deserialize(self, *buf, maxbuf): |
|||
return 0 |
|||
|
|||
|
|||
def Prefetch(self, frame): |
|||
return frame |
|||
|
|||
|
|||
def Prefetch2(self, frame, *prefetcher): |
|||
prefetcher.PrefetchFrame(0, Prefetch(frame), 0) |
|||
return True |
|||
|
|||
|
|||
def OnEvent(self, event, *eventData): |
|||
switch(event) |
|||
case kVDXVFEvent_InvalidateCaches: |
|||
return OnInvalidateCaches() |
|||
|
|||
default: |
|||
return False |
|||
|
|||
|
|||
|
|||
def OnInvalidateCaches(self): |
|||
return False |
|||
|
|||
|
|||
#####################################/ |
|||
|
|||
void __cdecl VDXVideoFilter.FilterDeinit (VDXFilterActivation *fa, *ff) |
|||
(*reinterpret_cast<VDXVideoFilter **>(fa.filter_data)).~VDXVideoFilter() |
|||
|
|||
|
|||
int __cdecl VDXVideoFilter.FilterRun ( VDXFilterActivation *fa, *ff) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
pThis.Run() |
|||
return 0 |
|||
|
|||
|
|||
long __cdecl VDXVideoFilter.FilterParam (VDXFilterActivation *fa, *ff) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
return pThis.GetParams() |
|||
|
|||
|
|||
int __cdecl VDXVideoFilter.FilterConfig (VDXFilterActivation *fa, *ff, hwnd) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
return not pThis.Configure(hwnd) |
|||
|
|||
|
|||
int __cdecl VDXVideoFilter.FilterStart (VDXFilterActivation *fa, *ff) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
pThis.Start() |
|||
return 0 |
|||
|
|||
|
|||
int __cdecl VDXVideoFilter.FilterEnd (VDXFilterActivation *fa, *ff) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
pThis.End() |
|||
return 0 |
|||
|
|||
|
|||
void __cdecl VDXVideoFilter.FilterString ( VDXFilterActivation *fa, *ff, *buf) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
pThis.GetScriptString(buf, 80) |
|||
|
|||
|
|||
bool __cdecl VDXVideoFilter.FilterScriptStr(VDXFilterActivation *fa, *ff, *buf, buflen) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
pThis.GetScriptString(buf, buflen) |
|||
|
|||
return True |
|||
|
|||
|
|||
void __cdecl VDXVideoFilter.FilterString2 ( VDXFilterActivation *fa, *ff, *buf, maxlen) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
pThis.GetSettingString(buf, maxlen) |
|||
|
|||
|
|||
int __cdecl VDXVideoFilter.FilterSerialize (VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
return pThis.Serialize(buf, maxbuf) |
|||
|
|||
|
|||
void __cdecl VDXVideoFilter.FilterDeserialize (VDXFilterActivation *fa, *ff, *buf, maxbuf) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = fa |
|||
|
|||
pThis.Deserialize(buf, maxbuf) |
|||
|
|||
|
|||
sint64 __cdecl VDXVideoFilter.FilterPrefetch( VDXFilterActivation *fa, *ff, frame) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
return pThis.Prefetch(frame) |
|||
|
|||
|
|||
bool __cdecl VDXVideoFilter.FilterPrefetch2( VDXFilterActivation *fa, *ff, frame, *prefetcher) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
return pThis.Prefetch2(frame, prefetcher) |
|||
|
|||
|
|||
bool __cdecl VDXVideoFilter.FilterEvent( VDXFilterActivation *fa, *ff, event, *eventData) |
|||
VDXVideoFilter *pThis = *reinterpret_cast<VDXVideoFilter **>(fa.filter_data) |
|||
|
|||
pThis.fa = const_cast<VDXFilterActivation *>(fa) |
|||
|
|||
return pThis.OnEvent(event, eventData) |
|||
|
|||
|
|||
def SafePrintf(self, *buf, maxbuf, *format, ...): |
|||
if maxbuf <= 0: |
|||
return |
|||
|
|||
va_list val |
|||
va_start(val, format) |
|||
if (unsigned)_vsnprintf(buf, maxbuf, format, val) >= (unsigned)maxbuf: |
|||
buf[maxbuf - 1] = 0 |
|||
va_end(val) |
|||
|
|||
|
|||
VDXScriptFunctionDef VDXVideoFilter.sScriptMethods[1]= {0 |
@ -0,0 +1,95 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#include "stdafx.h" |
|||
#include <windows.h> |
|||
#include <vd2/VDXFrame/VideoFilterDialog.h> |
|||
|
|||
namespace |
|||
#if defined(_MSC_VER) and _MSC_VER >= 1300 |
|||
extern "C" char __ImageBase |
|||
|
|||
def GetLocalHInstance(self): |
|||
return (HINSTANCE)&__ImageBase |
|||
|
|||
#else: |
|||
def GetLocalHInstance(self): |
|||
meminfo = {0 |
|||
if not VirtualQuery(GetLocalHInstance, &meminfo, sizeof(meminfo)): |
|||
return NULL |
|||
|
|||
return (HINSTANCE)meminfo.AllocationBase |
|||
|
|||
#endif |
|||
|
|||
|
|||
VDXVideoFilterDialog.VDXVideoFilterDialog() |
|||
: mhdlg(NULL) |
|||
|
|||
|
|||
def Show(self, hInst, templName, parent): |
|||
if not hInst: |
|||
hInst = GetLocalHInstance() |
|||
|
|||
return DialogBoxParamA(hInst, templName, parent, StaticDlgProc, (LPARAM)self) |
|||
|
|||
|
|||
def Show(self, hInst, templName, parent): |
|||
if not hInst: |
|||
hInst = GetLocalHInstance() |
|||
|
|||
return DialogBoxParamW(hInst, templName, parent, StaticDlgProc, (LPARAM)self) |
|||
|
|||
|
|||
def ShowModeless(self, hInst, templName, parent): |
|||
if not hInst: |
|||
hInst = GetLocalHInstance() |
|||
|
|||
return CreateDialogParamA(hInst, templName, parent, StaticDlgProc, (LPARAM)self) |
|||
|
|||
|
|||
def ShowModeless(self, hInst, templName, parent): |
|||
if not hInst: |
|||
hInst = GetLocalHInstance() |
|||
|
|||
return CreateDialogParamW(hInst, templName, parent, StaticDlgProc, (LPARAM)self) |
|||
|
|||
|
|||
INT_PTR CALLBACK VDXVideoFilterDialog.StaticDlgProc(HWND hdlg, msg, wParam, lParam) |
|||
VDXVideoFilterDialog *pThis |
|||
|
|||
if msg == WM_INITDIALOG: |
|||
pThis = (VDXVideoFilterDialog *)lParam |
|||
SetWindowLongPtr(hdlg, DWLP_USER, (LONG_PTR)pThis) |
|||
pThis.mhdlg = hdlg |
|||
|
|||
else: |
|||
pThis = (VDXVideoFilterDialog *)GetWindowLongPtr(hdlg, DWLP_USER) |
|||
|
|||
return pThis ? pThis.DlgProc(msg, wParam, lParam) : FALSE |
|||
|
|||
|
|||
def DlgProc(self, msg, wParam, lParam): |
|||
return FALSE |
|||
|
@ -0,0 +1,72 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#include "stdafx.h" |
|||
#include <vd2/VDXFrame/VideoFilterEntry.h> |
|||
|
|||
int g_VFVAPIVersion |
|||
VDXFilterDefinition **g_VDXRegisteredFilters |
|||
int g_VDXRegisteredFilterCount |
|||
|
|||
VDXFilterDefinition *VDXGetVideoFilterDefinition(int index) |
|||
|
|||
def VDXVideoFilterModuleInit2(self, VDXFilterModule *fm, *ff, vdfd_ver, vdfd_compat, ver_compat_target): |
|||
def_count = 0 |
|||
|
|||
while(VDXGetVideoFilterDefinition(def_count)) |
|||
++def_count |
|||
|
|||
g_VDXRegisteredFilters = (VDXFilterDefinition **)malloc(sizeof(VDXFilterDefinition *) * def_count) |
|||
if not g_VDXRegisteredFilters: |
|||
return 1 |
|||
|
|||
memset(g_VDXRegisteredFilters, 0, sizeof(VDXFilterDefinition *) * def_count) |
|||
|
|||
for(int i=0; i<def_count; ++i) |
|||
g_VDXRegisteredFilters[i] = ff.addFilter(fm, VDXGetVideoFilterDefinition(i), sizeof(VDXFilterDefinition)) |
|||
|
|||
g_VFVAPIVersion = vdfd_ver |
|||
vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION |
|||
vdfd_compat = ver_compat_target |
|||
|
|||
return 0 |
|||
|
|||
|
|||
def VDXVideoFilterModuleDeinit(self, VDXFilterModule *fm, *ff): |
|||
if g_VDXRegisteredFilters: |
|||
for(int i=g_VDXRegisteredFilterCount-1; i>=0; --i) |
|||
VDXFilterDefinition *def = g_VDXRegisteredFilters[i] |
|||
|
|||
if def: |
|||
ff.removeFilter(def) |
|||
|
|||
|
|||
free(g_VDXRegisteredFilters) |
|||
g_VDXRegisteredFilters = NULL |
|||
|
|||
|
|||
|
|||
def VDXGetVideoFilterAPIVersion(self): |
|||
return g_VFVAPIVersion |
|||
|
@ -0,0 +1,25 @@ |
|||
# VDXFrame - Helper library for VirtualDub plugins |
|||
# Copyright (C) 2008 Avery Lee |
|||
# |
|||
# The plugin headers in the VirtualDub plugin SDK are licensed differently |
|||
# differently than VirtualDub and the Plugin SDK themselves. This |
|||
# particular file is thus licensed as follows (the "zlib" license): |
|||
# |
|||
# This software is provided 'as-is', any express or implied |
|||
# warranty. In no event will the authors be held liable for any |
|||
# damages arising from the use of self software. |
|||
# |
|||
# Permission is granted to anyone to use self software for any purpose, |
|||
# including commercial applications, to alter it and redistribute it |
|||
# freely, to the following restrictions: |
|||
# |
|||
# 1. The origin of self software must not be misrepresented; you must |
|||
# not claim that you wrote the original software. If you use self |
|||
# software in a product, acknowledgment in the product |
|||
# documentation would be appreciated but is not required. |
|||
# 2. Altered source versions must be plainly marked as such, must |
|||
# not be misrepresented as being the original software. |
|||
# 3. This notice may not be removed or altered from any source |
|||
# distribution. |
|||
|
|||
#include "stdafx.h" |
Loading…
Reference in new issue