buletti
4th August 2008, 23:03
Hi folks,
I'm trying to created a script to convert 24 fps to 30 fps. Instead of using a pulldown that is basically repeating existing frames to match the frame rate, I wanted to compute new, intermediate frames. Here's the script:
function convert24to30(clip clp) {
clp
AssumeFPS(24) # treat 23.976 as 24.00
### segement the base clip in 6 clips of 4 frames
firstSet = SelectEvery(24, 0,1,2,3) # frame set of 4 frames
firstEndFrame = SelectEvery(24, 3) # remember last frame of the set
secondSet = SelectEvery(24, 4,5,6,7)
secondEndFrame = SelectEvery(24, 7)
thirdSet = SelectEvery(24, 8,9,10,11)
thirdEndFrame = SelectEvery(24, 11)
fourthSet = SelectEvery(24, 12,13,14,15)
fourthEndFrame = SelectEvery(24, 15)
fifthSet = SelectEvery(24, 16,17,18,19)
fifthEndFrame = SelectEvery(24, 19)
sixthSet = SelectEvery(24, 20,21,22,23)
sixthEndFrame = SelectEvery(24, 23)
### interpolate a fifth frame for the set of four frames
newFrameFive = generateFrame(firstEndFrame)
### create sequence 0,1,2,3,new frame
firstSetOfFive = UnalignedSplice(firstSet, newFrameFive.AssumeFPS(firstSet))
newFrameTen = generateFrame(secondEndFrame)
secondSetOfFive = UnalignedSplice(secondSet, newFrameTen.AssumeFPS(secondSet))
newFrameFifteen = generateFrame(thirdEndFrame)
thirdSetOfFive = UnalignedSplice(thirdSet, newFrameFifteen.AssumeFPS(thirdSet))
newFrameTwenty = generateFrame(fourthEndFrame)
fourthSetOfFive = UnalignedSplice(fourthSet, newFrameTwenty.AssumeFPS(fourthSet))
newFrameTwentyfive = generateFrame(fifthEndFrame)
fifthSetOfFive = UnalignedSplice(fifthSet, newFrameTwentyfive.AssumeFPS(fifthSet))
newFrameThirty = generateFrame(sixthEndFrame)
sixthSetOfFive = UnalignedSplice(sixthSet, newFrameThirty.AssumeFPS(sixthSet))
### combine the 6 5-frame-sets
UnalignedSplice(firstSetOfFive, secondSetOfFive, thirdSetOfFive, fourthSetOfFive, fifthSetOfFive, sixthSetOfFive)
return last
}
function generateFrame(clip clp) {
global idx1 = 10
idx1 = idx1 + 1
backward_vec = clp.MVAnalyse(isb = true, truemotion=true, blksize=8, overlap=4, pel=2, search=3,
\ searchparam=10, sharp=2, idx=idx1, dct=1)
forward_vec = clp.MVAnalyse(isb = false, truemotion=true, blksize=8, overlap=4, pel=2, search=3,
\ searchparam=10, sharp=2, idx=idx1, dct=1)
newFrame = clp.MVFlowInter(backward_vec, forward_vec, time=50.0, mL=80.0, thSAD=300, idx=idx1)
return newFrame
}
The script works fine in respect of increasing the frame rate. However, I'm wondering about the results of MVFlowInter. The generated frames look exactly the same as their originating frames. I cannot see that MVFlowInter creates a "picture at some intermediate time moment between current and next frame". Considering the "time" parameter I expected a frame that is temporally located in the middle between "current" and "next". Instead I just get another "current".
Any hints are appreciated.
I'm trying to created a script to convert 24 fps to 30 fps. Instead of using a pulldown that is basically repeating existing frames to match the frame rate, I wanted to compute new, intermediate frames. Here's the script:
function convert24to30(clip clp) {
clp
AssumeFPS(24) # treat 23.976 as 24.00
### segement the base clip in 6 clips of 4 frames
firstSet = SelectEvery(24, 0,1,2,3) # frame set of 4 frames
firstEndFrame = SelectEvery(24, 3) # remember last frame of the set
secondSet = SelectEvery(24, 4,5,6,7)
secondEndFrame = SelectEvery(24, 7)
thirdSet = SelectEvery(24, 8,9,10,11)
thirdEndFrame = SelectEvery(24, 11)
fourthSet = SelectEvery(24, 12,13,14,15)
fourthEndFrame = SelectEvery(24, 15)
fifthSet = SelectEvery(24, 16,17,18,19)
fifthEndFrame = SelectEvery(24, 19)
sixthSet = SelectEvery(24, 20,21,22,23)
sixthEndFrame = SelectEvery(24, 23)
### interpolate a fifth frame for the set of four frames
newFrameFive = generateFrame(firstEndFrame)
### create sequence 0,1,2,3,new frame
firstSetOfFive = UnalignedSplice(firstSet, newFrameFive.AssumeFPS(firstSet))
newFrameTen = generateFrame(secondEndFrame)
secondSetOfFive = UnalignedSplice(secondSet, newFrameTen.AssumeFPS(secondSet))
newFrameFifteen = generateFrame(thirdEndFrame)
thirdSetOfFive = UnalignedSplice(thirdSet, newFrameFifteen.AssumeFPS(thirdSet))
newFrameTwenty = generateFrame(fourthEndFrame)
fourthSetOfFive = UnalignedSplice(fourthSet, newFrameTwenty.AssumeFPS(fourthSet))
newFrameTwentyfive = generateFrame(fifthEndFrame)
fifthSetOfFive = UnalignedSplice(fifthSet, newFrameTwentyfive.AssumeFPS(fifthSet))
newFrameThirty = generateFrame(sixthEndFrame)
sixthSetOfFive = UnalignedSplice(sixthSet, newFrameThirty.AssumeFPS(sixthSet))
### combine the 6 5-frame-sets
UnalignedSplice(firstSetOfFive, secondSetOfFive, thirdSetOfFive, fourthSetOfFive, fifthSetOfFive, sixthSetOfFive)
return last
}
function generateFrame(clip clp) {
global idx1 = 10
idx1 = idx1 + 1
backward_vec = clp.MVAnalyse(isb = true, truemotion=true, blksize=8, overlap=4, pel=2, search=3,
\ searchparam=10, sharp=2, idx=idx1, dct=1)
forward_vec = clp.MVAnalyse(isb = false, truemotion=true, blksize=8, overlap=4, pel=2, search=3,
\ searchparam=10, sharp=2, idx=idx1, dct=1)
newFrame = clp.MVFlowInter(backward_vec, forward_vec, time=50.0, mL=80.0, thSAD=300, idx=idx1)
return newFrame
}
The script works fine in respect of increasing the frame rate. However, I'm wondering about the results of MVFlowInter. The generated frames look exactly the same as their originating frames. I cannot see that MVFlowInter creates a "picture at some intermediate time moment between current and next frame". Considering the "time" parameter I expected a frame that is temporally located in the middle between "current" and "next". Instead I just get another "current".
Any hints are appreciated.