Welcome to mirror list, hosted at ThFree Co, Russian Federation.

debayer.c « libredcode « extern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f7f22e1cc545d2991767d20235d7a17a5c12e018 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "debayer.h"

/* pretty simple but astonishingly very effective "debayer" function 
 */

void redcode_ycbcr2rgb_fullscale(
	int ** planes, int width, int height, float * out)
{
	int x,y;
	int pix_max = 4096;
	int mask = pix_max - 1;
	float Kb = 0.0722;
	float Kr = 0.2126;
	float *o;

	for (y = 0; y < height; y++) {
		for (x = 0; x < width; x++) {
			int i = x + y*width;
			int i_p = (y > 0) ? i-width : i;
			int i_n = (y < (height-1)) ? i + width : i;
			float y1n = planes[0][i_n] & mask;
			float y1  = planes[0][i] & mask;
			float cb  = (planes[1][i] & mask)   - pix_max/2;
			float cr  = (planes[2][i] & mask)   - pix_max/2;
			float y2  = (planes[3][i] & mask);
			float y2p = (planes[3][i_p] & mask);

			float b_ = cb * (1.0 - Kb)/(pix_max/2);
			float r_ = cr * (1.0 - Kr)/(pix_max/2);
			float g_ = (- Kr * r_ - Kb * b_)/(1.0 - Kr - Kb);
		
			float y_[4] = {y1 / pix_max, 
				       (y2 + y2p)/2 / pix_max, 
				       (y1 + y1n)/2 / pix_max, 
				       y2 / pix_max};

			int j;
			int yc = 0;

			o = out + (2*height-1-2*y)*2*4*width 
				+ x*2*4;

			for (j = 0; j < 8; j += 4) {
				o[j+0] = r_ + y_[yc];
				o[j+1] = g_ + y_[yc];
				o[j+2] = b_ + y_[yc];
				o[j+3] = 1.0;
				yc++;
			}
			
			o = out + (2*height-1-2*y)*2*4*width 
				+ x*2*4 - 2*4*width;

			for (j = 0; j < 8; j += 4) {
				o[j+0] = r_ + y_[yc];
				o[j+1] = g_ + y_[yc];
				o[j+2] = b_ + y_[yc];
				o[j+3] = 1.0;
				yc++;
			}
		}
	}
}

void redcode_ycbcr2rgb_halfscale(
	int ** planes, int width, int height, float * out)
{
	int x,y;
	int pix_max = 4096;
	int mask = pix_max - 1;
	float Kb = 0.0722;
	float Kr = 0.2126;

	for (y = 0; y < height; y++) {
		float *o = out + width * (height - y - 1);
		for (x = 0; x < width; x++) {
			int i = y*height + x;
			float y1  = (planes[0][i] & mask);
			float cb  = (planes[1][i] & mask)  - pix_max/2;
			float cr  = (planes[2][i] & mask)  - pix_max/2;
			float y2  = (planes[3][i] & mask);

			float b_ = cb * (1.0 - Kb)/(pix_max/2);
			float r_ = cr * (1.0 - Kr)/(pix_max/2);
			float g_ = (- Kr * r_ - Kb * b_)/(1.0 - Kr - Kb);
			
			float y = (y1 + y2)/2 / pix_max;

			*o++ = r_ + y;
			*o++ = g_ + y;
			*o++ = b_ + y;
			*o++ = 1.0;
		}
	}
}


void redcode_ycbcr2rgb_quarterscale(
	int ** planes, int width, int height, float * out)
{
	int x,y;
	int pix_max = 4096;
	int mask = pix_max - 1;
	float Kb = 0.0722;
	float Kr = 0.2126;

	for (y = 0; y < height; y += 2) {
		float *o = out + (width/2) * (height/2 - y/2 - 1);
		for (x = 0; x < width; x += 2) {
			int i = y * width + x;
			float y1  = planes[0][i] & mask;
			float cb  = (planes[1][i] & mask)  - pix_max/2;
			float cr  = (planes[2][i] & mask)  - pix_max/2;
			float y2  = planes[3][i] & mask;

			float b_ = cb * (1.0 - Kb)/(pix_max/2);
			float r_ = cr * (1.0 - Kr)/(pix_max/2);
			float g_ = (- Kr * r_ - Kb * b_)/(1.0 - Kr - Kb);
			
			float y = (y1 + y2)/2 / pix_max;
			
			*o++ = r_ + y;
			*o++ = g_ + y;
			*o++ = b_ + y;
			*o++ = 1.0;
		}
	}
}