aboutsummaryrefslogtreecommitdiff
path: root/Src/nsv/nsvplay/vp3stub.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nsv/nsvplay/vp3stub.cpp')
-rw-r--r--Src/nsv/nsvplay/vp3stub.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/Src/nsv/nsvplay/vp3stub.cpp b/Src/nsv/nsvplay/vp3stub.cpp
new file mode 100644
index 00000000..8f6776c7
--- /dev/null
+++ b/Src/nsv/nsvplay/vp3stub.cpp
@@ -0,0 +1,120 @@
+#include "main.h"
+#include "../../vp32/include/duck_dxl.h"
+#include "vfw.h"
+
+extern "C" {
+ void GetImageBufs(DXL_XIMAGE_HANDLE x, YV12_PLANES *p);
+};
+
+int vp3_postprocess=0;
+int vp3_targetcpu=0;
+
+class VP3_Decoder : public IVideoDecoder {
+ public:
+ VP3_Decoder(int w, int h, int uvflip);
+ ~VP3_Decoder();
+ int decode(int need_kf,
+ void *in, int in_len,
+ void **out, // out is set to a pointer to data
+ unsigned int *out_type, // 'Y','V','1','2' is currently defined
+ int *is_kf);
+ void flush() { }
+
+ private:
+ int m_uvflip;
+ int l_tcpu, l_pp;
+ static int init;
+ DXL_XIMAGE_HANDLE xim;
+ YV12_PLANES vidbufdec;
+};
+
+int VP3_Decoder::init;
+
+VP3_Decoder::VP3_Decoder(int w, int h, int uvflip)
+{
+ l_tcpu=-1;
+ l_pp=-1;
+ if (!init)
+ {
+ init=1;
+ DXL_InitVideoEx(1,1);
+ }
+ m_uvflip=uvflip;
+ vidbufdec.y.baseAddr=0;
+ xim = DXL_AlterXImage( NULL, (unsigned char *)"" ,MAKEFOURCC('V','P','3','1'), DXRGBNULL,w,h);
+}
+
+VP3_Decoder::~VP3_Decoder()
+{
+ if ( xim ) DXL_DestroyXImage( xim);
+}
+
+
+int VP3_Decoder::decode(int need_kf,
+ void *in, int in_len,
+ void **out, // out is set to a pointer to data
+ unsigned int *out_type, // 'Y','V','1','2' is currently defined
+ int *is_kf)
+{
+ BYTE *data=(BYTE*)in;
+
+ if (!xim) return -1;
+
+ *out_type=NSV_MAKETYPE('Y','V','1','2');
+
+ if (vp3_postprocess != l_pp || vp3_targetcpu != l_tcpu)
+ {
+ l_pp=vp3_postprocess;
+ l_tcpu=vp3_targetcpu;
+ if (l_pp)
+ {
+ int v=l_tcpu;
+ if (v < 1) v=1;
+ if (v > 100) v=100;
+ vp31_SetParameter(xim,1, v);
+ vp31_SetParameter(xim,0, 9);
+ }
+ else
+ {
+ vp31_SetParameter(xim,1, 0);
+ vp31_SetParameter(xim,0, 0);
+ }
+ }
+
+ DXL_AlterXImageData( xim, data);
+ DXL_SetXImageCSize(xim, in_len);
+
+ *is_kf=!(!in_len || data[0] > 0x7f);
+
+ *out=NULL;
+
+ if ((need_kf && !*is_kf) || !in_len)
+ {
+ return 0;
+ }
+
+ if (!DXL_dxImageToVScreen( xim, NULL))
+ {
+ GetImageBufs(xim,&vidbufdec);
+ if (m_uvflip)
+ {
+ YV12_PLANE tmp=vidbufdec.v;
+ vidbufdec.v=vidbufdec.u;
+ vidbufdec.u=tmp;
+ }
+ *out=&vidbufdec;
+ return 0;
+ }
+
+ return -1;
+}
+
+IVideoDecoder *VP3_CREATE(int w, int h, double framerate, unsigned int fmt, int *flip)
+{
+ if (fmt == NSV_MAKETYPE('V','P','3',' ') || fmt == NSV_MAKETYPE('V','P','3','1'))
+ {
+ *flip=1;
+ return new VP3_Decoder(w,h,fmt == NSV_MAKETYPE('V','P','3',' '));
+ }
+ return NULL;
+}