remove whitespace at eol
[goodguy/history.git] / cinelerra-5.1 / guicast / vframe.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2011 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #ifndef VFRAME_H
23 #define VFRAME_H
24
25 #include "arraylist.h"
26 #include "bcbitmap.inc"
27 #include "bchash.inc"
28 #include "bcpbuffer.inc"
29 #include "bctexture.inc"
30 #include "bcwindowbase.inc"
31 #include "bccmodels.h"
32 #include "bccmodels.h"
33 #include "vframe.inc"
34
35 // Maximum number of prev or next effects to be pushed onto the stacks.
36 #define MAX_STACK_ELEMENTS 255
37
38
39 // Scene graph for 3D models
40 // Defined by the subclass
41 class VFrameScene
42 {
43 public:
44         VFrameScene();
45         virtual ~VFrameScene();
46 };
47
48
49
50 class VFrame
51 {
52         friend class VFramePng;
53         friend class PngReadFunction;
54 public:
55 // Create new frame with shared data if *data is nonzero.
56 // Pass 0 to *data & -1 to shmid if private data is desired.
57         VFrame(int w,
58                 int h,
59                 int color_model,
60                 long bytes_per_line = -1);
61         VFrame(unsigned char *data,
62                 int shmid,
63                 int w,
64                 int h,
65                 int color_model /* = BC_RGBA8888 */,
66                 long bytes_per_line /* = -1 */);
67         VFrame(unsigned char *data,  // 0
68                 int shmid, // -1
69                 long y_offset,
70                 long u_offset,
71                 long v_offset,
72                 int w,
73                 int h,
74                 int color_model,  /* = BC_RGBA8888 */
75                 long bytes_per_line /* = -1 */);
76         VFrame(BC_Bitmap *bitmap,
77                 int w,
78                 int h,
79                 int color_model,
80                 long bytes_per_line);
81
82         VFrame(VFrame &vframe);
83 // Create new frame for compressed data.
84         VFrame();
85         ~VFrame();
86
87 // Return 1 if the colormodel and dimensions are the same
88 // Used by FrameCache
89         int equivalent(VFrame *src, int test_stacks = 0);
90
91 // Reallocate a frame without deleting the class
92         int reallocate(
93                 unsigned char *data,   // Data if shared
94                 int shmid,             // shmid if IPC  -1 if not
95                 long y_offset,         // plane offsets if shared YUV
96                 long u_offset,
97                 long v_offset,
98                 int w,
99                 int h,
100                 int color_model,
101                 long bytes_per_line);        // -1 if unused
102
103         void set_memory(unsigned char *data,
104                 int shmid,
105                 long y_offset,
106                 long u_offset,
107                 long v_offset);
108         void set_memory(BC_Bitmap *bitmap);
109
110         void set_compressed_memory(unsigned char *data,
111                 int shmid,
112                 int data_size,
113                 int data_allocated);
114
115 // Write a PNG for debugging
116         int write_png(const char *path);
117
118 // if frame points to the same data as this return 1
119         int equals(VFrame *frame);
120 // Test if frame already matches parameters
121         int params_match(int w, int h, int color_model);
122 // Test if data values in the frame match
123         int data_matches(VFrame *frame);
124
125 //      long set_shm_offset(long offset);
126 //      long get_shm_offset();
127         int get_shmid() { return shmid; }
128         void set_use_shm(int value) { use_shm = value; }
129         int get_use_shm() { return use_shm; }
130
131 // direct copy with no alpha
132         int copy_from(VFrame *frame);
133 // BC_CModels::transfer
134         int transfer_from(VFrame *frame, int bg_color, int in_x, int in_y, int in_w, int in_h);
135         int transfer_from(VFrame *frame, int bg_color=0) {
136                 return transfer_from(frame, bg_color, 0,0, frame->get_w(),frame->get_h());
137         }
138 // Required for YUV
139         int clear_frame();
140         int allocate_compressed_data(long bytes);
141
142 // Sequence number. -1 means invalid.  Passing frames to the encoder is
143 // asynchronous.  The sequence number must be preserved in the image itself
144 // to encode discontinuous frames.
145         long get_number() { return sequence_number; }
146         void set_number(long number) { sequence_number = number; }
147
148         int get_color_model() { return color_model; }
149 // Get the data pointer
150         unsigned char* get_data() { return data; }
151         long get_compressed_allocated() { return compressed_allocated; }
152         long get_compressed_size() { return compressed_size; }
153         void set_compressed_size(long size) { compressed_size = size; }
154         double get_timestamp() { return timestamp; }
155         void set_timestamp(double time) { timestamp = time; }
156
157 // return an array of pointers to rows
158         unsigned char** get_rows() { return rows; }
159         int get_memory_usage();
160 // accessors
161         int get_w() { return w; }
162         int get_h() { return h; }
163         int get_w_fixed() { return w - 1; }
164         int get_h_fixed() { return h - 1; }
165         unsigned char *get_y() { return y; }
166         unsigned char *get_u() { return u; }
167         unsigned char *get_v() { return v; }
168 // return rgba planes
169         unsigned char *get_r() { return y; }
170         unsigned char *get_g() { return u; }
171         unsigned char *get_b() { return v; }
172         unsigned char *get_a() { return a; }
173         void set_a(unsigned char *ap) { a = ap; }
174 // return yuv planes
175         static int get_scale_tables(int *column_table, int *row_table,
176                         int in_x1, int in_y1, int in_x2, int in_y2,
177                         int out_x1, int out_y1, int out_x2, int out_y2);
178         int get_bytes_per_pixel() { return bytes_per_pixel; }
179         long get_bytes_per_line();
180         int get_memory_type();
181
182
183
184         static int calculate_bytes_per_pixel(int colormodel);
185 // Get size + 4 for assembly language
186         static long calculate_data_size(int w, int h,
187                 int bytes_per_line = -1, int color_model = BC_RGB888);
188 // Get size of uncompressed frame buffer without extra 4 bytes
189         long get_data_size();
190
191         void rotate270();
192         void rotate90();
193         void flip_vert();
194         void flip_horiz();
195
196 // Convenience storage.
197 // Returns -1 if not set.
198         int get_field2_offset();
199         int set_field2_offset(int value);
200 // Set keyframe status
201         void set_keyframe(int value);
202         int get_keyframe();
203 // Overlay src onto this with blending and translation of input.
204 // Source and this must have alpha
205         void overlay(VFrame *src, int out_x1, int out_y1);
206
207 // If the opengl state is RAM, transfer image from RAM to the texture
208 // referenced by this frame.
209 // If the opengl state is TEXTURE, do nothing.
210 // If the opengl state is SCREEN, switch the current drawable to the pbuffer and
211 // transfer the image to the texture with screen_to_texture.
212 // The opengl state is changed to TEXTURE.
213 // If no textures exist, textures are created.
214 // If the textures already exist, they are reused.
215 // Textures are resized to match the current dimensions.
216 // Must be called from a synchronous opengl thread after enable_opengl.
217         void to_texture();
218
219 // Transfer from PBuffer to RAM.
220 //   used in Playback3D::overlay_sync, plugin Overlay::handle_opengl
221         void screen_to_ram();
222
223 // Transfer contents of current pbuffer to texture,
224 // creating a new texture if necessary.
225 // Coordinates are the coordinates in the drawable to copy.
226         void screen_to_texture(int x = -1, int y = -1, int w = -1, int h = -1);
227
228 // Transfer contents of texture to the current drawable.
229 // Just calls the vertex functions but doesn't initialize.
230 // The coordinates are relative to the VFrame size and flipped to make
231 // the texture upright.
232 // The default coordinates are the size of the VFrame.
233 // flip_y flips the texture in the vertical direction and only used when
234 // writing to the final surface.
235         void draw_texture(float in_x1, float in_y1, float in_x2, float in_y2,
236                 float out_x1, float out_y1, float out_x2, float out_y2,
237                 int flip_y = 0);
238 // Draw the texture using the frame's size as the input and output coordinates.
239         void draw_texture(int flip_y = 0);
240
241
242
243
244
245
246
247 // ================================ OpenGL functions ===========================
248 // Defined in vframe3d.C
249 // Location of working image if OpenGL playback
250         int get_opengl_state();
251         void set_opengl_state(int value);
252 // OpenGL states
253         enum
254         {
255 // Undefined
256                 UNKNOWN,
257 // OpenGL image is in RAM
258                 RAM,
259 // OpenGL image is in texture
260                 TEXTURE,
261 // OpenGL image is composited in PBuffer or back buffer
262                 SCREEN
263         };
264
265 // Texture ID
266         int get_texture_id();
267         void set_texture_id(int id);
268 // Get window ID the texture is bound to
269         int get_window_id();
270         int get_texture_w();
271         int get_texture_h();
272         int get_texture_components();
273
274
275 // Binds the opengl context to this frame's PBuffer
276         void enable_opengl();
277
278 // Clears the pbuffer with the right values depending on YUV
279         void clear_pbuffer();
280
281 // Get the pbuffer
282         BC_PBuffer* get_pbuffer();
283
284 // Bind the frame's texture to GL_TEXTURE_2D and enable it.
285 // If a texture_unit is supplied, the texture unit is made active
286 // and the commands are run in the right sequence to
287 // initialize it to our preferred specifications.
288         void bind_texture(int texture_unit = -1);
289
290
291
292 // Create a frustum with 0,0 in the upper left and w,-h in the bottom right.
293 // Set preferred opengl settings.
294         static void init_screen(int w, int h);
295 // Calls init_screen with the current frame's dimensions.
296         void init_screen();
297
298 // Compiles and links the shaders into a program.
299 // Adds the program with put_shader.
300 // Returns the program handle.
301 // Requires a null terminated argument list of shaders to link together.
302 // At least one shader argument must have a main() function.  make_shader
303 // replaces all the main() functions with unique functions and calls them in
304 // sequence, so multiple independant shaders can be linked.
305 // x is a placeholder for va_arg and should be 0.
306         static unsigned int make_shader(int x, ...);
307         static void dump_shader(int shader_id);
308
309 // Because OpenGL is faster if multiple effects are combined, we need
310 // to provide ways for effects to aggregate.
311 // The prev_effect is the object providing the data to read_frame.
312 // The next_effect is the object which called read_frame.
313 // Push and pop are only called from Cinelerra internals, so
314 // if an object calls read_frame with a temporary, the stack before and after
315 // the temporary is lost.
316         void push_prev_effect(const char *name);
317         void pop_prev_effect();
318         void push_next_effect(const char *name);
319         void pop_next_effect();
320 // These are called by plugins to determine aggregation.
321 // They access any member of the stack based on the number argument.
322 // next effect 0 is the one that called read_frame most recently.
323 // prev effect 0 is the one that filled our call to read_frame.
324         const char* get_next_effect(int number = 0);
325         const char* get_prev_effect(int number = 0);
326
327 // It isn't enough to know the name of the neighboring effects.
328 // Relevant configuration parameters must be passed on.
329         BC_Hash* get_params();
330
331 // get/set read status  -1/err, 0/noxfer, 1/ok
332         int get_status() { return status; }
333         void set_status(int v) { status = v; }
334
335 // Compare stacks and params from 2 images and return 1 if equal.
336         int equal_stacks(VFrame *src);
337
338 // Copy stacks and params from another frame
339 // Replaces the stacks with the src stacks but only updates the params.
340         void copy_stacks(VFrame *src);
341 // Updates the params with values from src
342         void copy_params(VFrame *src);
343
344 // This clears the stacks and the param table
345         void clear_stacks();
346
347         void draw_rect(int x1, int y1, int x2, int y2);
348         void draw_line(int x1, int y1, int x2, int y2);
349         void draw_pixel(int x, int y);
350         void draw_arrow(int x1, int y1, int x2, int y2);
351
352 // 3D scene graphs
353 // Not integrated with shmem because that only affects codecs
354         VFrameScene* get_scene();
355
356 // Debugging
357         void dump_stacks();
358         void dump();
359
360         void dump_params();
361
362 private:
363
364 // 3D scene graphs
365 // Not integrated with shmem because that only affects codecs
366         VFrameScene *scene;
367
368 // Create a PBuffer matching this frame's dimensions and to be
369 // referenced by this frame.  Does nothing if the pbuffer already exists.
370 // If the frame is resized, the PBuffer is deleted.
371 // Called by enable_opengl.
372 // This allows PBuffers, textures, and bitmaps to travel through the entire
373 // rendering chain without requiring the user to manage a lot of objects.
374 // Must be called from a synchronous opengl thread after enable_opengl.
375         void create_pbuffer();
376
377         int clear_objects(int do_opengl);
378         int reset_parameters(int do_opengl);
379         void create_row_pointers();
380         int allocate_data(unsigned char *data,
381                 int shmid,
382                 long y_offset,
383                 long u_offset,
384                 long v_offset,
385                 int w,
386                 int h,
387                 int color_model,
388                 long bytes_per_line);
389
390 // Convenience storage
391         int field2_offset;
392         int memory_type;
393         enum
394         {
395                 PRIVATE,
396                 SHARED,
397                 SHMGET
398         };
399
400 // Data pointer is pointing to someone else's buffer.
401 //      long shm_offset;
402 // ID of shared memory if using IPC.
403 // The 1st 1 after reboot is 0.
404         int shmid;
405 // Local setting for shm usage
406         int use_shm;
407 // If not set by user, is calculated from color_model
408         long bytes_per_line;
409         int bytes_per_pixel;
410 // Image data
411         unsigned char *data;
412 // Pointers to the start of each row
413         unsigned char **rows;
414 // One of the #defines
415         int color_model;
416 // Allocated space for compressed data
417         long compressed_allocated;
418 // Size of stored compressed image
419         long compressed_size;
420 // Pointers to yuv / rgb planes
421         unsigned char *y, *u, *v;
422         long y_offset;
423         long u_offset;
424         long v_offset;
425 // Pointer to alpha plane
426         unsigned char *a;
427 // Dimensions of frame
428         int w, h;
429 // Info for reading png images
430         const unsigned char *image;
431         long image_offset;
432         long image_size;
433 // For writing discontinuous frames in background rendering
434         long sequence_number;
435         double timestamp;
436 // read status of input frame -1/err, 0/noxfr, 1/ok
437         int status;
438 // OpenGL support
439         int is_keyframe;
440 // State of the current texture
441         BC_Texture *texture;
442 // State of the current PBuffer
443         BC_PBuffer *pbuffer;
444
445 // Location of working image if OpenGL playback
446         int opengl_state;
447
448         ArrayList<char*> prev_effects;
449         ArrayList<char*> next_effects;
450         BC_Hash *params;
451 };
452
453 // Create a frame with the png image
454 class VFramePng : public VFrame {
455 // Read a PNG into the frame with alpha
456         int read_png(const unsigned char *data, long image_size, double xscale, double yscale);
457 public:
458         VFramePng(unsigned char *png_data, double scale=0);
459         VFramePng(unsigned char *png_data, long image_size, double xs=0, double ys=0);
460         ~VFramePng();
461 };
462
463 #endif