2 #include "gstsparrow.h"
9 static const double GAMMA
= 2.0;
10 static const double INV_GAMMA
= 1.0 / 2.0;
11 #define GAMMA_UNIT_LIMIT 1024
12 #define GAMMA_INVERSE_LIMIT 1024
13 #define GAMMA_TABLE_TOP 2048
14 #define GAMMA_TABLE_BASEMENT 1024
15 #define GAMMA_FLOOR -64
17 typedef struct sparrow_play_s
{
19 guint8 lut_b_basement
[GAMMA_TABLE_BASEMENT
]; /*rather than if x < 0 return 0 */
20 guint8 lut_b
[GAMMA_TABLE_TOP
];
23 GstBuffer
*old_frames
[OLD_FRAMES
];
29 #define SUBPIXEL(x) static inline guint8 one_subpixel_##x \
30 (sparrow_play_t *player, guint8 inpix, guint8 jpegpix, guint8 oldpix)
33 SUBPIXEL(gamma_clamp
){
34 /*clamp in pseudo gamma space*/
35 int gj
= player
->lut_f
[jpegpix
];
36 int gi
= player
->lut_f
[inpix
];
40 return player
->lut_b
[diff
];
46 int diff
= jpegpix
- inpix
;
52 SUBPIXEL(full_mirror
){
53 /*full mirror -SEGFAULTS */
54 int diff
= jpegpix
- inpix
;
56 return -diff
; /*or -diff /2 */
61 guint sum
= jpegpix
+ inpix
;
66 int sum
= player
->lut_f
[jpegpix
] + player
->lut_f
[255 - inpix
];
67 return player
->lut_b
[sum
>> 1];
71 int sum
= jpegpix
+ ((oldpix
- inpix
) >> 1);
79 SUBPIXEL(gentle_clamp
){
81 int error
= MAX(inpix
- oldpix
, 0) >> 1;
82 int diff
= jpegpix
- error
;
89 int error
= MAX(inpix
- oldpix
, 0) >> 1;
90 int diff
= jpegpix
- error
- (inpix
>> 1);
98 SUBPIXEL(inverse_clamp
){
100 int error
= MAX(oldpix
- inpix
, 0);
101 int diff
= jpegpix
+ error
;
109 SUBPIXEL(gamma_oldpix
){
110 /*clamp in pseudo gamma space*/
111 int jpeg_gamma
= player
->lut_b
[jpegpix
];
112 int in_gamma
= player
->lut_b
[inpix
];
113 int old_gamma
= player
->lut_b
[oldpix
];
114 int error
= (in_gamma
- old_gamma
) >> 1;
115 int diff
= jpeg_gamma
- error
;
118 return player
->lut_f
[diff
];
122 SUBPIXEL(gamma_clamp_oldpix_gentle
){
123 /*clamp in pseudo gamma space*/
124 int jpeg_gamma
= player
->lut_f
[jpegpix
];
125 int in_gamma
= player
->lut_f
[inpix
];
126 int old_gamma
= player
->lut_f
[oldpix
];
127 int error
= MAX(in_gamma
- old_gamma
, 0) >> 1;
128 int diff
= jpeg_gamma
- error
;
131 return player
->lut_b
[diff
];
134 SUBPIXEL(gamma_clamp_oldpix
){
135 /*clamp in pseudo gamma space*/
136 int jpeg_gamma
= player
->lut_f
[jpegpix
];
137 int in_gamma
= player
->lut_f
[inpix
];
138 int old_gamma
= player
->lut_f
[oldpix
];
139 int error
= MAX(in_gamma
- old_gamma
, 0);
140 int diff
= jpeg_gamma
- error
;
141 return player
->lut_b
[diff
]; /*diff range: -1023 to 1023*/
148 int target
= 2 * jpegpix
- oldpix
;
149 int diff
= (target
- inpix
-inpix
) >> 1;