1 /***************************************************************************
2                              DIA_preview.cpp
3                              ---------------
4 
5        Previewer, we switch to RGB (only one Xv at a time)   and display the incoming
6        YV12 buffer in a nice windowd
7 
8     begin                : Mon Mar 25 2002
9     copyright            : (C) 2002 by mean
10     email                : fixounet@free.fr
11  ***************************************************************************/
12 
13 /***************************************************************************
14  *                                                                         *
15  *   This program is free software; you can redistribute it and/or modify  *
16  *   it under the terms of the GNU General Public License as published by  *
17  *   the Free Software Foundation; either version 2 of the License, or     *
18  *   (at your option) any later version.                                   *
19  *                                                                         *
20  ***************************************************************************/
21 
22 #include "ADM_toolkitGtk.h"
23 #include "DIA_flyDialog.h"
24 #include "DIA_flyPreview.h"
25 
26 static GtkWidget *create_dialog1(void);
27 
28 static GtkWidget *dialog = NULL;
29 static GtkWidget *vbox1;
30 static GtkWidget *drawingarea1;
31 
32 static flySeekablePreview *seekablePreview;
33 static void seekablePreview_draw(void);
34 static void seekablePreview_frame_changed(void);
35 
36 /* =================================
37             Filter Preview
38    ================================= */
DIA_filterPreview(const char * captionText,ADM_coreVideoFilter * videoStream,uint32_t frame)39 uint8_t DIA_filterPreview(const char *captionText, ADM_coreVideoFilter *videoStream, uint32_t frame)
40 {
41 	GtkWidget *hbuttonbox1, *buttonOk, *scale;
42 
43 	dialog = create_dialog1();
44 
45 	scale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 110, 1, 10, 10)));
46 	gtk_widget_show (scale);
47 	gtk_box_pack_start (GTK_BOX(vbox1), scale, FALSE, TRUE, 0);
48 
49 	hbuttonbox1 = gtk_hbutton_box_new ();
50 	gtk_widget_show (hbuttonbox1);
51 	gtk_box_pack_start (GTK_BOX(vbox1), hbuttonbox1, FALSE, TRUE, 0);
52 	gtk_button_box_set_layout (GTK_BUTTON_BOX(hbuttonbox1), GTK_BUTTONBOX_END);
53 
54 	buttonOk = gtk_button_new_from_stock ("gtk-ok");
55 	gtk_widget_show(buttonOk);
56 	gtk_container_add (GTK_CONTAINER(hbuttonbox1), buttonOk);
57 
58 	gtk_register_dialog(dialog);
59 
60 	if (captionText)
61 		gtk_window_set_title(GTK_WINDOW(dialog), captionText);
62 
63 	uint32_t width, height;
64 
65 	width = videoStream->getInfo()->width;
66 	height = videoStream->getInfo()->height;
67 
68 	g_signal_connect(scale, "value_changed", G_CALLBACK(seekablePreview_frame_changed), NULL);
69 	g_signal_connect(drawingarea1, "expose_event", G_CALLBACK(seekablePreview_draw), NULL);
70 	gtk_dialog_add_action_widget(GTK_DIALOG(dialog), buttonOk, GTK_RESPONSE_OK);
71 
72 	gtk_widget_show(dialog);
73 
74 	seekablePreview = new flySeekablePreview(width, height, videoStream, drawingarea1, scale);
75 //	seekablePreview->process();
76 	seekablePreview->sliderSet(frame);
77 	seekablePreview->sliderChanged();
78 
79 	int response;
80 
81 	while((response = gtk_dialog_run(GTK_DIALOG(dialog))) == GTK_RESPONSE_APPLY)
82 	{
83 		seekablePreview_draw();
84 	}
85 
86 	gtk_unregister_dialog(dialog);
87 	gtk_widget_destroy(dialog);
88 	delete seekablePreview;
89 
90 	return (response == GTK_RESPONSE_OK);
91 }
92 
seekablePreview_draw(void)93 void seekablePreview_draw(void)
94 {
95 	seekablePreview->sameImage();
96 }
97 
seekablePreview_frame_changed(void)98 void seekablePreview_frame_changed(void)
99 {
100 	seekablePreview->sliderChanged();
101 }
102 
103 /* =================================
104                 Preview
105    ================================= */
106 static flyPreview *preview;
107 static void preview_draw(void);
108 
DIA_previewInit(uint32_t width,uint32_t height)109 void DIA_previewInit(uint32_t width, uint32_t height)
110 {
111 	dialog = create_dialog1();
112 	gtk_widget_set_size_request(drawingarea1, width, height);
113 
114 	g_signal_connect(drawingarea1, "expose_event", G_CALLBACK(preview_draw), NULL);
115 	gtk_widget_show(dialog);
116 
117 	preview = new flyPreview(width, height, drawingarea1);
118 }
119 
DIA_previewStillAlive(void)120 uint8_t DIA_previewStillAlive(void)
121 {
122 	return (dialog != NULL);
123 }
124 
DIA_previewUpdate(uint8_t * buffer)125 uint8_t DIA_previewUpdate(uint8_t *buffer)
126 {
127 	if (dialog)
128 	{
129 		preview->display(buffer);
130 		return 1;
131 	}
132 
133 	return 0;
134 }
135 
DIA_previewEnd(void)136 void DIA_previewEnd(void)
137 {
138 	if(dialog)
139 	{
140 		delete preview;
141 
142 		gtk_widget_destroy(dialog);
143 		dialog = NULL;
144 	}
145 }
146 
preview_draw(void)147 void preview_draw(void)
148 {
149 	preview->sameImage();
150 }
151 
152 
153 /* =================================
154              Common Dialog
155    ================================= */
156 GtkWidget*
create_dialog1(void)157 create_dialog1 (void)
158 {
159 	GtkWidget *dialog1;
160 	GtkWidget *dialog_vbox1;
161 
162 	dialog1 = gtk_dialog_new ();
163 	gtk_window_set_title (GTK_WINDOW (dialog1), QT_TR_NOOP("Preview"));
164 
165 	dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog1));
166 	gtk_widget_show (dialog_vbox1);
167 
168 	vbox1 = gtk_vbox_new (FALSE, 0);
169 	gtk_widget_show (vbox1);
170 	gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
171 
172 	drawingarea1 = gtk_drawing_area_new ();
173 	gtk_widget_show (drawingarea1);
174 	gtk_box_pack_start (GTK_BOX (vbox1), drawingarea1, FALSE, TRUE, 0);
175 	gtk_widget_set_size_request (drawingarea1, 100, 100);
176 
177 	return dialog1;
178 }
179