blob: 79aacebc1244469e8a5b5cf40946c66e3f2ef5b4 [file] [log] [blame]
/*
* \file
* Segment module
*/
#ifndef _SEGMENT_OPS_H_
#define _SEGMENT_OPS_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "dvr_types.h"
/**\brief Segment handle*/
typedef void* Segment_Handle_t;
/**\brief Segment open mode*/
typedef enum {
SEGMENT_MODE_READ, /**< Segment open read mode*/
SEGMENT_MODE_WRITE, /**< Segment open write mode*/
SEGMENT_MODE_MAX /**< Segment invalid open mode*/
} Segment_OpenMode_t;
/**\brief Segment open parameters*/
typedef struct Segment_OpenParams_s {
char location[DVR_MAX_LOCATION_SIZE]; /**< Segment file location*/
uint64_t segment_id; /**< Segment index*/
Segment_OpenMode_t mode; /**< Segment open mode*/
DVR_Bool_t force_sysclock; /**< If ture, force to use system clock as PVR index time source. If false, libdvr can determine index time source based on actual situation*/
} Segment_OpenParams_t;
typedef struct Segment_Ops_s {
/**\brief Open a segment for a target giving some open parameters
* \param[out] p_handle, Return the handle of the newly created segment
* \param[in] params, Segment open parameters
* \return DVR_SUCCESS on success
* \return error code on failure
*/
int (*segment_open)(Segment_OpenParams_t *params, Segment_Handle_t *p_handle);
/**\brief Close a segment
* \param[in] handle, Segment handle
* \return DVR_SUCCESS on success
* \return error code on failure
*/
int (*segment_close)(Segment_Handle_t handle);
/**\brief control the giving segment
* \param[in] handle, Segment handle
* \param[in] cmd, The control command
* \param[in] data, The control data
* \param[in] size, Size of the control data
* \return DVR_SUCCESS on success
* \return error code on failure
*/
int (*segment_ioctl)(Segment_Handle_t handle, int cmd, void *data, size_t size);
/**\brief Read data from the giving segment
* \param[out] buf, The buffer of data
* \param[in] handle, Segment handle
* \param[in] count, The data count
* \return The number of bytes read on success
* \return error code on failure
*/
ssize_t (*segment_read)(Segment_Handle_t handle, void *buf, size_t count);
/**\brief Write data from the giving segment
* \param[in] buf, The buffer of data
* \param[in] handle, Segment handle
* \param[in] count, The data count
* \return The number of bytes write on success
* \return error code on failure
*/
ssize_t (*segment_write)(Segment_Handle_t handle, void *buf, size_t count);
/**\brief force Update the pts and offset when record
* \param[in] handle, Segment handle
* \param[in] pts, Current pts
* \param[in] offset, Current segment offset
* \return DVR_SUCCESS on success
* \return error code on failure
*/
int (*segment_update_pts_force)(Segment_Handle_t handle, uint64_t pts, loff_t offset);
/**\brief Update the pts and offset when record
* \param[in] handle, Segment handle
* \param[in] pts, Current pts
* \param[in] offset, Current segment offset
* \return DVR_SUCCESS on success
* \return error code on failure
*/
int (*segment_update_pts)(Segment_Handle_t handle, uint64_t pts, loff_t offset);
/**\brief Seek the segment to the correct position which match the giving time
* \param[in] handle, Segment handle
* \param[in] time, The time offset
* \param[in] block_size, if block_size is > 0, we need aligned to block_size-byte boundary
* \return The segment current read position on success
* \return error code on failure
*/
loff_t (*segment_seek)(Segment_Handle_t handle, uint64_t time, int block_size);
/**\brief Tell the current position for the giving segment
* \param[in] handle, Segment handle
* \return The segment current read position on success
* \return error code on failure
*/
loff_t (*segment_tell_position)(Segment_Handle_t handle);
/**\brief Tell position time of the given segment's postion. Function is used for playback.
* \param[in] handle, Segment handle
* \param[in] position, Segment's file position
* \return position time in ms on success, or -1 on failure
*/
loff_t (*segment_tell_position_time)(Segment_Handle_t handle, loff_t position);
/**\brief Tell current playback time of the given segment. Function is used for playback.
* \param[in] handle, Segment handle
* \return segment's current playback time in ms on success, or -1 on failure
*/
loff_t (*segment_tell_current_time)(Segment_Handle_t handle);
/**\brief Tell total time of the given segment.
* \param[in] handle, Segment handle
* \return The segment's total time in ms on success, or -1 on failure
*/
loff_t (*segment_tell_total_time)(Segment_Handle_t handle);
/**\brief Store the segment information to a file
* \param[in] handle, The segment handle
* \param[in] p_info, The segment information pointer
* \return DVR_SUCCESS On success
* \return Error code On failure
*/
int (*segment_store_info)(Segment_Handle_t handle, Segment_StoreInfo_t *p_info);
/**\brief Store the segment all information to a file
* \param[in] handle, The segment handle
* \param[in] p_info, The segment information pointer
* \return DVR_SUCCESS On success
* \return Error code On failure
*/
int (*segment_store_allInfo)(Segment_Handle_t handle, Segment_StoreInfo_t *p_info);
/**\brief Load the segment information from a file
* \param[in] handle, The segment handle
* \param[out] p_info, The segment information pointer
* \return DVR_SUCCESS On success
* \return Error code On failure
*/
int (*segment_load_info)(Segment_Handle_t handle, Segment_StoreInfo_t *p_info);
/**\brief Load the segment information from a file
* \param[in] handle, The segment handle
* \param[out] p_info, The segment information pointer
* \return DVR_SUCCESS On success
* \return Error code On failure
*/
int (*segment_load_allInfo)(Segment_Handle_t handle, struct list_head *list);
/**\brief Delete the segment information file
* \param[in] location, The record file's location
* \param[in] segment_id, The segment's index
* \return DVR_SUCCESS On success
* \return Error code On failure
*/
int (*segment_delete)(const char *location, uint64_t segment_id);
/**\brief check the segment is ongoing file
* \param[in] handle, The segment handle
* \return DVR_SUCCESS On success
* \return Error code not ongoing
*/
int (*segment_ongoing)(Segment_Handle_t handle);
/**\brief get current ongoing segment size
* \param[in] handle, The segment handle
* \return segment size
*/
off_t (*segment_get_cur_segment_size)(Segment_Handle_t handle);
/**\brief get current ongoing segment id
* \param[in] handle, The segment handle
* \return segment id
*/
uint64_t (*segment_get_cur_segment_id)(Segment_Handle_t handle);
} Segment_Ops_t;
#ifdef __cplusplus
}
#endif
#endif /*END _SEGMENT_H_H_*/