1 
2 /***************************************************************************
3                         Simple equalizer or linear luma/chroma filter
4 
5 
6    (C) 2004/2005 Mean fixounet@free.fr
7    GPL version 2
8 
9  ***************************************************************************/
10 #include "ADM_default.h"
11 #include <math.h>
12 
13 #include "ADM_videoFilterDynamic.h"
14 #include "ADM_vidEqualizer.h"
15 
16 
17 static FILTER_PARAM equalizer_template={8,{"0","1","2","3"
18 					,"4","5","6","7"}};
19 //REGISTERX(VF_COLORS, "equalizer",QT_TR_NOOP("Luma equalizer"),
20 //QT_TR_NOOP("Luma correction filter with histogram."),VF_EQUALIZER,1,equalizer_create,equalizer_script);
21 VF_DEFINE_FILTER_UI(vidEqualizer,equalizer_template,
22                 equalizer,
23                 QT_TR_NOOP("Luma equalizer"),
24                 1,
25                 VF_COLORS,
26                 QT_TR_NOOP("Luma correction filter with histogram."));
27 
28 
29 extern uint8_t DIA_getEqualizer(EqualizerParam *param, AVDMGenericVideoStream *incoming);
30 
configure(AVDMGenericVideoStream * in)31 uint8_t vidEqualizer::configure(AVDMGenericVideoStream *in)
32 {
33 ADMImage *video1;
34 uint32_t l,f;
35 uint8_t r;
36 
37 	_in=in;
38 	r= DIA_getEqualizer(_param,in);
39 	return r;
40 
41 }
42 
printConf(void)43 char *vidEqualizer::printConf( void )
44 {
45  	ADM_FILTER_DECLARE_CONF(" Equalizer");
46 
47 }
48 
vidEqualizer(AVDMGenericVideoStream * in,CONFcouple * couples)49 vidEqualizer::vidEqualizer(AVDMGenericVideoStream *in,CONFcouple *couples)
50 {
51 		_in=in;
52    		memcpy(&_info,_in->getInfo(),sizeof(_info));
53   		_info.encoding=1;
54 		_uncompressed=NULL;
55 
56   		_info.encoding=1;
57 		_uncompressed=new ADMImage(_info.width,_info.height);
58 
59 
60 		_param=NEW(EqualizerParam);
61 		if(couples)
62 		{
63 		        char dummy[10];
64                         for(int i=0;i<256;i++)
65                         {
66                                 sprintf(dummy,"x%03d",i);
67                                 couples->getCouple((char *)dummy,&(_param->_scaler[i]));
68                         }
69 		}
70 		else // Default
71   		{
72                                 for(int i=0;i<256;i++)
73                                         _param->_scaler[i]=i;
74 		}
75 }
76 //____________________________________________________________________
~vidEqualizer()77 vidEqualizer::~vidEqualizer()
78 {
79 
80 	delete _uncompressed;
81 	delete _param;
82 	_param=NULL;
83 	_uncompressed=NULL;
84 
85 
86 }
87 
88 //______________________________________________________________
getFrameNumberNoAlloc(uint32_t frame,uint32_t * len,ADMImage * data,uint32_t * flags)89 uint8_t vidEqualizer::getFrameNumberNoAlloc(uint32_t frame,
90 				uint32_t *len,
91    				ADMImage *data,
92 				uint32_t *flags)
93 {
94 
95         if(frame>= _info.nb_frames) return 0;
96 	if(!_in->getFrameNumberNoAlloc(frame,len,_uncompressed,flags)) return 0;
97 
98 	uint8_t *src,*dst;
99 	src=_uncompressed->data;
100 	dst=data->data;
101 	for(uint32_t y=_info.height;y>0;y--)
102 	for(uint32_t x=_info.width;x>0;x--)
103 		*(dst++)=_param->_scaler[*(src++)];
104 
105 	uint32_t square=_info.width*_info.height;
106 	square>>=2;
107 	// copy u & v too
108 	memcpy(data->data+4*square,_uncompressed->data+4*square,2*square);
109 	return 1;
110 }
111 
112 
getCoupledConf(CONFcouple ** couples)113 uint8_t	vidEqualizer::getCoupledConf( CONFcouple **couples)
114 {
115 char dummy[10];
116 			ADM_assert(_param);
117 			*couples=new CONFcouple(256);
118 
119         for(int i=0;i<256;i++)
120         {
121                 sprintf(dummy,"x%03d",i);
122                 (*couples)->setCouple(dummy,(_param->_scaler[i]));
123         }
124 	return 1;
125 }
126 
127 // EOF
128