From c3d996494007244588fa1425d3bfdad4c517dbd2 Mon Sep 17 00:00:00 2001
From: Arnaud Blanchard <arnaud.blanchard@ensea.fr>
Date: Thu, 29 Jun 2017 14:38:58 +0200
Subject: [PATCH] Add management og YUYV

---
 o_gtk_image/src/image_display.cpp | 1328 +++++++++++++++--------------
 1 file changed, 677 insertions(+), 651 deletions(-)

diff --git a/o_gtk_image/src/image_display.cpp b/o_gtk_image/src/image_display.cpp
index 5f8e285..734b095 100644
--- a/o_gtk_image/src/image_display.cpp
+++ b/o_gtk_image/src/image_display.cpp
@@ -59,755 +59,781 @@ static int g_source_remove_pt=G_SOURCE_REMOVE;
 #define SWAP_RGBA_TO_CAIRO_ARGB32(x) ((((x) & 0x000000FF) << 16) | (((x) & 0x00FF0000) >> 16) |  ((x) & 0xFF00FF00) )
 
 static void toggle_fullscreen(GtkWidget *widget, GdkEventWindowState *event, gpointer   user_data){
-    
-    if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ){
-        gtk_widget_hide(toolbar);
-        gtk_widget_hide(general_statusbar);
-    }
-    else{
-        gtk_widget_show(toolbar);
-        gtk_widget_show(general_statusbar);
-    }
+
+	if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ){
+		gtk_widget_hide(toolbar);
+		gtk_widget_hide(general_statusbar);
+	}
+	else{
+		gtk_widget_show(toolbar);
+		gtk_widget_show(general_statusbar);
+	}
 }
 
 
 void* create_RGBA_from_YUYV(void *widget)
 {
-    int Y, Cb, Cr;
-    int i, j;
-    float G_tmp;
-    static uchar  R[256], B;
-    (void)widget;
-    
-    if (RGBA_from_YUYV == NULL)
-    {
-        RGBA_from_YUYV= MANY_ALLOCATIONS(256*256*256, uint32_t);
-        FOR_INV(Y, 256)
-        {
-            FOR_INV(j,256) R[j]= CLIP_UCHAR(Y+1.13983*(j-128)); //It does not depend on Cb
-            FOR_INV(Cb, 256)
-            {
-                B =  CLIP_UCHAR(Y+2.03211*(Cb-128)); // It does not depend on Cr
-                G_tmp = - 0.58060*(Cb-128);
-                
-                FOR_INV(Cr, 256)
-                {
-                    i = Y + (Cb << 8) + (Cr << 16);
-                    
-                    // Version Wikipedia
-                    RGBA_from_YUYV[i] = (R[Cr]<<16) + (((uchar)CLIP_UCHAR(Y-0.39465*(Cr-128) + G_tmp))<< 8)+ B + (255<<24);
-                }
-            }
-        }
-    }
-    return NULL;
+	int Y, Cb, Cr;
+	int i, j;
+	float G_tmp;
+	static uchar  R[256], B;
+	(void)widget;
+
+	if (RGBA_from_YUYV == NULL)
+	{
+		RGBA_from_YUYV= MANY_ALLOCATIONS(256*256*256, uint32_t);
+		FOR_INV(Y, 256)
+		{
+			FOR_INV(j,256) R[j]= CLIP_UCHAR(Y+1.13983*(j-128)); //It does not depend on Cb
+			FOR_INV(Cb, 256)
+			{
+				B =  CLIP_UCHAR(Y+2.03211*(Cb-128)); // It does not depend on Cr
+				G_tmp = - 0.58060*(Cb-128);
+
+				FOR_INV(Cr, 256)
+				{
+					i = Y + (Cb << 8) + (Cr << 16);
+
+					// Version Wikipedia
+					RGBA_from_YUYV[i] = (R[Cr]<<16) + (((uchar)CLIP_UCHAR(Y-0.39465*(Cr-128) + G_tmp))<< 8)+ B + (255<<24);
+				}
+			}
+		}
+	}
+	return NULL;
 }
 
 void init_false_colors()
 {
-    int i, val;
-    int min;
-    
-    FOR_INV(i, 256)
-    {
-        min=(int)(i*6/256)*256/6;
-        if ((i-min) > 256/6) min++;
-        val=(i-min)*6;
-        switch (i*6/256)
-        {
-            case 0:false_colors[i]=(val)+(255<<24);
-                break;
-            case 1:false_colors[i]=255+(val<<8)+(255<<24);
-                break;
-            case 2:false_colors[i]=(255-val)+(255<<8)+(255<<24);
-                break;
-            case 3:false_colors[i]=(255<<8)+(val<<16)+(255<<24);
-                break;
-            case 4:false_colors[i]=((255-val)<<8)+(255<<16)+(255<<24);
-                break;
-            case 5:false_colors[i]=(255<<16)+(val)+(val<<8)+(255<<24);
-                break;
-        }
-    }
+	int i, val;
+	int min;
+
+	FOR_INV(i, 256)
+	{
+		min=(int)(i*6/256)*256/6;
+		if ((i-min) > 256/6) min++;
+		val=(i-min)*6;
+		switch (i*6/256)
+		{
+		case 0:false_colors[i]=(val)+(255<<24);
+		break;
+		case 1:false_colors[i]=255+(val<<8)+(255<<24);
+		break;
+		case 2:false_colors[i]=(255-val)+(255<<8)+(255<<24);
+		break;
+		case 3:false_colors[i]=(255<<8)+(val<<16)+(255<<24);
+		break;
+		case 4:false_colors[i]=((255-val)<<8)+(255<<16)+(255<<24);
+		break;
+		case 5:false_colors[i]=(255<<16)+(val)+(val<<8)+(255<<24);
+		break;
+		}
+	}
 }
 
 static void init_color_maps(){
-    int i;
-    if (RGBA_from_YUYV==NULL) create_RGBA_from_YUYV(NULL);
-
-    FOR_INV(i, 256){
-        gray_colors[i]= i+(i<<8)+(i<<16)+(255<<24);
-        u_colors[i]=  RGBA_from_YUYV[128+(i<<8)+(128<<16)]+(255<<24);
-        v_colors[i]=RGBA_from_YUYV[127+(127<<8)+(i<<16)];
-        r_colors[i]= 128+(128<<8)+(i<<16)+(255<<24);
-        g_colors[i]=  128+(i<<8)+(128<<16)+(255<<24);
-        b_colors[i]=  i+(128<<8)+(128<<16)+(255<<24);
-    }
-    init_false_colors();
+	int i;
+	if (RGBA_from_YUYV==NULL) create_RGBA_from_YUYV(NULL);
+
+	FOR_INV(i, 256){
+		gray_colors[i]= i+(i<<8)+(i<<16)+(255<<24);
+		u_colors[i]=  RGBA_from_YUYV[128+(i<<8)+(128<<16)]+(255<<24);
+		v_colors[i]=RGBA_from_YUYV[127+(127<<8)+(i<<16)];
+		r_colors[i]= 128+(128<<8)+(i<<16)+(255<<24);
+		g_colors[i]=  128+(i<<8)+(128<<16)+(255<<24);
+		b_colors[i]=  i+(128<<8)+(128<<16)+(255<<24);
+	}
+	init_false_colors();
 }
 
 /** Gtk cannot display a black and white image, therefore we convert it before updating it*/
 gboolean update_Y800_image(GtkImage *image, GdkFrameClock *, gpointer pointer_statusbar)
 {
-    int i, x, y, j;
-    double sx, sy;
-    uint32_t *values;
-    char text[64];
-
-    if (blc_command_loop_start()==0) exit(0);
-
-    values = (uint32_t*)image_buffer;
-    if (channel->type=='UIN8')  FOR_INV(i, channel->size) values[i]=color_map[channel->uchars[i]];
-    else if (channel->type=='FL32') FOR_INV(i, channel->size/sizeof(float)) values[i]=color_map[CLIP_UCHAR(channel->floats[i]*256-0.5f)];
-    else EXIT_ON_ARRAY_ERROR(channel, "Type not amanaged");
-    gtk_image_set_from_surface(image, image_surface);
-    
-    gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
-    cairo_surface_get_device_scale(image_surface, &sx, &sy);
-    
-    i=x*sx;
-    j=y*sy;
-    if (i<width && j<height && i>=0 && j>=0)
-    {
-        if (channel->type=='UIN8')  SPRINTF(text, "%4d,%4d: Y:%3d", i,j, channel->uchars[i+j*width]);
-        else if (channel->type=='FL32')  SPRINTF(text, "%4d,%4d: Y:%.3f", i,j, channel->floats[i+j*width]);
-        
-        gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-    }
-    iterations++;
-    blc_command_loop_end();
-    
-    return blc_status;
+	int i, x, y, j;
+	double sx, sy;
+	uint32_t *values;
+	char text[64];
+
+	if (blc_command_loop_start()==0) exit(0);
+
+	values = (uint32_t*)image_buffer;
+	if (channel->type=='UIN8')  FOR_INV(i, channel->size) values[i]=color_map[channel->uchars[i]];
+	else if (channel->type=='FL32') FOR_INV(i, channel->size/sizeof(float)) values[i]=color_map[CLIP_UCHAR(channel->floats[i]*256-0.5f)];
+	else EXIT_ON_ARRAY_ERROR(channel, "Type not managed");
+	gtk_image_set_from_surface(image, image_surface);
+
+	gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
+	cairo_surface_get_device_scale(image_surface, &sx, &sy);
+
+	i=x*sx;
+	j=y*sy;
+	if (i<width && j<height && i>=0 && j>=0)
+	{
+		if (channel->type=='UIN8')  SPRINTF(text, "%4d,%4d: Y:%3d", i,j, channel->uchars[i+j*width]);
+		else if (channel->type=='FL32')  SPRINTF(text, "%4d,%4d: Y:%.3f", i,j, channel->floats[i+j*width]);
+
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+	}
+	iterations++;
+	blc_command_loop_end();
+
+	return blc_status;
 }
 
 gboolean update_RGB3_image(GtkImage *image, GdkFrameClock *, gpointer pointer_statusbar)
 {
-    char text[NAME_MAX];
-    double sx, sy;
-    int x, y, i=0, j=0;
-    int R, G, B;
-
-
-    
-    gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
-    cairo_surface_get_device_scale(image_surface, &sx, &sy);
-    
-    while(i!=channel->size)
-    {
-        image_buffer[j++]=channel->uchars[i+2];
-        image_buffer[j++]=channel->uchars[i+1];
-        image_buffer[j++]=channel->uchars[i];
-        j++;
-        i+=3;
-    }
-    
-    i=x*sx;
-    j=y*sy;
-    
-    if (i<width && j<height && i>=0 && j>=0)
-    {
-        if (mouse_channel.fd!=-1)
-        {
-            mouse_channel.uints32[0]=i;
-            mouse_channel.uints32[1]=j;
-            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
-        }
-        
-        R=channel->uchars[i*4+j*width*3];
-        G=channel->uchars[i*4+j*width*3+1];
-        B=channel->uchars[i*4+j*width*3+2];
-        SPRINTF(text, "%4d,%4d : R:%3d,G:%3d,B:%3d", i, j, R, G, B);
-        
-        gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-    }
-    gtk_image_set_from_surface(image, image_surface);
-    iterations++;
-
-    return G_SOURCE_CONTINUE;
+	char text[NAME_MAX];
+	double sx, sy;
+	int x, y, i=0, j=0;
+	int R, G, B;
+
+
+
+	gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
+	cairo_surface_get_device_scale(image_surface, &sx, &sy);
+
+	while(i!=channel->size)
+	{
+		image_buffer[j++]=channel->uchars[i+2];
+		image_buffer[j++]=channel->uchars[i+1];
+		image_buffer[j++]=channel->uchars[i];
+		j++;
+		i+=3;
+	}
+
+	i=x*sx;
+	j=y*sy;
+
+	if (i<width && j<height && i>=0 && j>=0)
+	{
+		if (mouse_channel.fd!=-1)
+		{
+			mouse_channel.uints32[0]=i;
+			mouse_channel.uints32[1]=j;
+			gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+		}
+
+		R=channel->uchars[i*4+j*width*3];
+		G=channel->uchars[i*4+j*width*3+1];
+		B=channel->uchars[i*4+j*width*3+2];
+		SPRINTF(text, "%4d,%4d : R:%3d,G:%3d,B:%3d", i, j, R, G, B);
+
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+	}
+	gtk_image_set_from_surface(image, image_surface);
+	iterations++;
+
+	return G_SOURCE_CONTINUE;
 }
 
 gboolean update_RGBA_image(GtkImage *image, GdkFrameClock *, gpointer pointer_statusbar)
 {
-    double sx, sy;
-    int x, y;
-    int i, j=0;
-    char text[NAME_MAX];
-    int R, G, B, A;
-    
-    gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
-    cairo_surface_get_device_scale(image_surface, &sx, &sy);
-    
-    FOR_INV(i, channel->size/4) ((uint32_t*)image_buffer)[i]=SWAP_RGBA_TO_CAIRO_ARGB32(channel->uints32[i]);
-    
-    i=x*sx;
-    j=y*sy;
-    
-    if (i<width && j<height && i>=0 && j>=0)
-    {
-        if (mouse_channel.fd!=-1)
-        {
-            mouse_channel.uints32[0]=i;
-            mouse_channel.uints32[1]=j;
-            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
-        }
-        
-        R=channel->uchars[i*4+j*width*4];
-        G=channel->uchars[i*4+j*width*4+1];
-        B=channel->uchars[i*4+j*width*4+2];
-        A=channel->uchars[i*4+j*width*4+3];
-        SPRINTF(text, "%4d,%4d: R:%d G:%d B:%d A:%d", i, j, R, G, B, A);
-        
-        gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-    }
-    gtk_image_set_from_surface(image, image_surface);
-    iterations++;
-    return G_SOURCE_CONTINUE;
+	double sx, sy;
+	int x, y;
+	int i, j=0;
+	char text[NAME_MAX];
+	int R, G, B, A;
+
+	gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
+	cairo_surface_get_device_scale(image_surface, &sx, &sy);
+
+	FOR_INV(i, channel->size/4) ((uint32_t*)image_buffer)[i]=SWAP_RGBA_TO_CAIRO_ARGB32(channel->uints32[i]);
+
+	i=x*sx;
+	j=y*sy;
+
+	if (i<width && j<height && i>=0 && j>=0)
+	{
+		if (mouse_channel.fd!=-1)
+		{
+			mouse_channel.uints32[0]=i;
+			mouse_channel.uints32[1]=j;
+			gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+		}
+
+		R=channel->uchars[i*4+j*width*4];
+		G=channel->uchars[i*4+j*width*4+1];
+		B=channel->uchars[i*4+j*width*4+2];
+		A=channel->uchars[i*4+j*width*4+3];
+		SPRINTF(text, "%4d,%4d: R:%d G:%d B:%d A:%d", i, j, R, G, B, A);
+
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+	}
+	gtk_image_set_from_surface(image, image_surface);
+	iterations++;
+	return G_SOURCE_CONTINUE;
 }
 
 
 // Soon we should the implementation of blc_image */
 void jpeg_error(j_common_ptr cinfo, int msg_level)
 {
-    (void) msg_level;
-    cinfo->err->num_warnings++;
+	(void) msg_level;
+	cinfo->err->num_warnings++;
 }
 
 gboolean update_JPEG_image(GtkImage *image, GdkFrameClock *frame_clock, blc_channel *channel)
 {
-    JSAMPROW row_pt[1];
-    GdkPixbuf *pixbuf;
-    int row_stride;
-    uchar *pixels;
-    struct jpeg_decompress_struct cinfo;
-    struct jpeg_error_mgr jerr;
-    (void) frame_clock;
-    
-    pixbuf = gtk_image_get_pixbuf(image);
-    pixels = gdk_pixbuf_get_pixels(pixbuf);
-    
-    cinfo.err = jpeg_std_error(&jerr);
-    cinfo.err->emit_message = jpeg_error;
-    jpeg_create_decompress(&cinfo);
-    jpeg_mem_src(&cinfo, (uchar*) channel->data, channel->size);
-    jpeg_read_header(&cinfo, TRUE);
-    jpeg_start_decompress(&cinfo);
-    row_stride = cinfo.output_width * cinfo.output_components;
-    row_pt[0] = pixels;
-    
-    while (cinfo.output_scanline < cinfo.output_height)
-    {
-        jpeg_read_scanlines(&cinfo, row_pt, 1);
-        row_pt[0] += row_stride;
-    }
-    
-    if (cinfo.err->num_warnings != 0)
-    {
-        PRINT_WARNING("Drop image : %s", cinfo.err->jpeg_message_table[cinfo.err->last_jpeg_message]);
-        cinfo.err->num_warnings = 0;
-    }
-    gtk_image_set_from_pixbuf(image, pixbuf);
-    jpeg_finish_decompress(&cinfo);
-    jpeg_destroy_decompress(&cinfo);
-    
-    return G_SOURCE_CONTINUE;
+	JSAMPROW row_pt[1];
+	GdkPixbuf *pixbuf;
+	int row_stride;
+	uchar *pixels;
+	struct jpeg_decompress_struct cinfo;
+	struct jpeg_error_mgr jerr;
+	(void) frame_clock;
+
+	pixbuf = gtk_image_get_pixbuf(image);
+	pixels = gdk_pixbuf_get_pixels(pixbuf);
+
+	cinfo.err = jpeg_std_error(&jerr);
+	cinfo.err->emit_message = jpeg_error;
+	jpeg_create_decompress(&cinfo);
+	jpeg_mem_src(&cinfo, (uchar*) channel->data, channel->size);
+	jpeg_read_header(&cinfo, TRUE);
+	jpeg_start_decompress(&cinfo);
+	row_stride = cinfo.output_width * cinfo.output_components;
+	row_pt[0] = pixels;
+
+	while (cinfo.output_scanline < cinfo.output_height)
+	{
+		jpeg_read_scanlines(&cinfo, row_pt, 1);
+		row_pt[0] += row_stride;
+	}
+
+	if (cinfo.err->num_warnings != 0)
+	{
+		PRINT_WARNING("Drop image : %s", cinfo.err->jpeg_message_table[cinfo.err->last_jpeg_message]);
+		cinfo.err->num_warnings = 0;
+	}
+	gtk_image_set_from_pixbuf(image, pixbuf);
+	jpeg_finish_decompress(&cinfo);
+	jpeg_destroy_decompress(&cinfo);
+
+	return G_SOURCE_CONTINUE;
 }
 
 // 4:2:2
 
-gboolean update_YUYV_image(GtkImage *image, GdkFrameClock *frame_clock, blc_channel *channel)
+gboolean update_YUYV_image(GtkImage *image, GdkFrameClock *frame_clock, void*)
 {
-    int i, j;
-    uchar *data = (uchar*) channel->data;
-    uint32_t *pixels;
-    int Y, Cb = 128, Cr = 128;
-    
-    (void) frame_clock;
-    
-    pixels = (uint32_t*)image_buffer;
-    
-    i = 0;
-    while (i != (int) channel->size)
-    {
-        Y = data[i++];
-        Cb = data[i++];
-        j = Y + (Cb << 8) + (Cr << 16);
-        pixels[0]=RGBA_from_YUYV[j];
-        
-        Y = data[i++];
-        Cr = data[i++];
-        j = Y + (Cb << 8) + (Cr << 16);
-        pixels[1]=RGBA_from_YUYV[j];
-        pixels+=2;
-    }
-    
-    gtk_image_set_from_surface(image, image_surface);
-    
-    return G_SOURCE_CONTINUE;
+	int i, j;
+	uchar *data = (uchar*) channel->data;
+	uint32_t *pixels;
+	int Y, Cb = 128, Cr = 128;
+
+	(void) frame_clock;
+
+	pixels = (uint32_t*)image_buffer;
+
+	if (blc_command_loop_start()==0) exit(0);
+	i = 0;
+	while (i != (int) channel->size)
+	{
+		Y = data[i++];
+		Cb = data[i++];
+		j = Y + (Cb << 8) + (Cr << 16);
+		pixels[0]=RGBA_from_YUYV[j];
+
+		Y = data[i++];
+		Cr = data[i++];
+		j = Y + (Cb << 8) + (Cr << 16);
+		pixels[1]=RGBA_from_YUYV[j];
+		pixels+=2;
+	}
+	iterations++;
+	blc_command_loop_end();
+
+	gtk_image_set_from_surface(image, image_surface);
+
+	return G_SOURCE_CONTINUE;
 }
 
 // 4:2:2
 
 gboolean update_yuv2_image(GtkImage *image, GdkFrameClock *, gpointer pointer_statusbar)
 {
-    double sx, sy;
-    int x, y;
-    int i, j;
-    
-    uchar *data = (uchar*) channel->data;
-    char text[NAME_MAX];
-    uint32_t *tmp_pixels;
-    int Y, U = 128, V = 128;
-    
-    tmp_pixels = (uint32_t*)image_buffer;
-    i = 0;
-    
-    while (i != (int) channel->size)
-    {
-        U = data[i++];
-        Y = data[i++];
-        
-        j = Y + (U << 8) + (V << 16);
-        tmp_pixels[0]=RGBA_from_YUYV[j];
-        
-        V = data[i++];
-        Y = data[i++];
-        
-        j = Y + (U << 8) + (V << 16);
-        tmp_pixels[1]=RGBA_from_YUYV[j];
-        tmp_pixels+=2;
-    }
-    
-    gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
-    cairo_surface_get_device_scale(image_surface, &sx, &sy);
-    
-    i=x*sx;
-    j=y*sy;
-    
-    
-    if (i<width && j<height && i>=0 && j>=0)
-    {
-        if (mouse_channel.fd!=-1)
-        {
-            mouse_channel.uints32[0]=i;
-            mouse_channel.uints32[1]=j;
-            gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
-        }
-        
-        Y=channel->uchars[i*2+j*width*2+1];
-        U=channel->uchars[i*4+j*width*2];
-        V=channel->uchars[i*4+j*width*2+2];
-        SPRINTF(text, "%d,%d: Y:%d, U:%d, V:%d", i, j, Y, U, V);
-        
-        gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-    }
-    gtk_image_set_from_surface(image, image_surface);
-    iterations++;
-    return G_SOURCE_CONTINUE;
+	double sx, sy;
+	int x, y;
+	int i, j;
+
+	uchar *data = (uchar*) channel->data;
+	char text[NAME_MAX];
+	uint32_t *tmp_pixels;
+	int Y, U = 128, V = 128;
+
+	tmp_pixels = (uint32_t*)image_buffer;
+	i = 0;
+
+	while (i != (int) channel->size)
+	{
+		U = data[i++];
+		Y = data[i++];
+
+		j = Y + (U << 8) + (V << 16);
+		tmp_pixels[0]=RGBA_from_YUYV[j];
+
+		V = data[i++];
+		Y = data[i++];
+
+		j = Y + (U << 8) + (V << 16);
+		tmp_pixels[1]=RGBA_from_YUYV[j];
+		tmp_pixels+=2;
+	}
+
+	gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
+	cairo_surface_get_device_scale(image_surface, &sx, &sy);
+
+	i=x*sx;
+	j=y*sy;
+
+
+	if (i<width && j<height && i>=0 && j>=0)
+	{
+		if (mouse_channel.fd!=-1)
+		{
+			mouse_channel.uints32[0]=i;
+			mouse_channel.uints32[1]=j;
+			gdk_device_get_state(pointer_device, gtk_widget_get_window(GTK_WIDGET(image)), NULL, (GdkModifierType*)(&mouse_channel.uints32[2]));
+		}
+
+		Y=channel->uchars[i*2+j*width*2+1];
+		U=channel->uchars[i*4+j*width*2];
+		V=channel->uchars[i*4+j*width*2+2];
+		SPRINTF(text, "%d,%d: Y:%d, U:%d, V:%d", i, j, Y, U, V);
+
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+	}
+	gtk_image_set_from_surface(image, image_surface);
+	iterations++;
+	return G_SOURCE_CONTINUE;
 }
 
 static void draw_histogram(uint32_t *drawing, int height, int histogram[256], uint32_t color_map[256], int max)
 {
-    int i, j, val;
-    FOR_INV(i, 256)
-    {
-        val = height-histogram[i]*(height-1)/max;
-        for(j=height; j!=val; j--) drawing[j*256+i]=color_map[i];
-        drawing[val*256+i]=255<<24;
-        FOR_INV(j, val) drawing[j*256+i]=0;
-    }
+	int i, j, val;
+	FOR_INV(i, 256)
+	{
+		val = height-histogram[i]*(height-1)/max;
+		for(j=height; j!=val; j--) drawing[j*256+i]=color_map[i];
+		drawing[val*256+i]=255<<24;
+		FOR_INV(j, val) drawing[j*256+i]=0;
+	}
 }
 
 gboolean update_histogram_cb(GtkImage *image, GdkFrameClock *, gpointer pointer_statusbar){
-    int i, j, x, y;
-    
-    double sx, sy;
-    int histogram[256]={0}, histogram1[256]={0}, histogram2[256]={0}, max=0, max1=0, max2=0;
-    char text[64];
-    struct timeval timer;
-    
-    CLEAR(timer);
-    gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
-    cairo_surface_get_device_scale(histogram_surface, &sx, &sy);
-    
-    x*=sx;
-    y*=sy;
-
-    switch (channel->format){
-        case 'Y800':
-            FOR_INV(i, channel->size) histogram[channel->uchars[i]]++;
-            FOR_INV(i, 256) max=MAX(histogram[i], max);
-            
-            FOR_INV(i, 256)
-        {
-            FOR_INV(j, histogram[i]*255/max) histogram_data[(255-j)*256+i]=color_map[i];
-            histogram_data[(255-histogram[i]*255/max)*256+i]=255<<24;
-            FOR_INV(j, 255-histogram[i]*255/max) histogram_data[j*256+i]=0;
-        }
-            if (y>=0 && y<256 && x >=0 && x<256)
-            {
-                SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100/(float)channel->size);
-                gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-            }
-            break;
-        case 'RGB3':
-            FOR_INV(i, channel->size/3){
-                histogram[channel->uchars[i*3]]++;
-                histogram1[channel->uchars[i*3+1]]++;
-                histogram2[channel->uchars[i*3+2]]++;
-            }
-            
-            FOR_INV(i, 256)
-        {
-            max=MAX(histogram[i], max);
-            max1=MAX(histogram1[i], max1);
-            max2=MAX(histogram2[i], max2);
-        }
-            draw_histogram(histogram_data, 85, histogram, r_colors, max);
-            draw_histogram(histogram_data+256*85, 85, histogram1, g_colors, max1);
-            draw_histogram(histogram_data+256*170, 85, histogram2, b_colors, max2);
-            
-            if (y>=0 && y<256 && x >=0 && x<256)
-            {
-                if (y<85)  SPRINTF(text, "R[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
-                else if (y<170)  SPRINTF(text, "G[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
-                else  SPRINTF(text, "B[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
-                gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-            }
-            
-            break;
-        case 'yuv2':
-            for(i=channel->size-1;i!=-1;i-=2) histogram[channel->uchars[i]]++;
-            for(i=channel->size-2;i!=-2;i-=4) histogram1[channel->uchars[i]]++;
-            for(i=channel->size-4;i!=-4;i-=4) histogram2[channel->uchars[i]]++;
-            
-            FOR_INV(i, 256)
-        {
-            max=MAX(histogram[i], max);
-            max1=MAX(histogram1[i], max1);
-            max2=MAX(histogram2[i], max2);
-        }
-            
-            draw_histogram(histogram_data, 127, histogram, gray_colors, max);
-            draw_histogram(histogram_data+256*128, 63, histogram1, u_colors, max1);
-            draw_histogram(histogram_data+256*192, 63, histogram2, v_colors, max2);
-            
-            if (y>=0 && y<256 && x >=0 && x<256)
-            {
-                if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
-                else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
-                else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
-                gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
-                
-            }
-            
-       
-            break;
-            
-        default:
-            gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, "No histogram for this format. Only Y800,RGB3 or yuv2.");
-
-    }
-    gtk_image_set_from_surface(image, histogram_surface);
-    
-    //   fprintf(stderr, "Hist delai %ldµs\n", us_time_diff(&timer));
-    
-    return G_SOURCE_CONTINUE;
+	int i, j, x, y;
+
+	double sx, sy;
+	int histogram[256]={0}, histogram1[256]={0}, histogram2[256]={0}, max=0, max1=0, max2=0;
+	char text[64];
+	struct timeval timer;
+
+	CLEAR(timer);
+	gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(image)), pointer_device, &x, &y, NULL);
+	cairo_surface_get_device_scale(histogram_surface, &sx, &sy);
+
+	x*=sx;
+	y*=sy;
+
+	switch (channel->format){
+	case 'Y800':
+	FOR_INV(i, channel->size) histogram[channel->uchars[i]]++;
+	FOR_INV(i, 256) max=MAX(histogram[i], max);
+
+	FOR_INV(i, 256)
+	{
+		FOR_INV(j, histogram[i]*255/max) histogram_data[(255-j)*256+i]=color_map[i];
+		histogram_data[(255-histogram[i]*255/max)*256+i]=255<<24;
+		FOR_INV(j, 255-histogram[i]*255/max) histogram_data[j*256+i]=0;
+	}
+	if (y>=0 && y<256 && x >=0 && x<256)
+	{
+		SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100/(float)channel->size);
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+	}
+	break;
+	case 'RGB3':
+		FOR_INV(i, channel->size/3){
+			histogram[channel->uchars[i*3]]++;
+			histogram1[channel->uchars[i*3+1]]++;
+			histogram2[channel->uchars[i*3+2]]++;
+		}
+
+		FOR_INV(i, 256)
+		{
+			max=MAX(histogram[i], max);
+			max1=MAX(histogram1[i], max1);
+			max2=MAX(histogram2[i], max2);
+		}
+		draw_histogram(histogram_data, 85, histogram, r_colors, max);
+		draw_histogram(histogram_data+256*85, 85, histogram1, g_colors, max1);
+		draw_histogram(histogram_data+256*170, 85, histogram2, b_colors, max2);
+
+		if (y>=0 && y<256 && x >=0 && x<256)
+		{
+			if (y<85)  SPRINTF(text, "R[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
+			else if (y<170)  SPRINTF(text, "G[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
+			else  SPRINTF(text, "B[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+			gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+		}
+
+		break;
+	case 'YUYV':
+			for(i=channel->size-2;i!=-1;i-=2) histogram[channel->uchars[i]]++;
+			for(i=channel->size-1;i!=-2;i-=4) histogram1[channel->uchars[i]]++;
+			for(i=channel->size-3;i!=-4;i-=4) histogram2[channel->uchars[i]]++;
+
+			FOR_INV(i, 256)
+			{
+				max=MAX(histogram[i], max);
+				max1=MAX(histogram1[i], max1);
+				max2=MAX(histogram2[i], max2);
+			}
+
+			draw_histogram(histogram_data, 127, histogram, gray_colors, max);
+			draw_histogram(histogram_data+256*128, 63, histogram1, u_colors, max1);
+			draw_histogram(histogram_data+256*192, 63, histogram2, v_colors, max2);
+
+			if (y>=0 && y<256 && x >=0 && x<256)
+			{
+				if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
+				else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
+				else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+				gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+
+			}
+
+
+			break;
+	case 'yuv2':
+		for(i=channel->size-1;i!=-1;i-=2) histogram[channel->uchars[i]]++;
+		for(i=channel->size-2;i!=-2;i-=4) histogram1[channel->uchars[i]]++;
+		for(i=channel->size-4;i!=-4;i-=4) histogram2[channel->uchars[i]]++;
+
+		FOR_INV(i, 256)
+		{
+			max=MAX(histogram[i], max);
+			max1=MAX(histogram1[i], max1);
+			max2=MAX(histogram2[i], max2);
+		}
+
+		draw_histogram(histogram_data, 127, histogram, gray_colors, max);
+		draw_histogram(histogram_data+256*128, 63, histogram1, u_colors, max1);
+		draw_histogram(histogram_data+256*192, 63, histogram2, v_colors, max2);
+
+		if (y>=0 && y<256 && x >=0 && x<256)
+		{
+			if (y<128)  SPRINTF(text, "Y[%d]=%f.2%%", x, histogram[x]*100*2/(float)channel->size);
+			else if (y<192)  SPRINTF(text, "U[%d]=%.2f%%", x, histogram1[x]*100*4/(float)channel->size);
+			else  SPRINTF(text, "V[%d]=%.2f%%", x, histogram2[x]*100*4/(float)channel->size);
+			gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, text);
+
+		}
+
+
+		break;
+
+	default:
+		gtk_statusbar_push(GTK_STATUSBAR(pointer_statusbar), 0, "No histogram for this format. Only Y800,RGB3 or yuv2.");
+
+	}
+	gtk_image_set_from_surface(image, histogram_surface);
+
+	//   fprintf(stderr, "Hist delai %ldµs\n", us_time_diff(&timer));
+
+	return G_SOURCE_CONTINUE;
 }
 
 static void gtk_image_resize_cb(GtkWidget *image,  GdkRectangle *allocation, gpointer user_data)
 {
-    (void) image;
-    (void) user_data;
-    
-    if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button))) cairo_surface_set_device_scale(image_surface, (double)width/(double)allocation->width, (double)height/(double)allocation->height);
-    if (legend) cairo_surface_set_device_scale(legend_surface, 256/(double)allocation->width, 1/(double)allocation->height);
+	(void) image;
+	(void) user_data;
+
+	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button))) cairo_surface_set_device_scale(image_surface, (double)width/(double)allocation->width, (double)height/(double)allocation->height);
+	if (legend) cairo_surface_set_device_scale(legend_surface, 256/(double)allocation->width, 1/(double)allocation->height);
 }
 
 static void histogram_resize_cb(GtkWidget *widget,  GdkRectangle *allocation, gpointer user_data)
 {
-    (void) widget;
-    (void) user_data;
-    cairo_surface_set_device_scale(histogram_surface, (double)256/(double)allocation->width, (double)256/(double)allocation->height);
+	(void) widget;
+	(void) user_data;
+	cairo_surface_set_device_scale(histogram_surface, (double)256/(double)allocation->width, (double)256/(double)allocation->height);
 }
 
 static void zoom_original_cb(GtkToolButton *, gpointer)
 {
-    int image_height, window_height;
-    
-    image_height=gtk_widget_get_allocated_height(image);
-    window_height = gtk_widget_get_allocated_height(window);
-    
-    cairo_surface_set_device_scale(image_surface, 1, 1);
-    if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button)))
-        gtk_window_resize(GTK_WINDOW(window), width, window_height-image_height+height );
+	int image_height, window_height;
+
+	image_height=gtk_widget_get_allocated_height(image);
+	window_height = gtk_widget_get_allocated_height(window);
+
+	cairo_surface_set_device_scale(image_surface, 1, 1);
+	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button)))
+		gtk_window_resize(GTK_WINDOW(window), width, window_height-image_height+height );
 }
 
 static void zoom_cb(GtkToolButton *toolbutton, double *factor)
 {
-    double sx, sy;
-    (void)toolbutton;
-    
-    gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button), FALSE);
-    cairo_surface_get_device_scale(image_surface, &sx, &sy);
-    cairo_surface_set_device_scale(image_surface, sx*(*factor), sy*(*factor));
+	double sx, sy;
+	(void)toolbutton;
+
+	gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(zoom_button), FALSE);
+	cairo_surface_get_device_scale(image_surface, &sx, &sy);
+	cairo_surface_set_device_scale(image_surface, sx*(*factor), sy*(*factor));
 }
 
 static void histogram_cb(GtkToolButton *toolbutton, gpointer pointer_statusbar )
 {
-    char text[NAME_MAX];
-    GtkWidget *legend_box, *label;
-    
-    if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolbutton)))
-    {
-        histogram_data=MANY_ALLOCATIONS(256*256, uint32_t);
-        histogram_surface=cairo_image_surface_create_for_data ((uchar*)histogram_data, CAIRO_FORMAT_ARGB32, 256, 256, 256*4);
-        histogram_image=gtk_image_new_from_surface(histogram_surface);
-        histogram_scrolled_window=gtk_scrolled_window_new(NULL, NULL);
-        histogram=gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
-        legend_box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
-        gtk_container_add(GTK_CONTAINER(histogram_scrolled_window), histogram_image);
-        gtk_container_add(GTK_CONTAINER(histogram), histogram_scrolled_window);
-        gtk_container_add(GTK_CONTAINER(histogram), legend_box);
-        
-        SPRINTF(text, "%d", min);
-        label=gtk_label_new(text);
-        gtk_box_pack_start(GTK_BOX(legend_box), label, FALSE, FALSE, 0);
-        SPRINTF(text, "%d", max);
-        label=gtk_label_new(text);
-        gtk_box_pack_end(GTK_BOX(legend_box), label, FALSE, FALSE, 0);
-        
-        if (legend)
-        {
-            gtk_container_remove(GTK_CONTAINER(paned), legend);
-            //    gtk_widget_destroy(legend);
-            legend=NULL;
-        }
-        gtk_paned_add2(GTK_PANED(paned), histogram);
-        gtk_widget_set_vexpand(histogram_image, TRUE);
-        gtk_paned_set_position(GTK_PANED(paned), gtk_widget_get_allocated_height(paned)-256);
-        gtk_widget_show_all(paned);
-        g_signal_connect(G_OBJECT(histogram_scrolled_window), "size-allocate", G_CALLBACK(histogram_resize_cb), NULL);
-        histogram_tick_id = gtk_widget_add_tick_callback(GTK_WIDGET(histogram_image), (GtkTickCallback) update_histogram_cb, pointer_statusbar, NULL);
-    }
-    else
-    {
-        gtk_widget_remove_tick_callback(GTK_WIDGET(histogram_image), histogram_tick_id);
-        gtk_container_remove(GTK_CONTAINER(paned), histogram);
-        FREE(histogram_data);
-        //    gtk_widget_destroy(histogram);
-        histogram=NULL;
-    }
+	char text[NAME_MAX];
+	GtkWidget *legend_box, *label;
+
+	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolbutton)))
+	{
+		histogram_data=MANY_ALLOCATIONS(256*256, uint32_t);
+		histogram_surface=cairo_image_surface_create_for_data ((uchar*)histogram_data, CAIRO_FORMAT_ARGB32, 256, 256, 256*4);
+		histogram_image=gtk_image_new_from_surface(histogram_surface);
+		histogram_scrolled_window=gtk_scrolled_window_new(NULL, NULL);
+		histogram=gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
+		legend_box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+		gtk_container_add(GTK_CONTAINER(histogram_scrolled_window), histogram_image);
+		gtk_container_add(GTK_CONTAINER(histogram), histogram_scrolled_window);
+		gtk_container_add(GTK_CONTAINER(histogram), legend_box);
+
+		SPRINTF(text, "%d", min);
+		label=gtk_label_new(text);
+		gtk_box_pack_start(GTK_BOX(legend_box), label, FALSE, FALSE, 0);
+		SPRINTF(text, "%d", max);
+		label=gtk_label_new(text);
+		gtk_box_pack_end(GTK_BOX(legend_box), label, FALSE, FALSE, 0);
+
+		if (legend)
+		{
+			gtk_container_remove(GTK_CONTAINER(paned), legend);
+			//    gtk_widget_destroy(legend);
+			legend=NULL;
+		}
+		gtk_paned_add2(GTK_PANED(paned), histogram);
+		gtk_widget_set_vexpand(histogram_image, TRUE);
+		gtk_paned_set_position(GTK_PANED(paned), gtk_widget_get_allocated_height(paned)-256);
+		gtk_widget_show_all(paned);
+		g_signal_connect(G_OBJECT(histogram_scrolled_window), "size-allocate", G_CALLBACK(histogram_resize_cb), NULL);
+		histogram_tick_id = gtk_widget_add_tick_callback(GTK_WIDGET(histogram_image), (GtkTickCallback) update_histogram_cb, pointer_statusbar, NULL);
+	}
+	else
+	{
+		gtk_widget_remove_tick_callback(GTK_WIDGET(histogram_image), histogram_tick_id);
+		gtk_container_remove(GTK_CONTAINER(paned), histogram);
+		FREE(histogram_data);
+		//    gtk_widget_destroy(histogram);
+		histogram=NULL;
+	}
 }
 
 static void false_color_cb(GtkToolButton *toolbutton, struct  update_cb *){
-    GtkWidget *label, *legend_box, *legend_image;
-    char text[NAME_MAX+1];
-    int i;
-    
-    if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolbutton))){
-        color_map=false_colors;
-        legend_surface=cairo_image_surface_create_for_data ((uchar*)false_colors, CAIRO_FORMAT_RGB24, 256, 1, 256*4);
-        legend=gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
-        legend_image = gtk_image_new_from_surface(legend_surface);
-        legend_box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
-        
-        FOR(i, 7)
-        {
-            SPRINTF(text, "%d", (i+1)*256/8);
-            label = gtk_label_new(text);
-            gtk_box_pack_start(GTK_BOX(legend_box), label, TRUE, TRUE, 0);
-        }
-        gtk_container_add(GTK_CONTAINER(legend), legend_image);
-        gtk_container_add(GTK_CONTAINER(legend), legend_box);
-        gtk_paned_add2(GTK_PANED(paned),legend );
-        gtk_widget_show_all(legend);
-    }
-    else{
-        color_map=gray_colors;
-        if (legend){
-            gtk_container_remove(GTK_CONTAINER(paned), legend);
-            gtk_widget_destroy(legend);
-            legend=NULL;
-        }
-    }
+	GtkWidget *label, *legend_box, *legend_image;
+	char text[NAME_MAX+1];
+	int i;
+
+	if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolbutton))){
+		color_map=false_colors;
+		legend_surface=cairo_image_surface_create_for_data ((uchar*)false_colors, CAIRO_FORMAT_RGB24, 256, 1, 256*4);
+		legend=gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
+		legend_image = gtk_image_new_from_surface(legend_surface);
+		legend_box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+
+		FOR(i, 7)
+		{
+			SPRINTF(text, "%d", (i+1)*256/8);
+			label = gtk_label_new(text);
+			gtk_box_pack_start(GTK_BOX(legend_box), label, TRUE, TRUE, 0);
+		}
+		gtk_container_add(GTK_CONTAINER(legend), legend_image);
+		gtk_container_add(GTK_CONTAINER(legend), legend_box);
+		gtk_paned_add2(GTK_PANED(paned),legend );
+		gtk_widget_show_all(legend);
+	}
+	else{
+		color_map=gray_colors;
+		if (legend){
+			gtk_container_remove(GTK_CONTAINER(paned), legend);
+			gtk_widget_destroy(legend);
+			legend=NULL;
+		}
+	}
 }
 
 
 
 void *refresh_RGB3_cb(void *)
 {
-    int ch=' ';
-    
-    while(ch!='q')
-    {
-        ch=fgetc(stdin);
-        switch (ch){
-                
-            case '\n': case '.':   gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, &g_source_remove_pt, NULL);
-                
-                break;
-            case 'q': g_application_quit(G_APPLICATION(app)); break;
-            default:fprintf(stderr, "Unknown command '%c' code '%d'.\n", ch, ch);
-        }
-    }
-    return NULL;
+	int ch=' ';
+
+	while(ch!='q')
+	{
+		ch=fgetc(stdin);
+		switch (ch){
+
+		case '\n': case '.':   gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, &g_source_remove_pt, NULL);
+
+		break;
+		case 'q': g_application_quit(G_APPLICATION(app)); break;
+		default:fprintf(stderr, "Unknown command '%c' code '%d'.\n", ch, ch);
+		}
+	}
+	return NULL;
 }
 
 void *refresh_yuv2_cb(void *user_data)
 {
-    int ch=' ';
-    (void)user_data;
-    
-    while(ch!='q')
-    {
-        ch=fgetc(stdin);
-        switch (ch){
-                
-            case '\n': case '.':   gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_yuv2_image, &g_source_remove_pt, NULL);
-                
-                break;
-            case 'q': g_application_quit(G_APPLICATION(app)); break;
-            default:fprintf(stderr, "Unknown command '%c' code '%d'.\n", ch, ch);
-        }
-    }
-    return NULL;
+	int ch=' ';
+	(void)user_data;
+
+	while(ch!='q')
+	{
+		ch=fgetc(stdin);
+		switch (ch){
+
+		case '\n': case '.':   gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_yuv2_image, &g_source_remove_pt, NULL);
+
+		break;
+		case 'q': g_application_quit(G_APPLICATION(app)); break;
+		default:fprintf(stderr, "Unknown command '%c' code '%d'.\n", ch, ch);
+		}
+	}
+	return NULL;
 }
 
 int frame_rate(gpointer data)
 {
-    char text[64];
-    GtkWidget *framerate_statusbar=(GtkWidget*)data;
-    
-    SPRINTF(text, "%dHz", iterations);
-    gtk_statusbar_push(GTK_STATUSBAR(framerate_statusbar), 0, text);
-    iterations=0;
-    return G_SOURCE_CONTINUE;
+	char text[64];
+	GtkWidget *framerate_statusbar=(GtkWidget*)data;
+
+	SPRINTF(text, "%dHz", iterations);
+	gtk_statusbar_push(GTK_STATUSBAR(framerate_statusbar), 0, text);
+	iterations=0;
+	return G_SOURCE_CONTINUE;
 }
 
 GtkWidget *create_image_display(blc_channel *tmp_channel)
 {
-    GtkWidget  *pointer_statusbar, *framerate_statusbar;
-    char label_text[NAME_MAX + 1];
-    uint32_t type_string, format_string;
-    
-    
-    channel=tmp_channel;
-    toolbar = gtk_toolbar_new();
-    general_statusbar=gtk_statusbar_new();
-    framerate_statusbar=gtk_statusbar_new();
-    pointer_statusbar=gtk_statusbar_new();
-    
-    switch (channel->format)
-    {
-        case 'Y800':
-            width=channel->dims[0].length;
-            height=channel->dims[1].length;
-            image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
-            image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
-            image=gtk_image_new_from_surface(image_surface);
-            gtk_widget_add_tick_callback(image, (GtkTickCallback) update_Y800_image, pointer_statusbar, NULL);
-            false_colors_button=blgtk_add_toggle_tool_button(toolbar, "false\ncolors", "applications-graphics", G_CALLBACK(false_color_cb),  NULL);
-            break;
-        case 'BA81':
-            EXIT_ON_ARRAY_ERROR(channel, "format, Not fully implemented");
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
-            image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
-            image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
-            image=gtk_image_new_from_surface(image_surface);
-            gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, &g_source_continue, NULL);
-            break;
-        case 'RGB3':
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
-            image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
-            image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
-            image=gtk_image_new_from_surface(image_surface);
-            gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, pointer_statusbar, NULL);
-            break;
-        case 'RGBA':
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
-            image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
-            image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_ARGB32, width, height, width * 4);
-            image=gtk_image_new_from_surface(image_surface);
-            gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGBA_image, pointer_statusbar, NULL);
-            break;
-            /*  case 'JPEG':
+	GtkWidget  *pointer_statusbar, *framerate_statusbar;
+	char label_text[NAME_MAX + 1];
+	uint32_t type_string, format_string;
+
+	channel=tmp_channel;
+	toolbar = gtk_toolbar_new();
+	general_statusbar=gtk_statusbar_new();
+	framerate_statusbar=gtk_statusbar_new();
+	pointer_statusbar=gtk_statusbar_new();
+
+	switch (channel->format)
+	{
+	case 'Y800':
+	width=channel->dims[0].length;
+	height=channel->dims[1].length;
+	image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
+	image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
+	image=gtk_image_new_from_surface(image_surface);
+	gtk_widget_add_tick_callback(image, (GtkTickCallback) update_Y800_image, pointer_statusbar, NULL);
+	false_colors_button=blgtk_add_toggle_tool_button(toolbar, "false\ncolors", "applications-graphics", G_CALLBACK(false_color_cb),  NULL);
+	break;
+	case 'BA81':
+		EXIT_ON_ARRAY_ERROR(channel, "format, Not fully implemented");
+		width=channel->dims[1].length;
+		height=channel->dims[2].length;
+		image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
+		image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
+		image=gtk_image_new_from_surface(image_surface);
+		gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, &g_source_continue, NULL);
+		break;
+	case 'RGB3':
+		width=channel->dims[1].length;
+		height=channel->dims[2].length;
+		image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
+		image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
+		image=gtk_image_new_from_surface(image_surface);
+		gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGB3_image, pointer_statusbar, NULL);
+		break;
+	case 'RGBA':
+		width=channel->dims[1].length;
+		height=channel->dims[2].length;
+		image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
+		image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_ARGB32, width, height, width * 4);
+		image=gtk_image_new_from_surface(image_surface);
+		gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_RGBA_image, pointer_statusbar, NULL);
+		break;
+		/*    case 'JPEG':
              width=channel->lengths[1];
              height=channel->lengths[2];
              image_buffer = MANY_ALLOCATIONS(width*height*3, uchar);
              pixbuf = gdk_pixbuf_new_from_data( image_buffer, GDK_COLORSPACE_RGB, 0, 8, width, height, width * 3, NULL, NULL);
              image = gtk_image_new_from_pixbuf(pixbuf);
-             gtk_widget_add_tick_callback(image, (GtkTickCallback) update_JPEG_image, channel, NULL);
-            case 'YUYV':
-             width=channel->lengths[1];
-             height=channel->lengths[2];
-             image_buffer = MANY_ALLOCATIONS(width*height * 3, uchar); //In order to be sure that the rowstride will be 'gui.width * 3'
-             pixbuf = gdk_pixbuf_new_from_data(image_buffer, GDK_COLORSPACE_RGB, 0, 8, width, height, width * 3, NULL, NULL);
-             image = gtk_image_new_from_pixbuf(pixbuf);
-             pthread_create(&init_table_thread, NULL, create_RGB3_from_YUYV, image);
-             gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_YUYV_image, channel, NULL);
-             break;*/
-        case 'yuv2':case 'UYVY':
-            pthread_create(&init_table_thread, NULL, create_RGBA_from_YUYV, image);
-            width=channel->dims[1].length;
-            height=channel->dims[2].length;
-            image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
-            image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
-            image=gtk_image_new_from_surface(image_surface);
-            //   if (interactive_mode) pthread_create(&thread, NULL, refresh_yuv2_cb, image);
-            //g_timeout_add(0, refresh_yuv2_cb, image); //To be improved
-            gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_yuv2_image, pointer_statusbar, NULL);
-            break;
-        default:return NULL;
-    }
-    
-    channel=tmp_channel;
-    vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
-    
-    scrolled_window=gtk_scrolled_window_new(NULL, NULL);
-    
-    gtk_container_add(GTK_CONTAINER(general_statusbar), framerate_statusbar);
-    gtk_container_add(GTK_CONTAINER(general_statusbar), pointer_statusbar);
-    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
-    
-    init_color_maps();
-    color_map=gray_colors;
-    
-    g_timeout_add(1000, frame_rate, (gpointer)framerate_statusbar);
-    SPRINTF(label_text, "%.4s, %.4s, %dx%d", UINT32_TO_STRING(type_string, channel->type), UINT32_TO_STRING(format_string, channel->format), width, height);
-    gtk_statusbar_push(GTK_STATUSBAR(general_statusbar), 0, label_text);
-    gtk_widget_set_vexpand(scrolled_window, TRUE);
-    gtk_widget_set_halign(image, GTK_ALIGN_START);
-    gtk_widget_set_valign(image, GTK_ALIGN_START);
-    
-    blgtk_add_tool_button(toolbar, "zoom\n1:1", "zoom-original", G_CALLBACK(zoom_original_cb), NULL);
-    blgtk_add_tool_button(toolbar, "zoom\nx0.5", "zoom-out", G_CALLBACK(zoom_cb), &zoom_in_factor);
-    blgtk_add_tool_button(toolbar, "zoom\nx2", "zoom-in", G_CALLBACK(zoom_cb),  &zoom_out_factor);
-    zoom_button=blgtk_add_toggle_tool_button(toolbar, "zoom\nfit", "zoom-fit-best", NULL, NULL);
-    //    blgtk_add_toggle_tool_button(toolbar, "cursor\nvalues", "system-search", NULL, NULL);/
-    histogram_button=blgtk_add_toggle_tool_button(toolbar, "histogram", "x-office-presentation", G_CALLBACK(histogram_cb), pointer_statusbar);
-    
-    gtk_toggle_tool_button_set_active(zoom_button, TRUE);
-    
-    g_signal_connect(G_OBJECT(scrolled_window), "size-allocate", G_CALLBACK(gtk_image_resize_cb), NULL);
-    
-    event_box=gtk_event_box_new();
-    paned=gtk_paned_new(GTK_ORIENTATION_VERTICAL);
-    //    gtk_paned_set_wide_handle (GTK_PANED(paned), TRUE);
-    gtk_container_add(GTK_CONTAINER(scrolled_window), event_box);
-    gtk_paned_add1(GTK_PANED(paned), scrolled_window);
-    gtk_container_add(GTK_CONTAINER(event_box), image);
-    gtk_container_add(GTK_CONTAINER(vbox), toolbar);
-    gtk_container_add(GTK_CONTAINER(vbox), paned);
-    gtk_container_add(GTK_CONTAINER(vbox), general_statusbar);
-    zoom_original_cb(NULL, NULL);
-    
-    g_signal_connect(window, "window-state-event", G_CALLBACK (toggle_fullscreen), NULL);
-    if (fullscreen_option) gtk_window_fullscreen(GTK_WINDOW(window));
-    
-    // g_signal_connect(G_OBJECT(vbox), "realize", G_CALLBACK(image_realize_cb), NULL);
-    return vbox;
+             gtk_widget_add_tick_callback(image, (GtkTickCallback) update_JPEG_image, channel, NULL);*/
+	case 'YUYV':
+		width=channel->dims[1].length;
+		height=channel->dims[2].length;
+		image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar); //In order to be sure that the rowstride will be 'gui.width * 3'
+		image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
+		image=gtk_image_new_from_surface(image_surface);
+		gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_YUYV_image, pointer_statusbar, NULL);
+		break;
+	case 'yuv2':case 'UYVY':
+		pthread_create(&init_table_thread, NULL, create_RGBA_from_YUYV, image);
+		width=channel->dims[1].length;
+		height=channel->dims[2].length;
+		image_buffer = MANY_ALLOCATIONS(width*height * 4, uchar);
+		image_surface=cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, width * 4);
+		image=gtk_image_new_from_surface(image_surface);
+		gtk_widget_add_tick_callback(GTK_WIDGET(image), (GtkTickCallback) update_yuv2_image, pointer_statusbar, NULL);
+		break;
+	default:return NULL;
+	}
+
+	channel=tmp_channel;
+	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
+
+	scrolled_window=gtk_scrolled_window_new(NULL, NULL);
+
+	gtk_container_add(GTK_CONTAINER(general_statusbar), framerate_statusbar);
+	gtk_container_add(GTK_CONTAINER(general_statusbar), pointer_statusbar);
+	gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
+
+	init_color_maps();
+	color_map=gray_colors;
+
+	g_timeout_add(1000, frame_rate, (gpointer)framerate_statusbar);
+	SPRINTF(label_text, "%.4s, %.4s, %dx%d", UINT32_TO_STRING(type_string, channel->type), UINT32_TO_STRING(format_string, channel->format), width, height);
+	gtk_statusbar_push(GTK_STATUSBAR(general_statusbar), 0, label_text);
+	gtk_widget_set_vexpand(scrolled_window, TRUE);
+	gtk_widget_set_halign(image, GTK_ALIGN_START);
+	gtk_widget_set_valign(image, GTK_ALIGN_START);
+
+	blgtk_add_tool_button(toolbar, "zoom\n1:1", "zoom-original", G_CALLBACK(zoom_original_cb), NULL);
+	blgtk_add_tool_button(toolbar, "zoom\nx0.5", "zoom-out", G_CALLBACK(zoom_cb), &zoom_in_factor);
+	blgtk_add_tool_button(toolbar, "zoom\nx2", "zoom-in", G_CALLBACK(zoom_cb),  &zoom_out_factor);
+	zoom_button=blgtk_add_toggle_tool_button(toolbar, "zoom\nfit", "zoom-fit-best", NULL, NULL);
+	//    blgtk_add_toggle_tool_button(toolbar, "cursor\nvalues", "system-search", NULL, NULL);/
+	histogram_button=blgtk_add_toggle_tool_button(toolbar, "histogram", "x-office-presentation", G_CALLBACK(histogram_cb), pointer_statusbar);
+
+	gtk_toggle_tool_button_set_active(zoom_button, TRUE);
+
+	g_signal_connect(G_OBJECT(scrolled_window), "size-allocate", G_CALLBACK(gtk_image_resize_cb), NULL);
+
+	event_box=gtk_event_box_new();
+	paned=gtk_paned_new(GTK_ORIENTATION_VERTICAL);
+	//    gtk_paned_set_wide_handle (GTK_PANED(paned), TRUE);
+	gtk_container_add(GTK_CONTAINER(scrolled_window), event_box);
+	gtk_paned_add1(GTK_PANED(paned), scrolled_window);
+	gtk_container_add(GTK_CONTAINER(event_box), image);
+	gtk_container_add(GTK_CONTAINER(vbox), toolbar);
+	gtk_container_add(GTK_CONTAINER(vbox), paned);
+	gtk_container_add(GTK_CONTAINER(vbox), general_statusbar);
+	zoom_original_cb(NULL, NULL);
+
+	g_signal_connect(window, "window-state-event", G_CALLBACK (toggle_fullscreen), NULL);
+	if (fullscreen_option) gtk_window_fullscreen(GTK_WINDOW(window));
+
+	// g_signal_connect(G_OBJECT(vbox), "realize", G_CALLBACK(image_realize_cb), NULL);
+	return vbox;
 }
 
-- 
GitLab