|
11 | 11 | #include <zephyr/drivers/video-controls.h>
|
12 | 12 | #include <zephyr/logging/log.h>
|
13 | 13 | #include <zephyr/sys/util.h>
|
| 14 | +#include <zephyr/sys/byteorder.h> |
14 | 15 |
|
15 | 16 | LOG_MODULE_REGISTER(video_sw_generator, CONFIG_VIDEO_LOG_LEVEL);
|
16 | 17 |
|
@@ -130,25 +131,36 @@ static void video_sw_generator_fill_colorbar(struct video_sw_generator_data *dat
|
130 | 131 | struct video_buffer *vbuf)
|
131 | 132 | {
|
132 | 133 | int bw = data->fmt.width / 8;
|
133 |
| - int h, w, i = 0; |
134 |
| - |
135 |
| - for (h = 0; h < data->fmt.height; h++) { |
136 |
| - for (w = 0; w < data->fmt.width; w++) { |
137 |
| - int color_idx = data->ctrl_vflip ? 7 - w / bw : w / bw; |
138 |
| - if (data->fmt.pixelformat == VIDEO_PIX_FMT_RGB565) { |
139 |
| - uint16_t *pixel = (uint16_t *)&vbuf->buffer[i]; |
140 |
| - *pixel = rgb565_colorbar_value[color_idx]; |
141 |
| - i += 2; |
142 |
| - } else if (data->fmt.pixelformat == VIDEO_PIX_FMT_XRGB32) { |
143 |
| - uint32_t *pixel = (uint32_t *)&vbuf->buffer[i]; |
144 |
| - *pixel = xrgb32_colorbar_value[color_idx]; |
145 |
| - i += 4; |
146 |
| - } |
| 134 | + struct video_format *fmt = &data->fmt; |
| 135 | + size_t pitch = fmt->width * video_bits_per_pixel(fmt->pixelformat) / BITS_PER_BYTE; |
| 136 | + |
| 137 | + vbuf->bytesused = 0; |
| 138 | + |
| 139 | + /* Generate the first line of data */ |
| 140 | + for (int w = 0, i = 0; w < data->fmt.width; w++) { |
| 141 | + int color_idx = data->ctrl_vflip ? 7 - w / bw : w / bw; |
| 142 | + |
| 143 | + if (data->fmt.pixelformat == VIDEO_PIX_FMT_RGB565) { |
| 144 | + uint16_t *pixel = (uint16_t *)&vbuf->buffer[i]; |
| 145 | + *pixel = sys_cpu_to_le16(rgb565_colorbar_value[color_idx]); |
| 146 | + } else if (data->fmt.pixelformat == VIDEO_PIX_FMT_XRGB32) { |
| 147 | + uint32_t *pixel = (uint32_t *)&vbuf->buffer[i]; |
| 148 | + *pixel = sys_cpu_to_le32(xrgb32_colorbar_value[color_idx]); |
147 | 149 | }
|
| 150 | + i += video_bits_per_pixel(data->fmt.pixelformat) / BITS_PER_BYTE; |
| 151 | + } |
| 152 | + |
| 153 | + /* Duplicate the first line all over the buffer */ |
| 154 | + for (int h = 1; h < data->fmt.height; h++) { |
| 155 | + if (vbuf->size < vbuf->bytesused + pitch) { |
| 156 | + break; |
| 157 | + } |
| 158 | + |
| 159 | + memcpy(vbuf->buffer + h * pitch, vbuf->buffer, pitch); |
| 160 | + vbuf->bytesused += pitch; |
148 | 161 | }
|
149 | 162 |
|
150 | 163 | vbuf->timestamp = k_uptime_get_32();
|
151 |
| - vbuf->bytesused = i; |
152 | 164 | vbuf->line_offset = 0;
|
153 | 165 | }
|
154 | 166 |
|
|
0 commit comments