Removed superfluous NULL check
[blender.git] / source / blender / makesrna / intern / rna_movieclip.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation,
19  *                 Sergey Sharybin
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/makesrna/intern/rna_movieclip.c
25  *  \ingroup RNA
26  */
27
28 #include <stdlib.h>
29 #include <limits.h>
30
31 #include "MEM_guardedalloc.h"
32
33 #include "DNA_movieclip_types.h"
34 #include "DNA_scene_types.h"
35
36 #include "RNA_access.h"
37 #include "RNA_define.h"
38
39 #include "rna_internal.h"
40
41 #include "BKE_movieclip.h"
42 #include "BKE_tracking.h"
43
44 #include "WM_types.h"
45
46 #include "IMB_imbuf_types.h"
47 #include "IMB_imbuf.h"
48 #include "IMB_metadata.h"
49
50 #ifdef RNA_RUNTIME
51
52 #include "BKE_depsgraph.h"
53
54 #include "ED_clip.h"
55
56 #include "DNA_screen_types.h"
57 #include "DNA_space_types.h"
58
59 static void rna_MovieClip_reload_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
60 {
61         MovieClip *clip = (MovieClip *)ptr->id.data;
62
63         BKE_movieclip_reload(bmain, clip);
64         DAG_id_tag_update(&clip->id, 0);
65 }
66
67 static void rna_MovieClip_size_get(PointerRNA *ptr, int *values)
68 {
69         MovieClip *clip = (MovieClip *)ptr->id.data;
70
71         values[0] = clip->lastsize[0];
72         values[1] = clip->lastsize[1];
73 }
74
75 static float rna_MovieClip_fps_get(PointerRNA *ptr)
76 {
77         MovieClip *clip = (MovieClip *)ptr->id.data;
78         return BKE_movieclip_get_fps(clip);
79 }
80
81 static void rna_MovieClipUser_proxy_render_settings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
82 {
83         ID *id = (ID *) ptr->id.data;
84         MovieClipUser *user = (MovieClipUser *) ptr->data;
85
86         /* when changing render settings of space clip user
87          * clear cache for clip, so all the memory is available
88          * for new render settings
89          */
90         if (GS(id->name) == ID_SCR) {
91                 bScreen *screen = (bScreen *) id;
92                 ScrArea *area;
93                 SpaceLink *sl;
94
95                 for (area = screen->areabase.first; area; area = area->next) {
96                         for (sl = area->spacedata.first; sl; sl = sl->next) {
97                                 if (sl->spacetype == SPACE_CLIP) {
98                                         SpaceClip *sc = (SpaceClip *) sl;
99
100                                         if (&sc->user == user) {
101                                                 MovieClip *clip = ED_space_clip_get_clip(sc);
102
103                                                 if (clip && (clip->flag & MCLIP_USE_PROXY))
104                                                         BKE_movieclip_clear_cache(clip);
105
106                                                 break;
107                                         }
108                                 }
109                         }
110                 }
111         }
112 }
113
114 static PointerRNA rna_MovieClip_metadata_get(MovieClip *clip)
115 {
116         if (clip == NULL || clip->anim == NULL) {
117                 return PointerRNA_NULL;
118         }
119
120         IDProperty *metadata = IMB_anim_load_metadata(clip->anim);
121         if (metadata == NULL) {
122                 return PointerRNA_NULL;
123         }
124
125         PointerRNA ptr;
126         RNA_pointer_create(NULL, &RNA_IDPropertyWrapPtr, metadata, &ptr);
127         return ptr;
128 }
129
130 #else
131
132 static void rna_def_movieclip_proxy(BlenderRNA *brna)
133 {
134         StructRNA *srna;
135         PropertyRNA *prop;
136
137         static const EnumPropertyItem clip_tc_items[] = {
138                 {IMB_TC_NONE, "NONE", 0, "No TC in use", ""},
139                 {IMB_TC_RECORD_RUN, "RECORD_RUN", 0, "Record Run", "Use images in the order they are recorded"},
140                 {IMB_TC_FREE_RUN, "FREE_RUN", 0, "Free Run", "Use global timestamp written by recording device"},
141                 {IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN, "FREE_RUN_REC_DATE", 0, "Free Run (rec date)",
142                                                         "Interpolate a global timestamp using the record date and time "
143                                                         "written by recording device"},
144                 {IMB_TC_RECORD_RUN_NO_GAPS, "FREE_RUN_NO_GAPS", 0, "Free Run No Gaps",
145                                             "Record run, but ignore timecode, changes in framerate or dropouts"},
146                 {0, NULL, 0, NULL, NULL}
147         };
148
149         srna = RNA_def_struct(brna, "MovieClipProxy", NULL);
150         RNA_def_struct_ui_text(srna, "Movie Clip Proxy", "Proxy parameters for a movie clip");
151         RNA_def_struct_sdna(srna, "MovieClipProxy");
152
153         /* build proxy sized */
154         prop = RNA_def_property(srna, "build_25", PROP_BOOLEAN, PROP_NONE);
155         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_25);
156         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
157         RNA_def_property_ui_text(prop, "25%", "Build proxy resolution 25% of the original footage dimension");
158
159         prop = RNA_def_property(srna, "build_50", PROP_BOOLEAN, PROP_NONE);
160         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_50);
161         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
162         RNA_def_property_ui_text(prop, "50%", "Build proxy resolution 50% of the original footage dimension");
163
164         prop = RNA_def_property(srna, "build_75", PROP_BOOLEAN, PROP_NONE);
165         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_75);
166         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
167         RNA_def_property_ui_text(prop, "75%", "Build proxy resolution 75% of the original footage dimension");
168
169         prop = RNA_def_property(srna, "build_100", PROP_BOOLEAN, PROP_NONE);
170         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_100);
171         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
172         RNA_def_property_ui_text(prop, "100%", "Build proxy resolution 100% of the original footage dimension");
173
174         prop = RNA_def_property(srna, "build_undistorted_25", PROP_BOOLEAN, PROP_NONE);
175         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_25);
176         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
177         RNA_def_property_ui_text(prop, "25%", "Build proxy resolution 25% of the original undistorted footage dimension");
178
179         prop = RNA_def_property(srna, "build_undistorted_50", PROP_BOOLEAN, PROP_NONE);
180         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_50);
181         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
182         RNA_def_property_ui_text(prop, "50%", "Build proxy resolution 50% of the original undistorted footage dimension");
183
184         prop = RNA_def_property(srna, "build_undistorted_75", PROP_BOOLEAN, PROP_NONE);
185         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_75);
186         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
187         RNA_def_property_ui_text(prop, "75%", "Build proxy resolution 75% of the original undistorted footage dimension");
188
189         prop = RNA_def_property(srna, "build_undistorted_100", PROP_BOOLEAN, PROP_NONE);
190         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_100);
191         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
192         RNA_def_property_ui_text(prop, "100%",
193                                  "Build proxy resolution 100% of the original undistorted footage dimension");
194
195         /* build timecodes */
196         prop = RNA_def_property(srna, "build_record_run", PROP_BOOLEAN, PROP_NONE);
197         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_RECORD_RUN);
198         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
199         RNA_def_property_ui_text(prop, "Rec Run", "Build record run time code index");
200
201         prop = RNA_def_property(srna, "build_free_run", PROP_BOOLEAN, PROP_NONE);
202         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_FREE_RUN);
203         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
204         RNA_def_property_ui_text(prop, "Free Run", "Build free run time code index");
205
206         prop = RNA_def_property(srna, "build_free_run_rec_date", PROP_BOOLEAN, PROP_NONE);
207         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN);
208         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
209         RNA_def_property_ui_text(prop, "Free Run (Rec Date)", "Build free run time code index using Record Date/Time");
210
211         /* quality of proxied image */
212         prop = RNA_def_property(srna, "quality", PROP_INT, PROP_UNSIGNED);
213         RNA_def_property_int_sdna(prop, NULL, "quality");
214         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
215         RNA_def_property_ui_text(prop, "Quality", "JPEG quality of proxy images");
216         RNA_def_property_ui_range(prop, 1, 100, 1, -1);
217
218         prop = RNA_def_property(srna, "timecode", PROP_ENUM, PROP_NONE);
219         RNA_def_property_enum_sdna(prop, NULL, "tc");
220         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
221         RNA_def_property_enum_items(prop, clip_tc_items);
222         RNA_def_property_ui_text(prop, "Timecode", "");
223         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
224
225         /* directory */
226         prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
227         RNA_def_property_string_sdna(prop, NULL, "dir");
228         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
229         RNA_def_property_ui_text(prop, "Directory", "Location to store the proxy files");
230         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
231 }
232
233 static void rna_def_moviecliUser(BlenderRNA *brna)
234 {
235         StructRNA *srna;
236         PropertyRNA *prop;
237
238         static const EnumPropertyItem clip_render_size_items[] = {
239                 {MCLIP_PROXY_RENDER_SIZE_25, "PROXY_25", 0, "Proxy size 25%", ""},
240                 {MCLIP_PROXY_RENDER_SIZE_50, "PROXY_50", 0, "Proxy size 50%", ""},
241                 {MCLIP_PROXY_RENDER_SIZE_75, "PROXY_75", 0, "Proxy size 75%", ""},
242                 {MCLIP_PROXY_RENDER_SIZE_100, "PROXY_100", 0, "Proxy size 100%", ""},
243                 {MCLIP_PROXY_RENDER_SIZE_FULL, "FULL", 0, "No proxy, full render", ""},
244                 {0, NULL, 0, NULL, NULL}
245         };
246
247         srna = RNA_def_struct(brna, "MovieClipUser", NULL);
248         RNA_def_struct_ui_text(srna, "Movie Clip User",
249                                "Parameters defining how a MovieClip data-block is used by another data-block");
250
251         prop = RNA_def_property(srna, "frame_current", PROP_INT, PROP_TIME);
252         RNA_def_property_int_sdna(prop, NULL, "framenr");
253         RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
254         RNA_def_property_ui_text(prop, "Current Frame", "Current frame number in movie or image sequence");
255
256         /* render size */
257         prop = RNA_def_property(srna, "proxy_render_size", PROP_ENUM, PROP_NONE);
258         RNA_def_property_enum_sdna(prop, NULL, "render_size");
259         RNA_def_property_enum_items(prop, clip_render_size_items);
260         RNA_def_property_ui_text(prop, "Proxy render size",
261                                  "Draw preview using full resolution or different proxy resolutions");
262         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClipUser_proxy_render_settings_update");
263
264         /* render undistorted */
265         prop = RNA_def_property(srna, "use_render_undistorted", PROP_BOOLEAN, PROP_NONE);
266         RNA_def_property_boolean_sdna(prop, NULL, "render_flag", MCLIP_PROXY_RENDER_UNDISTORT);
267         RNA_def_property_ui_text(prop, "Render Undistorted", "Render preview using undistorted proxy");
268         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClipUser_proxy_render_settings_update");
269 }
270
271 static void rna_def_movieClipScopes(BlenderRNA *brna)
272 {
273         StructRNA *srna;
274
275         srna = RNA_def_struct(brna, "MovieClipScopes", NULL);
276         RNA_def_struct_ui_text(srna, "MovieClipScopes", "Scopes for statistical view of a movie clip");
277 }
278
279
280 static void rna_def_movieclip(BlenderRNA *brna)
281 {
282         StructRNA *srna;
283         PropertyRNA *prop;
284         FunctionRNA *func;
285         PropertyRNA *parm;
286
287         static const EnumPropertyItem clip_source_items[] = {
288                 {MCLIP_SRC_SEQUENCE, "SEQUENCE", 0, "Image Sequence", "Multiple image files, as a sequence"},
289                 {MCLIP_SRC_MOVIE, "MOVIE", 0, "Movie File", "Movie file"},
290                 {0, NULL, 0, NULL, NULL}
291         };
292
293         srna = RNA_def_struct(brna, "MovieClip", "ID");
294         RNA_def_struct_ui_text(srna, "MovieClip", "MovieClip data-block referencing an external movie file");
295         RNA_def_struct_ui_icon(srna, ICON_SEQUENCE);
296
297         prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
298         RNA_def_property_string_sdna(prop, NULL, "name");
299         RNA_def_property_ui_text(prop, "File Path", "Filename of the movie or sequence file");
300         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
301
302         prop = RNA_def_property(srna, "tracking", PROP_POINTER, PROP_NONE);
303         RNA_def_property_struct_type(prop, "MovieTracking");
304
305         prop = RNA_def_property(srna, "proxy", PROP_POINTER, PROP_NONE);
306         RNA_def_property_struct_type(prop, "MovieClipProxy");
307
308         /* use proxy */
309         prop = RNA_def_property(srna, "use_proxy", PROP_BOOLEAN, PROP_NONE);
310         RNA_def_property_boolean_sdna(prop, NULL, "flag", MCLIP_USE_PROXY);
311         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
312         RNA_def_property_ui_text(prop, "Use Proxy / Timecode",
313                                  "Use a preview proxy and/or timecode index for this clip");
314         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL);
315
316         prop = RNA_def_int_vector(srna, "size", 2, NULL, 0, 0, "Size",
317                                   "Width and height in pixels, zero when image data cant be loaded", 0, 0);
318         RNA_def_property_int_funcs(prop, "rna_MovieClip_size_get", NULL, NULL);
319         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
320
321         prop = RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
322         RNA_def_property_float_sdna(prop, NULL, "aspx");
323         RNA_def_property_array(prop, 2);
324         RNA_def_property_range(prop, 0.1f, FLT_MAX);
325         RNA_def_property_ui_range(prop, 0.1f, 5000.0f, 1, 2);
326         RNA_def_property_ui_text(prop, "Display Aspect", "Display Aspect for this clip, does not affect rendering");
327         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL);
328
329         /* source */
330         prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
331         RNA_def_property_enum_items(prop, clip_source_items);
332         RNA_def_property_ui_text(prop, "Source", "Where the clip comes from");
333         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
334
335         /* custom proxy directory */
336         prop = RNA_def_property(srna, "use_proxy_custom_directory", PROP_BOOLEAN, PROP_NONE);
337         RNA_def_property_boolean_sdna(prop, NULL, "flag", MCLIP_USE_PROXY_CUSTOM_DIR);
338         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
339         RNA_def_property_ui_text(prop, "Proxy Custom Directory",
340                                  "Create proxy images in a custom directory (default is movie location)");
341         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
342
343         /* grease pencil */
344         prop = RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
345         RNA_def_property_pointer_sdna(prop, NULL, "gpd");
346         RNA_def_property_struct_type(prop, "GreasePencil");
347         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
348         RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this movie clip");
349         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL);
350
351         /* start_frame */
352         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
353         RNA_def_property_int_sdna(prop, NULL, "start_frame");
354         RNA_def_property_ui_text(prop, "Start Frame", "Global scene frame number at which this movie starts playing "
355                                  "(affects all data associated with a clip)");
356         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
357
358         /* frame_offset */
359         prop = RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
360         RNA_def_property_int_sdna(prop, NULL, "frame_offset");
361         RNA_def_property_ui_text(prop, "Frame Offset", "Offset of footage first frame relative to it's file name "
362                                  "(affects only how footage is loading, does not change data associated with a clip)");
363         RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, "rna_MovieClip_reload_update");
364
365         /* length */
366         prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
367         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
368         RNA_def_property_int_sdna(prop, NULL, "len");
369         RNA_def_property_ui_text(prop, "Duration", "Detected duration of movie clip in frames");
370
371         /* FPS */
372         prop = RNA_def_property(srna, "fps", PROP_FLOAT, PROP_NONE);
373         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
374         RNA_def_property_float_funcs(prop, "rna_MovieClip_fps_get", NULL, NULL);
375         RNA_def_property_ui_text(prop, "Frame Rate", "Detected frame rate of the movie clip in frames per second");
376
377         /* color management */
378         prop = RNA_def_property(srna, "colorspace_settings", PROP_POINTER, PROP_NONE);
379         RNA_def_property_pointer_sdna(prop, NULL, "colorspace_settings");
380         RNA_def_property_struct_type(prop, "ColorManagedInputColorspaceSettings");
381         RNA_def_property_ui_text(prop, "Color Space Settings", "Input color space settings");
382
383         /* metadata */
384         func = RNA_def_function(srna, "metadata", "rna_MovieClip_metadata_get");
385         RNA_def_function_ui_description(func, "Retrieve metadata of the movie file");
386         /* return type */
387         parm = RNA_def_pointer(func, "metadata", "IDPropertyWrapPtr", "", "Dict-like object containing the metadata");
388         RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
389         RNA_def_function_return(func, parm);
390
391         rna_def_animdata_common(srna);
392 }
393
394 void RNA_def_movieclip(BlenderRNA *brna)
395 {
396         rna_def_movieclip(brna);
397         rna_def_movieclip_proxy(brna);
398         rna_def_moviecliUser(brna);
399         rna_def_movieClipScopes(brna);
400 }
401
402 #endif