summaryrefslogtreecommitdiffstats
path: root/Src/vp6/nsvdec.cpp
blob: 341c17097052d687ba6a3c2c7c9fbe6c4932c780 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "nsvdec.h"

#ifdef _WIN32
#include <windows.h>
#endif
#include <bfc/platform/export.h>
#include "../nsv/nsvlib.h"
#include "../nsv/dec_if.h"
#include "duck_dxl.h"
#include <stddef.h>
extern "C" {
  void GetImageBufs(DXL_XIMAGE_HANDLE x, YV12_PLANES *p);
  void vp60_SetParameter ( DXL_XIMAGE_HANDLE src, int Command, uintptr_t Parameter );
int vp60_getWH(DXL_XIMAGE_HANDLE src, int *w, int *h);
};

int vp6_postProcess=6;
int vp6_cpuFree=70;
int vp6_deInterlace=0;
int vp6_addNoise=1;

typedef enum
{
	PBC_SET_POSTPROC,
	PBC_SET_CPUFREE,
    PBC_MAX_PARAM,
	PBC_SET_TESTMODE,
	PBC_SET_PBSTRUCT,
	PBC_SET_BLACKCLAMP,
	PBC_SET_WHITECLAMP,
	PBC_SET_REFERENCEFRAME,
    PBC_SET_DEINTERLACEMODE,
    PBC_SET_ADDNOISE

} PB_COMMAND_TYPE;


VP6_Decoder::VP6_Decoder(int w, int h)
{
  l_tcpu=-1;
  l_pp=-1;

  vidbufdec.y.baseAddr=0;
  xim = DXL_AlterXImage( NULL, (unsigned char *)"" ,NSV_MAKETYPE('V','P','6','0'), DXRGBNULL,0,0);
}

VP6_Decoder::~VP6_Decoder()
{
  if ( xim ) DXL_DestroyXImage( xim);
}

int VP6_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)
{
	bool provide_width_height = (out_type[0] == 1);
  unsigned char *data=(unsigned char *)in;

  if (!xim) return -1;

  *out_type=NSV_MAKETYPE('Y','V','1','2');
  
  if (vp6_postProcess != l_pp || vp6_cpuFree != l_tcpu)
  {
    l_pp=vp6_postProcess;
    l_tcpu=vp6_cpuFree;
		if(vp6_cpuFree)
			DXL_SetParameter(xim, PBC_SET_CPUFREE, vp6_cpuFree);
		else
			DXL_SetParameter(xim, PBC_SET_POSTPROC, vp6_postProcess);

		DXL_SetParameter(xim, PBC_SET_DEINTERLACEMODE, vp6_deInterlace );
		DXL_SetParameter(xim, PBC_SET_ADDNOISE, vp6_addNoise);

	  DXL_SetParameter(xim, PBC_SET_BLACKCLAMP,0);
		DXL_SetParameter(xim, PBC_SET_WHITECLAMP,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))
  {
#ifdef _M_IX86
      _asm { 
        emms; 
      };
#endif
    GetImageBufs(xim,&vidbufdec);
    *out=&vidbufdec;
		if (provide_width_height)
		{
			int w, h;
			vp60_getWH(xim, &w, &h);
			out_type[1] = w;
			out_type[2] = h;
		}
    return 0;
  }

  return -1;
}