Camera tracking integration
[blender.git] / source / blender / imbuf / intern / IMB_indexer.h
1 /**
2  * IMB_indexer.h
3  *
4  * $Id: IMB_indexer.h 
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  *
23  * Contributor(s): Peter Schlaile
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28
29 #ifndef IMB_INDEXER_H
30 #define IMB_INDEXER_H
31
32 #ifdef WIN32
33 #include <io.h>
34 #endif
35
36 #include <stdlib.h>
37 #include <stdio.h>
38 #include "BKE_utildefines.h"
39 #include "IMB_anim.h"
40
41 /*
42   seperate animation index files to solve the following problems:
43
44   a) different timecodes within one file (like DTS/PTS, Timecode-Track, 
45      "implicit" timecodes within DV-files and HDV-files etc.)
46   b) seeking difficulties within ffmpeg for files with timestamp holes
47   c) broken files that miss several frames / have varying framerates
48   d) use proxies accordingly
49
50   ... we need index files, that provide us with 
51   
52   the binary(!) position, where we have to seek into the file *and*
53   the continuous frame number (ignoring the holes) starting from the 
54   beginning of the file, so that we know, which proxy frame to serve.
55
56   This index has to be only built once for a file and is written into
57   the BL_proxy directory structure for later reuse in different blender files.
58
59 */
60
61 typedef struct anim_index_entry {
62         int frameno;
63         unsigned long long seek_pos;
64         unsigned long long seek_pos_dts;
65         unsigned long long pts;
66 } anim_index_entry;
67
68 struct anim_index {
69         char name[256];
70
71         int num_entries;
72         struct anim_index_entry * entries;
73 };
74
75 struct anim_index_builder;
76
77 typedef struct anim_index_builder {
78         FILE * fp;
79         char name[FILE_MAXDIR + FILE_MAXFILE];
80         char temp_name[FILE_MAXDIR + FILE_MAXFILE];
81
82         void * private_data;
83
84         void (*delete_priv_data)(struct anim_index_builder * idx);
85         void (*proc_frame)(struct anim_index_builder * idx, 
86                            unsigned char * buffer,
87                            int data_size, 
88                            struct anim_index_entry * entry);
89 } anim_index_builder;
90
91 anim_index_builder * IMB_index_builder_create(const char * name);
92 void IMB_index_builder_add_entry(anim_index_builder * fp, 
93                                  int frameno, unsigned long long seek_pos,
94                                  unsigned long long seek_pos_dts,
95                                  unsigned long long pts);
96
97 void IMB_index_builder_proc_frame(anim_index_builder * fp, 
98                                   unsigned char * buffer,
99                                   int data_size,
100                                   int frameno, unsigned long long seek_pos,
101                                   unsigned long long seek_pos_dts,
102                                   unsigned long long pts);
103
104 void IMB_index_builder_finish(anim_index_builder * fp, int rollback);
105
106 struct anim_index * IMB_indexer_open(const char * name);
107 unsigned long long IMB_indexer_get_seek_pos(
108         struct anim_index * idx, int frameno_index);
109 unsigned long long IMB_indexer_get_seek_pos_dts(
110         struct anim_index * idx, int frameno_index);
111
112 int IMB_indexer_get_frame_index(struct anim_index * idx, int frameno);
113 unsigned long long IMB_indexer_get_pts(struct anim_index * idx, 
114                                        int frame_index);
115 int IMB_indexer_get_duration(struct anim_index * idx);
116
117 int IMB_indexer_can_scan(struct anim_index * idx, 
118                          int old_frame_index, int new_frame_index);
119
120 void IMB_indexer_close(struct anim_index * idx);
121
122 void IMB_free_indices(struct anim * anim);
123
124 int IMB_anim_index_get_frame_index(
125         struct anim * anim, IMB_Timecode_Type tc, int position);
126
127 struct anim * IMB_anim_open_proxy(
128         struct anim * anim, IMB_Proxy_Size preview_size);
129 struct anim_index * IMB_anim_open_index(
130         struct anim * anim, IMB_Timecode_Type tc);
131
132 int IMB_proxy_size_to_array_index(IMB_Proxy_Size pr_size);
133 int IMB_timecode_to_array_index(IMB_Timecode_Type tc);
134
135 #endif