dc16b4d7e36611001f863eef2a83a89ebb250ebd
[blender.git] / source / blender / imbuf / intern / IMB_indexer.h
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  *
19  * Contributor(s): Peter Schlaile
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24
25 #ifndef __IMB_INDEXER_H__
26 #define __IMB_INDEXER_H__
27
28 #ifdef WIN32
29 #  include <io.h>
30 #endif
31
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include "BKE_utildefines.h"
35 #include "IMB_anim.h"
36 /*
37  * separate animation index files to solve the following problems:
38  *
39  * a) different timecodes within one file (like DTS/PTS, Timecode-Track,
40  *    "implicit" timecodes within DV-files and HDV-files etc.)
41  * b) seeking difficulties within ffmpeg for files with timestamp holes
42  * c) broken files that miss several frames / have varying framerates
43  * d) use proxies accordingly
44  *
45  * ... we need index files, that provide us with
46  *
47  * the binary(!) position, where we have to seek into the file *and*
48  * the continuous frame number (ignoring the holes) starting from the
49  * beginning of the file, so that we know, which proxy frame to serve.
50  *
51  * This index has to be only built once for a file and is written into
52  * the BL_proxy directory structure for later reuse in different blender files.
53  */
54
55 typedef struct anim_index_entry {
56         int frameno;
57         unsigned long long seek_pos;
58         unsigned long long seek_pos_dts;
59         unsigned long long pts;
60 } anim_index_entry;
61
62 struct anim_index {
63         char name[1024];
64
65         int num_entries;
66         struct anim_index_entry * entries;
67 };
68
69 struct anim_index_builder;
70
71 typedef struct anim_index_builder {
72         FILE * fp;
73         char name[FILE_MAX];
74         char temp_name[FILE_MAX];
75
76         void * private_data;
77
78         void (*delete_priv_data)(struct anim_index_builder * idx);
79         void (*proc_frame)(struct anim_index_builder * idx,
80                            unsigned char * buffer,
81                            int data_size,
82                            struct anim_index_entry * entry);
83 } anim_index_builder;
84
85 anim_index_builder * IMB_index_builder_create(const char * name);
86 void IMB_index_builder_add_entry(
87         anim_index_builder * fp,
88         int frameno, unsigned long long seek_pos,
89         unsigned long long seek_pos_dts,
90         unsigned long long pts);
91
92 void IMB_index_builder_proc_frame(
93         anim_index_builder * fp,
94         unsigned char * buffer,
95         int data_size,
96         int frameno, unsigned long long seek_pos,
97         unsigned long long seek_pos_dts,
98         unsigned long long pts);
99
100 void IMB_index_builder_finish(anim_index_builder * fp, int rollback);
101
102 struct anim_index * IMB_indexer_open(const char * name);
103 unsigned long long IMB_indexer_get_seek_pos(
104         struct anim_index * idx, int frameno_index);
105 unsigned long long IMB_indexer_get_seek_pos_dts(
106         struct anim_index * idx, int frameno_index);
107
108 int IMB_indexer_get_frame_index(struct anim_index * idx, int frameno);
109 unsigned long long IMB_indexer_get_pts(struct anim_index * idx, 
110                                        int frame_index);
111 int IMB_indexer_get_duration(struct anim_index * idx);
112
113 int IMB_indexer_can_scan(struct anim_index * idx, 
114                          int old_frame_index, int new_frame_index);
115
116 void IMB_indexer_close(struct anim_index * idx);
117
118 void IMB_free_indices(struct anim * anim);
119
120 int IMB_anim_index_get_frame_index(
121         struct anim * anim, IMB_Timecode_Type tc, int position);
122
123 struct anim * IMB_anim_open_proxy(
124         struct anim * anim, IMB_Proxy_Size preview_size);
125 struct anim_index * IMB_anim_open_index(
126         struct anim * anim, IMB_Timecode_Type tc);
127
128 int IMB_proxy_size_to_array_index(IMB_Proxy_Size pr_size);
129 int IMB_timecode_to_array_index(IMB_Timecode_Type tc);
130
131 #endif