2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef __TIZEN_MULTIMEDIA_MEDIADEMUXER_H__
18 #define __TIZEN_MULTIMEDIA_MEDIADEMUXER_H__
22 #include <media_format.h>
23 #include <media_packet.h>
27 #endif /* __cplusplus */
30 * @file mediademuxer.h
31 * @brief This file contains the capi media demuxer API.
35 * @addtogroup CAPI_MEDIADEMUXER_MODULE
40 * @brief Media Demuxer handle type.
43 typedef struct mediademuxer_s *mediademuxer_h;
46 * @brief Enumeration for media demuxer state.
50 MEDIADEMUXER_STATE_NONE, /**< The mediademuxer is not created */
51 MEDIADEMUXER_STATE_IDLE, /**< The mediademuxer is created, but not prepared */
52 MEDIADEMUXER_STATE_READY, /**< The mediademuxer is ready to demux media */
53 MEDIADEMUXER_STATE_DEMUXING /**< The mediademuxer is demuxing media */
57 * @brief Enumeration for media demuxer error.
61 MEDIADEMUXER_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */
62 MEDIADEMUXER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
63 MEDIADEMUXER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
64 MEDIADEMUXER_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */
65 MEDIADEMUXER_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */
66 MEDIADEMUXER_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */
67 MEDIADEMUXER_ERROR_INVALID_STATE = TIZEN_ERROR_MEDIA_DEMUXER | 0x01, /**< Invalid state */
68 MEDIADEMUXER_ERROR_INVALID_PATH = TIZEN_ERROR_MEDIA_DEMUXER | 0x02, /**< Invalid path */
69 MEDIADEMUXER_ERROR_RESOURCE_LIMIT = TIZEN_ERROR_MEDIA_DEMUXER | 0x03, /**< Resource limit */
70 MEDIADEMUXER_ERROR_SEEK_FAILED = TIZEN_ERROR_MEDIA_DEMUXER | 0x04, /**< Seek operation failure */
71 MEDIADEMUXER_ERROR_DRM_NOT_PERMITTED = TIZEN_ERROR_MEDIA_DEMUXER | 0x05 /**< Not permitted format */
72 } mediademuxer_error_e;
75 * @brief Called when error occurs in media demuxer.
76 * @details Following error codes can be delivered.
77 * #MEDIADEMUXER_ERROR_INVALID_OPERATION,
78 * #MEDIADEMUXER_ERROR_NOT_SUPPORTED,
79 * #MEDIADEMUXER_ERROR_INVALID_PATH,
80 * #MEDIADEMUXER_ERROR_RESOURCE_LIMIT,
81 * #MEDIADEMUXER_ERROR_SEEK_FAILED,
82 * #MEDIADEMUXER_ERROR_DRM_NOT_PERMITTED
84 * @param[in] error The error that occurred in media demuxer
85 * @param[in] user_data The user data passed from the code where
86 * mediademuxer_set_error_cb() was invoked
87 * This data will be accessible from mediademuxer_error_cb()
88 * @pre Create media demuxer handle by calling mediademuxer_create() function.
89 * @see mediademuxer_set_error_cb()
90 * @see mediademuxer_unset_error_cb()
92 typedef void (*mediademuxer_error_cb) (mediademuxer_error_e error, void *user_data);
95 * @brief Called when end of stream occurs in media demuxer.
97 * @param[in] track_num The track_num which indicate eos for which track number occured
98 * @param[in] user_data The user data passed from the code where
99 * mediademuxer_set_eos_cb() was invoked
100 * This data will be accessible from mediademuxer_eos_cb()
101 * @pre Create media demuxer handle by calling mediademuxer_create() function.
102 * @see mediademuxer_set_eos_cb()
103 * @see mediademuxer_unset_eos_cb()
105 typedef void (*mediademuxer_eos_cb) (int track_num, void *user_data);
108 * @brief Creates a media demuxer handle for demuxing.
110 * @remarks You must release @a demuxer using mediademuxer_destroy() function.
111 * @param[out] demuxer A new handle to media demuxer
112 * @return @c 0 on success, otherwise a negative error value
113 * @retval #MEDIADEMUXER_ERROR_NONE Successful
114 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
115 * @retval #MEDIADEMUXER_ERROR_OUT_OF_MEMORY Out of memory
116 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
117 * @post The media demuxer state will be #MEDIADEMUXER_STATE_IDLE.
118 * @see mediademuxer_destroy()
120 int mediademuxer_create(mediademuxer_h *demuxer);
123 * @brief Sets the source path of input stream.
125 * @remarks The mediastorage privilege(http://tizen.org/privilege/mediastorage) should be added if any video/audio files are used to play located in the internal storage.
126 * @remarks The externalstorage privilege(http://tizen.org/privilege/externalstorage) should be added if any video/audio files are used to play located in the external storage.
127 * @remarks You must release @a demuxer using mediademuxer_destroy() function.
128 * @param[in] demuxer The media demuxer handle
129 * @param[in] path The content location, such as the file path
130 * @return @c 0 on success, otherwise a negative error value
131 * @retval #MEDIADEMUXER_ERROR_NONE Successful
132 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
133 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
134 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
135 * @retval #MEDIADEMUXER_ERROR_INVALID_PATH Invalid path
136 * @pre The media muxer state will be #MEDIADEMUXER_STATE_IDLE by calling mediademuxer_create() function.
138 int mediademuxer_set_data_source(mediademuxer_h demuxer, const char *path);
141 * @brief Prepares the media demuxer for demuxing.
143 * @remarks User should call this before mediademuxer_start() function.
144 * @param[in] demuxer The media demuxer handle
145 * @return @c 0 on success, otherwise a negative error value
146 * @retval #MEDIADEMUXER_ERROR_NONE Successful
147 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
148 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
149 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
150 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_IDLE.
151 * @pre mediademuxer_set_error_cb should be called before mediademuxer_prepare().
152 * @post The media demuxer state will be #MEDIADEMUXER_STATE_READY.
153 * @see mediademuxer_set_data_source()
154 * @see mediademuxer_unprepare()
156 int mediademuxer_prepare(mediademuxer_h demuxer);
159 * @brief Gets the total track count present in the container stream.
161 * @param[in] demuxer The media demuxer handle
162 * @param[out] count The number of tracks present
163 * @return @c 0 on success, otherwise a negative error value
164 * @retval #MEDIADEMUXER_ERROR_NONE Successful
165 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
166 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
167 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
168 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_READY.
169 * @see mediademuxer_prepare()
170 * @see mediademuxer_select_track()
172 int mediademuxer_get_track_count(mediademuxer_h demuxer, int *count);
175 * @brief Selects the track to be performed.
177 * @param[in] demuxer The media demuxer handle
178 * @param[in] track_index The track index on which is selected for read
179 * @return @c 0 on success, otherwise a negative error value
180 * @retval #MEDIADEMUXER_ERROR_NONE Successful
181 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
182 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
183 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
184 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_READY.
185 * @see mediademuxer_get_track_count()
186 * @see mediademuxer_start()
188 int mediademuxer_select_track(mediademuxer_h demuxer, int track_index);
191 * @brief Starts the media demuxer.
193 * @remarks User should call this before mediademuxer_read_sample() function.
194 * @param[in] demuxer The media demuxer handle
195 * @return @c 0 on success, otherwise a negative error value
196 * @retval #MEDIADEMUXER_ERROR_NONE Successful
197 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
198 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
199 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
200 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_READY.
201 * @post The media demuxer state will be #MEDIADEMUXER_STATE_DEMUXING.
202 * @see mediademuxer_prepare()
203 * @see mediademuxer_get_track_count()
204 * @see mediademuxer_select_track()
205 * @see mediademuxer_get_track_info()
207 int mediademuxer_start(mediademuxer_h demuxer);
210 * @brief Retrieves the track format of the read sample.
212 * @remarks The @a format should be released using media_format_unref() function.
213 * @param[in] demuxer The media demuxer handle
214 * @param[in] track_index The index of the track
215 * @param[out] format The media format handle
216 * @return @c 0 on success, otherwise a negative error value
217 * @retval #MEDIADEMUXER_ERROR_NONE Successful
218 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
219 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
220 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
221 * @pre The media demuxer state must be set to #MEDIADEMUXER_STATE_DEMUXING by calling
222 * mediademuxer_start() or set to #MEDIADEMUXER_STATE_READY by calling mediademuxer_prepare().
223 * @see mediademuxer_get_track_count()
224 * @see mediademuxer_select_track()
225 * @see media_format_unref()
226 * @see #media_format_h
228 int mediademuxer_get_track_info(mediademuxer_h demuxer, int track_index, media_format_h *format);
231 * @brief Reads a frame(sample) of one single track.
233 * @remarks The @a outbuf should be released using media_packet_destroy() function.
234 * @remarks Once this function is called, user app can call the mediatool APIs to extract
235 * side information such as pts, size, duration, flags etc.
236 * @param[in] demuxer The media demuxer handle
237 * @param[in] track_index The index of track of which data is needed
238 * @param[out] outbuf The media packet handle
239 * @return @c 0 on success, otherwise a negative error value
240 * @retval #MEDIADEMUXER_ERROR_NONE Successful
241 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
242 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
243 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
244 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_DEMUXING.
245 * @see mediademuxer_start()
246 * @see mediademuxer_get_track_info()
247 * @see mediademuxer_seek() if need to seek to a particular location
248 * @see mediademuxer_unselect_track()
249 * @see mediademuxer_stop()
250 * @see media_packet_destroy()
251 * @see #media_packet_h
253 int mediademuxer_read_sample(mediademuxer_h demuxer, int track_index, media_packet_h *outbuf);
256 * @brief Seeks to a particular instance of time (in milli seconds).
258 * @remarks If mediademuxer_seek() is followed by mediademuxer_read_sample(), outbuf will be the key frame right before the seek position.
259 * @param[in] demuxer The media demuxer handle
260 * @param[in] pos The value of the new start position
261 * @return @c 0 on success, otherwise a negative error value
262 * @retval #MEDIADEMUXER_ERROR_NONE Successful
263 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
264 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
265 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
266 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_DEMUXING.
267 * @see mediademuxer_read_sample()
268 * @see mediademuxer_stop()
270 int mediademuxer_seek(mediademuxer_h demuxer, int64_t pos);
273 * @brief Unselects the selected track.
275 * @param[in] demuxer The media demuxer handle
276 * @param[in] track_index The track index to be unselected
277 * @return @c 0 on success, otherwise a negative error value
278 * @retval #MEDIADEMUXER_ERROR_NONE Successful
279 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
280 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
281 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
282 * @pre The media demuxer state must be set to #MEDIADEMUXER_STATE_DEMUXING by calling
283 * mediademuxer_read_sample() or set to #MEDIADEMUXER_STATE_READY by calling mediademuxer_select_track().
284 * @see mediademuxer_select_track()
285 * @see mediademuxer_read_sample()
287 int mediademuxer_unselect_track(mediademuxer_h demuxer, int track_index);
290 * @brief Stops the media demuxer.
292 * @remarks User can call this if need to stop demuxing if needed.
293 * @param[in] demuxer The media demuxer handle
294 * @return @c 0 on success, otherwise a negative error value
295 * @retval #MEDIADEMUXER_ERROR_NONE Successful
296 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
297 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
298 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
299 * @pre The media demuxer state must be set to #MEDIADEMUXER_STATE_DEMUXING.
300 * @post The media demuxer state will be in #MEDIADEMUXER_STATE_READY.
301 * @see mediademuxer_start()
302 * @see mediademuxer_unprepare()
304 int mediademuxer_stop(mediademuxer_h demuxer);
307 * @brief Resets the media demuxer.
309 * @remarks User should call this before mediademuxer_destroy() function.
310 * @param[in] demuxer The media demuxer handle
311 * @return @c 0 on success, otherwise a negative error value
312 * @retval #MEDIADEMUXER_ERROR_NONE Successful
313 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
314 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
315 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
316 * @pre The media demuxer state should be #MEDIADEMUXER_STATE_READY.
317 * @post The media demuxer state will be #MEDIADEMUXER_STATE_IDLE.
318 * @see mediademuxer_prepare()
320 int mediademuxer_unprepare(mediademuxer_h demuxer);
323 * @brief Removes the instance of media demuxer and clear all its context memory.
325 * @param[in] demuxer The media demuxer handle
326 * @return @c 0 on success, otherwise a negative error value
327 * @retval #MEDIADEMUXER_ERROR_NONE Successful
328 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
329 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
330 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid Operation
331 * @pre Create a media demuxer handle by calling mediademuxer_create() function.
332 * @post The media demuxer state will be #MEDIADEMUXER_STATE_NONE.
333 * @see mediademuxer_create()
335 int mediademuxer_destroy(mediademuxer_h demuxer);
338 * @brief Gets media demuxer state.
340 * @param[in] demuxer The media demuxer handle
341 * @param[out] state The media demuxer sate
342 * @return @c 0 on success, otherwise a negative error value
343 * @retval #MEDIADEMUXER_ERROR_NONE Successful
344 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
345 * @retval #MEDIADEMUXER_ERROR_INVALID_OPERATION Invalid operation
346 * @pre Create a media demuxer handle by calling mediademuxer_create() function.
347 * @see #mediademuxer_state
349 int mediademuxer_get_state(mediademuxer_h demuxer, mediademuxer_state *state);
352 * @brief Sets an error callback function to be invoked when an error occurs.
354 * @param[in] demuxer The media demuxer handle
355 * @param[in] callback Callback function pointer
356 * @param[in] user_data The user data passed from the code where
357 * mediademuxer_set_error_cb() was invoked
358 * This data will be accessible from mediademuxer_error_cb()
359 * @return @c 0 on success, otherwise a negative error value
360 * @retval #MEDIADEMUXER_ERROR_NONE Successful
361 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
362 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
363 * @pre Create a media demuxer handle by calling mediademuxer_create() function.
364 * @post mediademuxer_error_cb() will be invoked.
365 * @see mediademuxer_unset_error_cb()
366 * @see mediademuxer_error_cb()
368 int mediademuxer_set_error_cb(mediademuxer_h demuxer, mediademuxer_error_cb callback, void *user_data);
371 * @brief Unsets the error callback function.
373 * @param[in] demuxer The media demuxer handle
374 * @return @c 0 on success, otherwise a negative error value
375 * @retval #MEDIADEMUXER_ERROR_NONE Successful
376 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
377 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
378 * @see mediademuxer_error_cb()
380 int mediademuxer_unset_error_cb(mediademuxer_h demuxer);
383 * @brief Sets an eos callback function to be invoked when an eos occurs.
385 * @param[in] demuxer The media demuxer handle
386 * @param[in] callback Callback function pointer
387 * @param[in] user_data The user data passed from the code where
388 * mediademuxer_set_eos_cb() was invoked
389 * This data will be accessible from mediademuxer_eos_cb()
390 * @return @c 0 on success, otherwise a negative error value
391 * @retval #MEDIADEMUXER_ERROR_NONE Successful
392 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
393 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
394 * @pre Create a media demuxer handle by calling mediademuxer_create() function.
395 * @post mediademuxer_eos_cb() will be invoked.
396 * @see mediademuxer_unset_eos_cb()
397 * @see mediademuxer_eos_cb()
399 int mediademuxer_set_eos_cb(mediademuxer_h demuxer, mediademuxer_eos_cb callback, void *user_data);
402 * @brief Unsets the eos callback function.
404 * @param[in] demuxer The media demuxer handle
405 * @return @c 0 on success, otherwise a negative error value
406 * @retval #MEDIADEMUXER_ERROR_NONE Successful
407 * @retval #MEDIADEMUXER_ERROR_INVALID_PARAMETER Invalid parameter
408 * @retval #MEDIADEMUXER_ERROR_INVALID_STATE Invalid state
409 * @see mediademuxer_eos_cb()
411 int mediademuxer_unset_eos_cb(mediademuxer_h demuxer);
420 #endif /* __TIZEN_MULTIMEDIA_MEDIADEMUXER_H__ */