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