1
/***************************************************************************
2
Hue/Saturation filter ported from mplayer
3
(c) Michael Niedermayer
4
***************************************************************************/
6
/***************************************************************************
8
* This program is free software; you can redistribute it and/or modify *
9
* it under the terms of the GNU General Public License as published by *
10
* the Free Software Foundation; either version 2 of the License, or *
11
* (at your option) any later version. *
13
***************************************************************************/
20
#include <ADM_assert.h>
30
#include "ADM_toolkit/toolkit.hxx"
31
#include "ADM_editor/ADM_edit.hxx"
32
#include "ADM_video/ADM_genvideo.hxx"
33
#include "ADM_video/ADM_vidFlipV.h"
34
#include "ADM_filter/video_filters.h"
35
#include "ADM_dialog/DIA_enter.h"
36
#include "ADM_video/ADM_cache.h"
38
#include "admmangle.h"
39
#include "ADM_vidHue.h"
40
static FILTER_PARAM HueParam={2,{"hue","saturation"}};
42
extern uint8_t DIA_getHue(Hue_Param *param, AVDMGenericVideoStream *in);
44
class ADMVideoHue:public AVDMGenericVideoStream
48
AVDMGenericVideoStream *_in;
49
virtual char *printConf(void);
57
ADMVideoHue( AVDMGenericVideoStream *in,CONFcouple *setup);
58
virtual ~ADMVideoHue();
59
virtual uint8_t configure(AVDMGenericVideoStream *in);
60
virtual uint8_t getFrameNumberNoAlloc(uint32_t frame, uint32_t *len,
61
ADMImage *data,uint32_t *flags);
63
uint8_t getCoupledConf( CONFcouple **couples);
66
SCRIPT_CREATE(hue_script,ADMVideoHue,HueParam);
67
BUILD_CREATE(hue_create,ADMVideoHue);
69
void HueProcess_C(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsrc, int dststride, int srcstride,
70
int w, int h, float hue, float sat)
73
const int s= (int)rint(sin(hue) * (1<<16) * sat);
74
const int c= (int)rint(cos(hue) * (1<<16) * sat);
79
const int u= usrc[i] - 128;
80
const int v= vsrc[i] - 128;
81
int new_u= (c*u - s*v + (1<<15) + (128<<16))>>16;
82
int new_v= (s*u + c*v + (1<<15) + (128<<16))>>16;
83
if(new_u & 768) new_u= (-new_u)>>31;
84
if(new_v & 768) new_v= (-new_v)>>31;
96
uint8_t ADMVideoHue::configure(AVDMGenericVideoStream *in)
100
r= DIA_getHue(_param, in);
104
char *ADMVideoHue::printConf( void )
108
sprintf((char *)buf," Hue :%2.2f %2.2f",_param->hue,_param->saturation);
112
ADMVideoHue::ADMVideoHue( AVDMGenericVideoStream *in,CONFcouple *couples)
116
memcpy(&_info,_in->getInfo(),sizeof(_info));
118
_param=new Hue_Param;
127
_param->saturation=1.0;
129
vidCache=new VideoCache(1,_in);
132
void ADMVideoHue::update(void)
134
_hue=_param->hue*M_PI/180.;
135
_saturation=(100+_param->saturation)/100;
137
ADMVideoHue::~ADMVideoHue()
143
uint8_t ADMVideoHue::getCoupledConf( CONFcouple **couples)
146
*couples=new CONFcouple(2);
155
uint8_t ADMVideoHue::getFrameNumberNoAlloc(uint32_t frame,
160
ADMImage *mysrc=NULL;
163
if(frame>=_info.nb_frames) return 0;
165
mysrc=vidCache->getImage(frame);
167
memcpy(YPLANE(data),YPLANE(mysrc),_info.width*_info.height);
168
HueProcess_C(VPLANE(data), UPLANE(data),
169
VPLANE(mysrc), UPLANE(mysrc),
170
_info.width>>1,_info.width>>1,
171
_info.width>>1,_info.height>>1,
174
vidCache->unlockAll();