|
@@ -40,6 +40,9 @@ static int captures_remaining = 0;
|
|
|
static int preview_width;
|
|
|
static int preview_height;
|
|
|
|
|
|
+static int output_buffer_width = -1;
|
|
|
+static int output_buffer_height = -1;
|
|
|
+
|
|
|
// static bool gain_is_manual;
|
|
|
static int gain;
|
|
|
static int gain_max;
|
|
@@ -252,7 +255,7 @@ mp_process_pipeline_init_gl(GdkSurface *surface)
|
|
|
mp_pipeline_invoke(pipeline, (MPPipelineCallback) init_gl, &surface, sizeof(GdkSurface *));
|
|
|
}
|
|
|
|
|
|
-static cairo_surface_t *
|
|
|
+static GdkTexture *
|
|
|
process_image_for_preview(const uint8_t *image)
|
|
|
{
|
|
|
#ifdef PROFILE_DEBAYER
|
|
@@ -300,55 +303,6 @@ process_image_for_preview(const uint8_t *image)
|
|
|
printf("%fms\n", (float)(t2 - t1) / CLOCKS_PER_SEC * 1000);
|
|
|
#endif
|
|
|
|
|
|
- // {
|
|
|
- // glBindTexture(GL_TEXTURE_2D, textures[1]);
|
|
|
- // EGLImage egl_image = eglCreateImage(egl_display, egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(size_t)textures[1], NULL);
|
|
|
-
|
|
|
- // // Make sure it's in the expected format
|
|
|
- // int fourcc;
|
|
|
- // eglExportDMABUFImageQueryMESA(egl_display, egl_image, &fourcc, NULL, NULL);
|
|
|
- // assert(fourcc == DRM_FORMAT_ABGR8888);
|
|
|
-
|
|
|
-
|
|
|
- // int dmabuf_fd;
|
|
|
- // int stride, offset;
|
|
|
- // eglExportDMABUFImageMESA(egl_display, egl_image, &dmabuf_fd, &stride, &offset);
|
|
|
-
|
|
|
- // int fsize = lseek(dmabuf_fd, 0, SEEK_END);
|
|
|
- // printf("SIZE %d STRIDE %d OFFSET %d SIZE %d:%d\n", fsize, stride, offset, preview_width, preview_height);
|
|
|
-
|
|
|
- // size_t size = stride * preview_height;
|
|
|
- // uint32_t *data = mmap(NULL, fsize, PROT_READ, MAP_SHARED, dmabuf_fd, 0);
|
|
|
- // assert(data != MAP_FAILED);
|
|
|
-
|
|
|
- // int pixel_stride = stride / 4;
|
|
|
-
|
|
|
- // for (size_t y = 0; y < preview_height; ++y) {
|
|
|
- // for (size_t x = 0; x < preview_width; ++x) {
|
|
|
- // uint32_t p = data[x + y * pixel_stride];
|
|
|
- // pixels[x + y * preview_width] = p;
|
|
|
- // // uint16_t p = data[x + y * stride];
|
|
|
- // // uint32_t r = (p & 0b11111);
|
|
|
- // // uint32_t g = ((p >> 5) & 0b11111);
|
|
|
- // // uint32_t b = ((p >> 10) & 0b11111);
|
|
|
- // // pixels[x + y * preview_width] = (r << 16) | (g << 8) | b;
|
|
|
- // }
|
|
|
- // // memcpy(pixels + preview_width * y, data + stride * y, preview_width * sizeof(uint32_t));
|
|
|
- // }
|
|
|
-
|
|
|
- // {
|
|
|
- // FILE *f = fopen("test.raw", "w");
|
|
|
- // fwrite(data, fsize, 1, f);
|
|
|
- // fclose(f);
|
|
|
- // }
|
|
|
-
|
|
|
- // // memcpy(pixels, data, size);
|
|
|
- // munmap(data, size);
|
|
|
- // close(dmabuf_fd);
|
|
|
- // }
|
|
|
- // glReadPixels(0, 0, preview_width, preview_height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
|
|
- // check_gl();
|
|
|
-
|
|
|
#ifdef RENDERDOC
|
|
|
if(rdoc_api) rdoc_api->EndFrameCapture(NULL, NULL);
|
|
|
#endif
|
|
@@ -357,20 +311,33 @@ process_image_for_preview(const uint8_t *image)
|
|
|
mp_main_set_preview(output_buffer);
|
|
|
|
|
|
// Create a thumbnail from the preview for the last capture
|
|
|
- cairo_surface_t *thumb = NULL;
|
|
|
- // if (captures_remaining == 1) {
|
|
|
- // printf("Making thumbnail\n");
|
|
|
- // thumb = cairo_image_surface_create(
|
|
|
- // CAIRO_FORMAT_ARGB32, MP_MAIN_THUMB_SIZE, MP_MAIN_THUMB_SIZE);
|
|
|
+ GdkTexture *thumb = NULL;
|
|
|
+ if (captures_remaining == 1) {
|
|
|
+ printf("Making thumbnail\n");
|
|
|
|
|
|
- // cairo_t *cr = cairo_create(thumb);
|
|
|
- // draw_surface_scaled_centered(
|
|
|
- // cr, MP_MAIN_THUMB_SIZE, MP_MAIN_THUMB_SIZE, surface);
|
|
|
- // cairo_destroy(cr);
|
|
|
- // }
|
|
|
+ size_t size = output_buffer_width * output_buffer_height * sizeof(uint32_t);
|
|
|
|
|
|
- // Pass processed preview to main and zbar
|
|
|
- // mp_zbar_pipeline_process_image(cairo_surface_reference(surface));
|
|
|
+ uint32_t *data = g_malloc_n(size, 1);
|
|
|
+
|
|
|
+ glReadPixels(0, 0, output_buffer_width, output_buffer_height, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
|
|
+ check_gl();
|
|
|
+
|
|
|
+ // Flip vertically
|
|
|
+ for (size_t y = 0; y < output_buffer_height / 2; ++y) {
|
|
|
+ for (size_t x = 0; x < output_buffer_width; ++x) {
|
|
|
+ uint32_t tmp = data[(output_buffer_height - y - 1) * output_buffer_width + x];
|
|
|
+ data[(output_buffer_height - y - 1) * output_buffer_width + x] = data[y * output_buffer_width + x];
|
|
|
+ data[y * output_buffer_width + x] = tmp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ thumb = gdk_memory_texture_new(
|
|
|
+ output_buffer_width,
|
|
|
+ output_buffer_height,
|
|
|
+ GDK_MEMORY_R8G8B8A8,
|
|
|
+ g_bytes_new_take(data, size),
|
|
|
+ output_buffer_width * sizeof(uint32_t));
|
|
|
+ }
|
|
|
|
|
|
return thumb;
|
|
|
}
|
|
@@ -527,7 +494,7 @@ process_image_for_capture(const uint8_t *image, int count)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-post_process_finished(GSubprocess *proc, GAsyncResult *res, cairo_surface_t *thumb)
|
|
|
+post_process_finished(GSubprocess *proc, GAsyncResult *res, GdkTexture *thumb)
|
|
|
{
|
|
|
char *stdout;
|
|
|
g_subprocess_communicate_utf8_finish(proc, res, &stdout, NULL, NULL);
|
|
@@ -550,7 +517,7 @@ post_process_finished(GSubprocess *proc, GAsyncResult *res, cairo_surface_t *thu
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-process_capture_burst(cairo_surface_t *thumb)
|
|
|
+process_capture_burst(GdkTexture *thumb)
|
|
|
{
|
|
|
time_t rawtime;
|
|
|
time(&rawtime);
|
|
@@ -615,7 +582,7 @@ process_image(MPPipeline *pipeline, const MPBuffer *buffer)
|
|
|
MPZBarImage *zbar_image = mp_zbar_image_new(image, mode.pixel_format, mode.width, mode.height, camera->rotate, camera->mirrored);
|
|
|
mp_zbar_pipeline_process_image(mp_zbar_image_ref(zbar_image));
|
|
|
|
|
|
- cairo_surface_t *thumb = process_image_for_preview(image);
|
|
|
+ GdkTexture *thumb = process_image_for_preview(image);
|
|
|
|
|
|
if (captures_remaining > 0) {
|
|
|
int count = burst_length - captures_remaining;
|
|
@@ -646,7 +613,6 @@ mp_process_pipeline_process_image(MPBuffer buffer)
|
|
|
{
|
|
|
// If we haven't processed the previous frame yet, drop this one
|
|
|
if (frames_received != frames_processed && !is_capturing) {
|
|
|
- printf("Dropped frame at capture\n");
|
|
|
mp_io_pipeline_release_buffer(buffer.index);
|
|
|
return;
|
|
|
}
|
|
@@ -682,9 +648,6 @@ mp_process_pipeline_capture()
|
|
|
mp_pipeline_invoke(pipeline, capture, NULL, 0);
|
|
|
}
|
|
|
|
|
|
-static int output_buffer_width = -1;
|
|
|
-static int output_buffer_height = -1;
|
|
|
-
|
|
|
static void
|
|
|
on_output_changed()
|
|
|
{
|