Welcome Guest ( Log In | Register )


Important

The forums will be closing permanently the weekend of March 15th. Please see the notice in the announcements forum for details.

 
Prefetching Multiple Source Frames In Vdub.
« Next Oldest | Next Newest » Track this topic | Email this topic | Print this topic
diablo23q
Posted: Jul 18 2011, 01:32 PM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



Hi everyone,

Need some help. Could someone explain me how to deal with prefetchProc2 and mpInputFrames/mpOutputFrames arrays? A small example would be great.
Thank you.
 
     Top
phaeron
Posted: Jul 24 2011, 02:33 AM


Virtualdub Developer


Group: Administrator
Posts: 7773
Member No.: 61
Joined: 30-July 02



Use the prefetcher object passed to prefetchProc2 to request the source frames that you want.

In runProc, the requested source frames appear in the order you requested them in the mpInputFrames array. Process those into the buffer pointed to by mpOutputFrames[0].
 
    Top
diablo23q
Posted: Jul 24 2011, 02:44 PM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



So prefetchProc2 will simply look like:
CODE
bool prefetchProc2(const VDXFilterActivation *fa, const VDXFilterFunctions *ff, sint64 frame, IVDXVideoPrefetcher *prefetcher) {
prefetcher->PrefetchFrame(0, frame, 1);
prefetcher->PrefetchFrame(0, frame + 1, 2);
return true;
}

And in runProc I can get this frames via fa->mpSourceFrames[0] and fa->mpSourceFrames[1] ?
 
     Top
phaeron
Posted: Jul 31 2011, 11:50 PM


Virtualdub Developer


Group: Administrator
Posts: 7773
Member No.: 61
Joined: 30-July 02



Yup. You don't need to set the cookie value to 1 and 2 respectively, though, if you're not actually going to use it. No matter what you set those to, you would always receive #frame in element [0] and #frame+1 in element [1].
 
    Top
diablo23q
Posted: Aug 3 2011, 08:27 PM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



I think I'm doing something wrong sad.gif Frame in mpInputFrames[0] is always correct, but in other elements I get some random trash. For example following runProc crashes:
CODE
int runProc(const VDXFilterActivation *fa, const VDXFilterFunctions *ff) {
PixDim w, h;
const VDXFBitmap& frame0 = *fa->mpSourceFrames[0];
const VDXFBitmap& frame1 = *fa->mpSourceFrames[1];

const Pixel32 *src = (Pixel32 *)frame0.data;
const Pixel32 *src2 = (Pixel32 *)frame1.data;
Pixel32 *dst = (Pixel32 *)fa->mpOutputFrames[0]->data;

h = frame0.h;
do {
       w = frame0.w;
       do {
               *dst++ = ((*src++) + (*src2++))/2;          
       } while(--w);
       src = (Pixel32 *)((char *)src + frame0.modulo);
       src2 = (Pixel32 *)((char *)src2 + frame1.modulo);
       dst = (Pixel32 *)((char *)dst + fa->mpOutputFrames[0]->modulo);
   } while(--h);
   return 0;
}

Where did I go wrong?
 
     Top
jpsdr
Posted: Aug 4 2011, 08:05 AM


Advanced Member


Group: Members
Posts: 335
Member No.: 20490
Joined: 23-December 06



You use old format/information wich are not valid with new structure.

Correct use would be :
CODE

int runProc(const VDXFilterActivation *fa, const VDXFilterFunctions *ff) {
sint32 h,w;

const VDXPixmap& frame0 = *fa->mpSourceFrames[0]->mpPixmap;
const VDXPixmap& frame1 = *fa->mpSourceFrames[1]->mpPixmap;

// Only if you are in RGB32 mode, otherwise, other planes are on data2 and data3 on YCbCr mode.
// Horizontal is /2 if you are on YUYV or UYVY mode. Warning !!!
// Get information from frame0.format to check the color mode.
const Pixel32 *src = (Pixel32 *)frame0.data;
const Pixel32 *src2 = (Pixel32 *)frame1.data;
Pixel32 *dst = (Pixel32 *)fa->mpOutputFrames[0]->mpPixmap->data

// Modulo doesn't exist anymore on this new structure, only pitch.
// Also, for other planes, there is pitch2 and pitch3.
for (h=0, h<frame0.h, h++)
{
 for (w=0, w<frame0.w, w++)
   dst[w]=(src[w]+src2[w])>>1;
 src=(Pixel32 *)((char *)src + frame0.pitch);
 src2=(Pixel32 *)((char *)src2 + frame1.pitch);
 dst=(Pïxel32 *) ((char *)dst + fa->mpOutputFrames[0]->mpPixmap->pitch);
}

return 0;
}
 
     Top
diablo23q
Posted: Aug 5 2011, 10:04 AM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



Thanks, it works! Just one more question and I'll be satisfied. To be clear I'm writing deinterlacer and need to double video frame rate. How can I do this using mpOutputFrames or somewhat else? Tanks again, it really helps.
 
     Top
jpsdr
Posted: Aug 5 2011, 02:40 PM


Advanced Member


Group: Members
Posts: 335
Member No.: 20490
Joined: 23-December 06



Argh... Sorry, i have no idea for this one.
Get the latest source code (1.10.1-test12), and :
- Take a look at the code of filtres like IVTC and deinterlace.
- Read SDK.

Combining both, you may find out how things work.
 
     Top
dloneranger
Posted: Aug 5 2011, 02:46 PM


Moderator


Group: Moderators
Posts: 2366
Member No.: 22158
Joined: 26-September 07



this is my sourcecode for an internal vdub double framerate filter in my modified virtualdub
should be easy enough to modify
CODE

#include "stdafx.h"

#include <vd2/system/cpuaccel.h>
#include <vd2/system/vdstl.h>
#include <vd2/system/fraction.h>
#include <vd2/system/memory.h>
#include <vd2/VDXFrame/VideoFilter.h>
#include <vd2/VDLib/Dialog.h>
#include <vd2/Kasumi/pixmap.h>
#include <vd2/Kasumi/pixmaputils.h>
#include <intrin.h>
#include <emmintrin.h>

#include "resource.h"
#include "filter.h"

////////////////////////////////////////////////////////////


class VDVideoFilter_fps_doublerate : public VDXVideoFilter {
public:
uint32 GetParams();
void Start();
void Run();
bool Prefetch2(sint64 frame, IVDXVideoPrefetcher *prefetcher);

//VDXVF_DECLARE_SCRIPT_METHODS();
protected:
bool mActive;
};

//VDXVF_BEGIN_SCRIPT_METHODS(VDVideoFilter_fps_doublerate)
//VDXVF_DEFINE_SCRIPT_METHOD(VDVideoFilter_fps_doublerate, ScriptConfig, "iii")
//VDXVF_DEFINE_SCRIPT_METHOD2(VDVideoFilter_fps_doublerate, ScriptConfig, "iiii")
//VDXVF_END_SCRIPT_METHODS()


uint32 VDVideoFilter_fps_doublerate::GetParams() {
const VDXPixmapLayout& srcLayout = *fa->src.mpPixmapLayout;

if (srcLayout.format ==255  )
 return FILTERPARAM_NOT_SUPPORTED;

VDFraction fr(fa->dst.mFrameRateHi, fa->dst.mFrameRateLo);
 double frConv=fr.asDouble();



fr *= VDFraction(2, 1);

fa->dst.mFrameRateHi = fr.getHi();  
fa->dst.mFrameRateLo = fr.getLo();
fa->dst.mFrameCount = ((fa->dst.mFrameCount )<<1);

frConv=fr.asDouble();
mActive=true;
 

fa->dst.mpPixmapLayout = fa->src.mpPixmapLayout;

return  FILTERPARAM_SUPPORTS_ALTFORMATS;
}


bool VDVideoFilter_fps_doublerate::Prefetch2(sint64 frame, IVDXVideoPrefetcher *prefetcher) {
 prefetcher->PrefetchFrame(0, frame>>1  , 0);

return true;
}

void VDVideoFilter_fps_doublerate::Run() {
const VDXPixmap *pxsrc[1]={
  fa->mpSourceFrames[0]->mpPixmap
};

const VDXPixmap& pxdst = *fa->mpOutputFrames[0]->mpPixmap;

fa->dst.pitch = fa->src.pitch;
fa->dst.offset  = fa->src.offset;

}


void VDVideoFilter_fps_doublerate::Start() {

}





///////////////////////////////////////////////////////////////////////////

extern const VDXFilterDefinition filterDef_fps_doublerate =
VDXVideoFilterDefinition<VDVideoFilter_fps_doublerate>(
 NULL,
//  "half rate",
 "fps double",
 "Doubles frame rate");

// warning C4505: 'VDXVideoFilter::[thunk]: __thiscall VDXVideoFilter::`vcall'{24,{flat}}' }'' : unreferenced local function has been removed
#pragma warning(disable: 4505)


--------------------
MultiAdjust JoinWav WavNormalize FFMPeg Input Plugin v1827 UnSharpMask
Windows7/8 Codec Chooser
All FccHandlers Stuff inc. Installers for acm codecs AAC, AC3, LameMp3
 
    Top
diablo23q
Posted: Aug 6 2011, 12:58 AM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



Thanks a lot! Wait for new deinterlacer smile.gif
 
     Top
diablo23q
Posted: Feb 22 2012, 02:44 PM


Member


Group: Members
Posts: 16
Member No.: 31144
Joined: 3-May 11



And finally - http://forums.virtualdub.org/index.php?act...=ST&f=7&t=20890
 
     Top
0 User(s) are reading this topic (0 Guests and 0 Anonymous Users)
0 Members:
10 replies since Jul 18 2011, 01:32 PM Track this topic | Email this topic | Print this topic

<< Back to VirtualDub Filters and Filter Development