Code:
ROBOCROP_DEBUG=False
DBUG=FALSE
c
myName="DBSC_DynaCrop: "
Valid=DBSC_ScanValidate(ScanDB,MustExist=True,name=myName)
Assert(Valid,RT_String("%sInvalid ScanDB\n%s",myName,ScanDB))
Records=RT_DBaseRecords(ScanDB)
Assert(Records==FrameCount,RT_String("%sScanDB Records != FrameCount",myName))
SpliceDB=Default(SpliceDB,"")
c2 = 0
_W_=Default(W,width) _H_=Default(H,height)
Resizer=Default(Resizer,"Spline64Resize(_W_,_H_)") # Resizer to use
TResizer="t."+Resizer
CropThresh=Float(Default(CropThresh,-32.0)) # Absolute Thresh
ATM=Float(Default(ATM,16.0)) # ATM Switched almost OFF
RLBT=Default(RLBT,15)
Assert(RLBT>=1 && RLBT<=15,RT_String("%sRLBT 1->15 Only",myName))
LeftAdd=Default(LeftAdd,0) TopAdd=Default(TopAdd,0) RightAdd=Default(RightAdd,0) BotAdd=Default(BotAdd,0)
CSX=RT_ColorSpaceXMod(c) CSY=RT_ColorSpaceYMod(c,laced=False)
CropLimit=Default(CropLimit,16)
CropLimit_Left = (Default(CropLimit_Left,CropLimit) + CSX/2) / CSX * CSX
CropLimit_Top = (Default(CropLimit_Top,CropLimit) + CSY/2) / CSY * CSY
CropLimit_Right= (Default(CropLimit_Right,CropLimit)+ CSX/2) / CSX * CSX
CropLimit_Bot = (Default(CropLimit_bot,CropLimit) + CSY/2) / CSY * CSY
DissolveSkip=Default(DissolveSkip,5)
Assert(DissolveSkip>=0 && DissolveSkip<=10,RT_String("%sDissolveSkip 0->10 only",myName))
LogFn=Default(LogFn,"DBSC_DynaCrop.log")
LogTMPT=Default(LogTMPT,RT_String("V_NNNN_ = Trim(_S_,_E_).Crop(_CX_,_CY_,_-CW_,_-CH_)._RSZ_\t\t# Crop_W= _CW_ Crop_H= _CH_"))
Show=Default(Show,False) Debug=Default(Debug,false)
(Exist(LogFn)) ? RT_FileDelete(LogFn) : NOP # Delete existing Log
EOL=Chr(10)
FND=RT_String("_RSZ_\n_NNNN_\n_S_\n_E_\n_CX_\n_CY_\n_CW_\n_CH_\n_-CW_\n_-CH_\n_W_\n_H_\n_IW_\n_IH_\n")
TmpLog="~DynaCropTmp_"+RT_LocalTimeString+".log"
(Exist(TmpLog)) ? RT_FileDelete(TmpLog) : NOP # Delete existing TmpLog
GScript("""
if(SpliceDB!="") {
if(Exist(SpliceDB)) {
Fields=RT_DBaseFields(SpliceDB)
Assert(Fields>=13,RT_String("%sInvalid SpliceDB, at least 12 Int fields and 1 String[256] field\n%s",myName,SpliceDB))
for(i=0,11) {
Assert(RT_DBaseFieldType(SpliceDB,i)==1,RT_String("%sSpliceDB field %d is NOT type Int\n%s",myName,i,SpliceDB))
}
Assert(RT_DBaseFieldType(SpliceDB,12)==3,RT_String("%sSpliceDB field 12 is NOT type String\n%s",myName,SpliceDB))
if(RT_DBaseRecords(SpliceDB) != 0) {
TypeString="iiiiiiiiiiiis"
if(Fields>13) {
for(i=13,Fields-1) {
Type=RT_DBaseFieldType(SpliceDB,i)
sz=RT_DBaseFieldSize(SpliceDB,i)
TypeString=TypeString+Select(Type,"b","i","f",RT_String("s%d",sz),"b","f")
}
}
(DEBUG)?RT_DebugF("Re-Alloc zero record SpliceDB, TypeString=%s",TypeString,name=myName):NOP
RT_DBaseAlloc(SpliceDB,0,TypeString)
} else {
(DEBUG)?RT_DebugF("Using existing zero record SpliceDB:- %s",SpliceDB,name=myName):NOP
}
} else {
(DEBUG)?RT_DebugF("Allocating Default format SpliceDB:- %s",SpliceDB,name=myName):NOP
RT_DBaseAlloc(SpliceDB,0,"iiiiiiiiiiiis")
}
}
RoboCrop(SAMPLES=Max(Round(Records/100.0),32),ignore=0.2,laced=False,rlbt=RLBT,LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG)
Wid=Width Hit=Height
ts=RT_ReadTxtFromFile(TmpLog) Outer_x=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) Outer_y=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) Outer_w=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) Outer_h=RT_NumberValue(ts)
Outer_XR=c.Width-Outer_x-Outer_w Outer_YB=c.Height-Outer_y-Outer_h
(DEBUG)?RT_DebugF("Outermost crop Coords = %d,%d,%d,%d (%dx%d)",Outer_x,Outer_y,Outer_XR,Outer_YB,Outer_w,Outer_h,name=myName):NOP
Start=0 End=-1 SceneNo=0 SceneCount=RT_DBaseGetField(ScanDB,Records-1,3)+1
for(n=0,Records-1) {
Start=n End=RT_DBaseGetField(ScanDB,n,1)
if(End-Start+1 >= DissolveSkip*4) {
DStart=Start+DissolveSkip DEnd=End-DissolveSkip
} Else {
DStart=Start DEnd=End
}
IGNORE=2.0 # Allow for significant CGI text
CropC = RoboCrop(thresh=CROPTHRESH,atm=ATM,ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,
\ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
ts=RT_ReadTxtFromFile(TmpLog) XL=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) YT=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) CW=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) CH=RT_NumberValue(ts)
XR=(Wid-XL-CW) YB=(Hit-YT-CH)
(DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
if(XL>CropLimit_Left || YT>CropLimit_Top || XR>CropLimit_Right || YB>CropLimit_Bot) {
RT_DebugF("*** Trim(%d,%d) Scene #%d, %d,%d,%d,%d",Start,End,SceneNo+1,XL,YT,XR,YB,name=myName)
(DEBUG)?RT_DebugF("*** RoboCrop, CROP LIMIT EXCEEDED, Repeating Call with RoboCrop Default AutoThresh & ATM & Ignore=1.0",name=myName):NOP
IGNORE=1.0 # Allow for lil bit CGI text
CropC = RoboCrop(ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,
\ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
ts=RT_ReadTxtFromFile(TmpLog) TXL=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TYT=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TCW=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TCH=RT_NumberValue(ts)
TXR=(Wid-TXL-TCW) TYB=(Hit-TYT-CH)
(DBUG)?RT_DebugF("TMP: XL=%d YT=%d XR=%d YB=%d",TXL,TYT,TXR,TYB,name=myName):NOP
XL=(XL<=CropLimit_Left) ? XL : (TXL<=CropLimit_Left) ? TXL : Min(XL,TXL)
YT=(YT<=CropLimit_Top) ? YT : (TYT<=CropLimit_Top) ? TYT : Min(YT,TYT)
XR=(XR<=CropLimit_Right)? XR : (TXR<=CropLimit_Right)? TXR : Min(XR,TXR)
YB=(YB<=CropLimit_Bot) ? YB : (TYB<=CropLimit_Bot) ? TYB : Min(YB,TYB)
(DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
if(XL>CropLimit_Left || YT>CropLimit_Top || XR>CropLimit_Right || YB>CropLimit_Bot) {
(DEBUG)?RT_DebugF("**** RoboCrop, LIMIT EXCEEDED, Repeating Call with RoboCrop Default AutoThresh & ATM=1.0 & Ingore=0.2",name=myName):NOP
IGNORE=0.2 # No CGI text
CropC = RoboCrop(ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,ATM=1.0,
\ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
ts=RT_ReadTxtFromFile(TmpLog) TXL=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TYT=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TCW=RT_NumberValue(ts)
ts=MidStr(ts,FindStr(ts," ")+1) TCH=RT_NumberValue(ts)
TXR=(Wid-TXL-TCW) TYB=(Hit-TYT-CH)
(DBUG)?RT_DebugF("TMP: XL=%d YT=%d XR=%d YB=%d",TXL,TYT,TXR,TYB,name=myName):NOP
XL=(XL<=CropLimit_Left) ? XL : (TXL<=CropLimit_Left) ? TXL : CropLimit_Left
YT=(YT<=CropLimit_Top) ? YT : (TYT<=CropLimit_Top) ? TYT : CropLimit_Top
XR=(XR<=CropLimit_Right)? XR : (TXR<=CropLimit_Right)? TXR : CropLimit_Right
YB=(YB<=CropLimit_Bot) ? YB : (TYB<=CropLimit_Bot) ? TYB : CropLimit_Bot
(DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
}
}
Curr_w=Wid-XL-XR Curr_h=Hit-YT-YB
(DEBUG)?RT_DebugF("Trim(%d,%d) Scene #%d, %d,%d,%d,%d (W=%d,H=%d)",Start,End,SceneNo+1,XL,YT,-XR,-YB,Curr_w,Curr_h,name=myName):NOP
XX=Outer_x+XL YY=Outer_y+YT WW=Curr_w -(c.Width -Outer_x-XL) HH=Curr_h -(c.Height-Outer_y-YT)
REP =
\ Resizer + EOL +
\ RT_NumberString(SceneNo,width=4) + EOL +
\ RT_NumberString(Start) + EOL +
\ RT_NumberString(End) + EOL +
\ RT_NumberString(XX) + EOL +
\ RT_NumberString(YY) + EOL +
\ RT_NumberString(Curr_w) + EOL +
\ RT_NumberString(Curr_h) + EOL +
\ RT_NumberString(WW) + EOL +
\ RT_NumberString(HH) + EOL +
\ RT_NumberString(_W_) + EOL +
\ RT_NumberString(_H_) + EOL +
\ RT_NumberString(c.Width) + EOL +
\ RT_NumberString(c.Height) + EOL
LOG=RT_StrReplaceMulti(LogTMPT,FND,REP)
RT_WriteFile(LogFn,"%s",LOG,append=True)
if(SpliceDB!="") {
RT_DBaseExtend(SpliceDB) # Add a single record to DBase
RT_DBaseSetField(SpliceDB,SceneNo,0,Start) # Scene start frame
RT_DBaseSetField(SpliceDB,SceneNo,1,End) # Scene End frame
RT_DBaseSetField(SpliceDB,SceneNo,2,c.Width) # Input clip width (same for all DB).
RT_DBaseSetField(SpliceDB,SceneNo,3,c.Height) # Input clip Height (same for all DB).
RT_DBaseSetField(SpliceDB,SceneNo,4,_W_) # Output clip resize width (same for all DB).
RT_DBaseSetField(SpliceDB,SceneNo,5,_H_) # Output clip resize height (same for all DB).
RT_DBaseSetField(SpliceDB,SceneNo,6,XX) # Scene Crop left offset
RT_DBaseSetField(SpliceDB,SceneNo,7,YY) # Scene Crop top offset
RT_DBaseSetField(SpliceDB,SceneNo,8,Curr_w) # Scene Abs Crop width
RT_DBaseSetField(SpliceDB,SceneNo,9,Curr_h) # Scene Abs Crop height
RT_DBaseSetField(SpliceDB,SceneNo,10,WW) # Scene signed crop width (width relative)
RT_DBaseSetField(SpliceDB,SceneNo,11,HH) # Scene signed crop Height (height relative)
RT_DBaseSetField(SpliceDB,SceneNo,12,Resizer) # Resizer String, Same for all DB
}
t=c.Trim(Start,End).Crop(XX,YY,WW,HH)
t=Eval(TResizer) # Resize using optional resizer
t = (Show) ? t.RT_Subtitle("#%d/%d S=%d E=%d L=%d\nCrop(\aQ%d+\a-%d,\aQ%d+\a-%d,\aQ-%d\a--%d,\aQ-%d\a--%d) : %dx%d",
\ SceneNo+1,SceneCount,Start,End,End-Start+1,Outer_x,XL,Outer_y,YT,Outer_XR,XR,Outer_YB,YB,Curr_w,Curr_h,align=5) : t
c2 = (c2.IsClip()) ? c2++t : t # Splice
SceneNo=SceneNo+1
n = End # Next iteration n = End + 1, ie Start of Next Scene
}
RT_DBaseSetID(SpliceDB,0,DBSC_Str2ID("DYNS"))
(Exist(TmpLog)) ? RT_FileDelete(TmpLog) : NOP # Delete temp Log
""")
return c2
}