1 | /* |
2 | Copyright (c) 2012, Broadcom Europe Ltd |
3 | All rights reserved. |
4 | |
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the following conditions are met: |
7 | * Redistributions of source code must retain the above copyright |
8 | notice, this list of conditions and the following disclaimer. |
9 | * Redistributions in binary form must reproduce the above copyright |
10 | notice, this list of conditions and the following disclaimer in the |
11 | documentation and/or other materials provided with the distribution. |
12 | * Neither the name of the copyright holder nor the |
13 | names of its contributors may be used to endorse or promote products |
14 | derived from this software without specific prior written permission. |
15 | |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ |
27 | #ifndef VC_CONTAINERS_IO_H |
28 | #define VC_CONTAINERS_IO_H |
29 | |
30 | /** \file containers_io.h |
31 | * Interface definition for the input / output abstraction layer used by container |
32 | * readers and writers */ |
33 | #include "containers/containers.h" |
34 | |
35 | #ifdef __cplusplus |
36 | extern "C" { |
37 | #endif |
38 | |
39 | /** \defgroup VcContainerIoApi Container I/O API */ |
40 | /* @{ */ |
41 | |
42 | /** Container io opening mode. |
43 | * This is used to specify whether a reader or writer is requested. |
44 | */ |
45 | typedef enum { |
46 | VC_CONTAINER_IO_MODE_READ = 0, /**< Container io opened in reading mode */ |
47 | VC_CONTAINER_IO_MODE_WRITE = 1 /**< Container io opened in writing mode */ |
48 | } VC_CONTAINER_IO_MODE_T; |
49 | |
50 | /** \name Container I/O Capabilities |
51 | * The following flags are exported by container i/o modules to describe their capabilities */ |
52 | /* @{ */ |
53 | /** Type definition for container I/O capabilities */ |
54 | typedef uint32_t VC_CONTAINER_IO_CAPABILITIES_T; |
55 | /** Seeking is not supported */ |
56 | #define VC_CONTAINER_IO_CAPS_CANT_SEEK 0x1 |
57 | /** Seeking is slow and should be avoided */ |
58 | #define VC_CONTAINER_IO_CAPS_SEEK_SLOW 0x2 |
59 | /** The I/O doesn't provide any caching of the data */ |
60 | #define VC_CONTAINER_IO_CAPS_NO_CACHING 0x4 |
61 | /* @} */ |
62 | |
63 | /** Container Input / Output Context. |
64 | * This structure defines the context for a container io instance */ |
65 | struct VC_CONTAINER_IO_T |
66 | { |
67 | /** Pointer to information private to the container io instance */ |
68 | struct VC_CONTAINER_IO_PRIVATE_T *priv; |
69 | |
70 | /** Pointer to information private to the container io module */ |
71 | struct VC_CONTAINER_IO_MODULE_T *module; |
72 | |
73 | /** Uniform Resource Identifier for the stream to open. |
74 | * This is a string encoded in UTF-8 which follows the syntax defined in |
75 | * RFC2396 (http://tools.ietf.org/html/rfc2396). */ |
76 | char *uri; |
77 | |
78 | /** Pre-parsed URI */ |
79 | struct VC_URI_PARTS_T *uri_parts; |
80 | |
81 | /** Current offset into the i/o stream */ |
82 | int64_t offset; |
83 | |
84 | /** Current size of the i/o stream (0 if unknown). This size might grow during the |
85 | * lifetime of the i/o instance (for instance when doing progressive download). */ |
86 | int64_t size; |
87 | |
88 | /** Capabilities of the i/o stream */ |
89 | VC_CONTAINER_IO_CAPABILITIES_T capabilities; |
90 | |
91 | /** Status of the i/o stream */ |
92 | VC_CONTAINER_STATUS_T status; |
93 | |
94 | /** Maximum size allowed for this i/o stream (0 if unknown). This is used during writing |
95 | * to limit the size of the stream to below this value. */ |
96 | int64_t max_size; |
97 | |
98 | /** \note the following list of function pointers should not be used directly. |
99 | * They defines the interface for implementing container io modules and are filled in |
100 | * by the container modules themselves. */ |
101 | |
102 | /** \private |
103 | * Function pointer to close and free all resources allocated by a |
104 | * container io module */ |
105 | VC_CONTAINER_STATUS_T (*pf_close)(struct VC_CONTAINER_IO_T *io); |
106 | |
107 | /** \private |
108 | * Function pointer to read or skip data from container io module */ |
109 | size_t (*pf_read)(struct VC_CONTAINER_IO_T *io, void *buffer, size_t size); |
110 | |
111 | /** \private |
112 | * Function pointer to write data to a container io module */ |
113 | size_t (*pf_write)(struct VC_CONTAINER_IO_T *io, const void *buffer, size_t size); |
114 | |
115 | /** \private |
116 | * Function pointer to seek into a container io module */ |
117 | VC_CONTAINER_STATUS_T (*pf_seek)(struct VC_CONTAINER_IO_T *io, int64_t offset); |
118 | |
119 | /** \private |
120 | * Function pointer to perform a control operation on a container io module */ |
121 | VC_CONTAINER_STATUS_T (*pf_control)(struct VC_CONTAINER_IO_T *io, |
122 | VC_CONTAINER_CONTROL_T operation, va_list args); |
123 | |
124 | }; |
125 | |
126 | /** Opens an i/o stream pointed to by a URI. |
127 | * This will create an instance of the container i/o module. |
128 | * |
129 | * \param uri Uniform Resource Identifier pointing to the multimedia container |
130 | * \param mode Mode in which the i/o stream will be opened |
131 | * \param status Returns the status of the operation |
132 | * \return If successful, this returns a pointer to the new instance |
133 | * of the i/o module. Returns NULL on failure. |
134 | */ |
135 | VC_CONTAINER_IO_T *vc_container_io_open( const char *uri, VC_CONTAINER_IO_MODE_T mode, |
136 | VC_CONTAINER_STATUS_T *status ); |
137 | |
138 | /** Creates an empty i/o stream. The i/o function pointers will have to be set |
139 | * by the caller before the i/o gets used. |
140 | * This will create an instance of the container i/o module. |
141 | * |
142 | * \param uri Uniform Resource Identifier pointing to the multimedia container |
143 | * \param mode Mode in which the i/o stream will be opened |
144 | * \param capabilities Flags indicating the capabilities of the i/o |
145 | * \param status Returns the status of the operation |
146 | * \return If successful, this returns a pointer to the new instance |
147 | * of the i/o module. Returns NULL on failure. |
148 | */ |
149 | VC_CONTAINER_IO_T *vc_container_io_create( const char *uri, VC_CONTAINER_IO_MODE_T mode, |
150 | VC_CONTAINER_IO_CAPABILITIES_T capabilities, |
151 | VC_CONTAINER_STATUS_T *p_status ); |
152 | |
153 | /** Closes an instance of a container i/o module. |
154 | * \param context Pointer to the VC_CONTAINER_IO_T context of the instance to close |
155 | * \return VC_CONTAINER_SUCCESS on success. |
156 | */ |
157 | VC_CONTAINER_STATUS_T vc_container_io_close( VC_CONTAINER_IO_T *context ); |
158 | |
159 | /** Read data from an i/o stream without advancing the read position within the stream. |
160 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
161 | * \param buffer Pointer to the buffer where the data will be read |
162 | * \param size Number of bytes to read |
163 | * \return The size of the data actually read. |
164 | */ |
165 | size_t vc_container_io_peek(VC_CONTAINER_IO_T *context, void *buffer, size_t size); |
166 | |
167 | /** Read data from an i/o stream. |
168 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
169 | * \param buffer Pointer to the buffer where the data will be read |
170 | * \param size Number of bytes to read |
171 | * \return The size of the data actually read. |
172 | */ |
173 | size_t vc_container_io_read(VC_CONTAINER_IO_T *context, void *buffer, size_t size); |
174 | |
175 | /** Skip data in an i/o stream without reading it. |
176 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
177 | * \param size Number of bytes to skip |
178 | * \return The size of the data actually skipped. |
179 | */ |
180 | size_t vc_container_io_skip(VC_CONTAINER_IO_T *context, size_t size); |
181 | |
182 | /** Write data to an i/o stream. |
183 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
184 | * \param buffer Pointer to the buffer containing the data to write |
185 | * \param size Number of bytes to write |
186 | * \return The size of the data actually written. |
187 | */ |
188 | size_t vc_container_io_write(VC_CONTAINER_IO_T *context, const void *buffer, size_t size); |
189 | |
190 | /** Seek into an i/o stream. |
191 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
192 | * \param offset Absolute file offset to seek to |
193 | * \return Status of the operation |
194 | */ |
195 | VC_CONTAINER_STATUS_T vc_container_io_seek(VC_CONTAINER_IO_T *context, int64_t offset); |
196 | |
197 | /** Perform control operation on an i/o stream (va_list). |
198 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
199 | * \param operation Control operation to be performed |
200 | * \param args Additional arguments for the operation |
201 | * \return Status of the operation |
202 | */ |
203 | VC_CONTAINER_STATUS_T vc_container_io_control_list(VC_CONTAINER_IO_T *context, |
204 | VC_CONTAINER_CONTROL_T operation, va_list args); |
205 | |
206 | /** Perform control operation on an i/o stream (varargs). |
207 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
208 | * \param operation Control operation to be performed |
209 | * \param ... Additional arguments for the operation |
210 | * \return Status of the operation |
211 | */ |
212 | VC_CONTAINER_STATUS_T vc_container_io_control(VC_CONTAINER_IO_T *context, |
213 | VC_CONTAINER_CONTROL_T operation, ...); |
214 | |
215 | /** Cache the pointed region of the i/o stream (from current position). |
216 | * This will allow future seeking into the specified region even on non-seekable streams. |
217 | * \param context Pointer to the VC_CONTAINER_IO_T instance to use |
218 | * \param size Size of the region to cache |
219 | * \return Status of the operation |
220 | */ |
221 | size_t vc_container_io_cache(VC_CONTAINER_IO_T *context, size_t size); |
222 | |
223 | /* @} */ |
224 | |
225 | #ifdef __cplusplus |
226 | } |
227 | #endif |
228 | |
229 | #endif /* VC_CONTAINERS_HELPERS_H */ |
230 | |