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
|
Subject: gst-plugins-bad bayer2rgb: Make first line configurable
From: Sascha Hauer <s.hauer@pengutronix.de>
Since people can't agree whether the first line of a bayer pattern is a
blue/green line or a green/red line make it configurable. We add a new
parameter "B/G first", with which the user declare the first line as
blue/green, which is default, or green/red.
Patch submitted to mainline, status pending.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Luotao Fu <l.fu@pengutronix.de>
---
gst/bayer/gstbayer2rgb.c | 36 +++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
Index: gst-plugins-bad-0.10.8/gst/bayer/gstbayer2rgb.c
===================================================================
--- gst-plugins-bad-0.10.8.orig/gst/bayer/gstbayer2rgb.c
+++ gst-plugins-bad-0.10.8/gst/bayer/gstbayer2rgb.c
@@ -108,6 +108,7 @@ struct _GstBayer2RGB
int r_off; /* offset for red */
int g_off; /* offset for green */
int b_off; /* offset for blue */
+ gboolean bg_first; /* first line is blue/green */
};
struct _GstBayer2RGBClass
@@ -138,7 +139,8 @@ GST_ELEMENT_DETAILS ("Bayer to RGB decod
enum
{
- PROP_0
+ PROP_0,
+ PROP_BGFIRST,
};
#define DEBUG_INIT(bla) \
@@ -195,6 +197,13 @@ gst_bayer2rgb_class_init (GstBayer2RGBCl
GST_DEBUG_FUNCPTR (gst_bayer2rgb_set_caps);
GST_BASE_TRANSFORM_CLASS (klass)->transform =
GST_DEBUG_FUNCPTR (gst_bayer2rgb_transform);
+
+ g_object_class_install_property(gobject_class, PROP_BGFIRST,
+ g_param_spec_boolean("bg_first",
+ "B/G first",
+ "First line is a blue/green line",
+ TRUE,
+ G_PARAM_READWRITE));
}
static void
@@ -209,8 +218,12 @@ static void
gst_bayer2rgb_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
+ GstBayer2RGB *filter = GST_BAYER2RGB (object);
switch (prop_id) {
+ case PROP_BGFIRST:
+ filter->bg_first = g_value_get_boolean(value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -221,8 +234,12 @@ static void
gst_bayer2rgb_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
+ GstBayer2RGB *filter = GST_BAYER2RGB (object);
switch (prop_id) {
+ case PROP_BGFIRST:
+ g_value_set_boolean(value, filter->bg_first);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -291,6 +308,7 @@ gst_bayer2rgb_reset (GstBayer2RGB * filt
filter->r_off = 0;
filter->g_off = 0;
filter->b_off = 0;
+ filter->bg_first = 1;
}
static GstCaps *
@@ -468,19 +486,19 @@ do_row0_col0 (uint8_t * input, uint8_t *
int type;
/* Horizontal edges */
- hborder (input, output, 0, GREENB, filter);
+ hborder (input, output, 0, filter->bg_first ? GREENB : RED, filter);
if (filter->height & 1)
- type = GREENB; /* odd # rows, "bottom" edge same as top */
+ type = filter->bg_first ? GREENB : RED; /* odd # rows, "bottom" edge same as top */
else
- type = RED; /* even #, bottom side different */
+ type = filter->bg_first ? RED : GREENB; /* even #, bottom side different */
hborder (input, output, 1, type, filter);
/* Vertical edges */
- vborder (input, output, 0, GREENR, filter);
+ vborder (input, output, 0, filter->bg_first ? GREENR : BLUE, filter);
if (filter->width & 1)
- type = GREENR; /* odd # cols, "right" edge same as left */
+ type = filter->bg_first ? GREENR : BLUE; /* odd # cols, "right" edge same as left */
else
- type = RED; /* even #, right side different */
+ type = filter->bg_first ? RED : GREENB; /* even #, right side different */
vborder (input, output, 1, type, filter);
}
@@ -565,9 +583,9 @@ do_body (uint8_t * input, uint8_t * outp
* be RED for odd-numbered rows and GREENB for even rows.
*/
if (h & 1)
- type = RED;
+ type = filter->bg_first ? RED : GREENB;
else
- type = GREENB;
+ type = filter->bg_first ? GREENB : RED;
/* Calculate the starting position for the row */
op = h * filter->width * filter->pixsize; /* output (converted) pos */
ip = h * filter->stride; /* input (bayer data) pos */
|