Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 1 | /** |
| 2 | * \file |
| 3 | * Playback module. |
| 4 | */ |
| 5 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 6 | #ifndef DVR_PLAYBACK_H_ |
| 7 | #define DVR_PLAYBACK_H_ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 8 | #include "list.h" |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 9 | #include "dvr_types.h" |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 10 | #include "segment.h" |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 11 | #include "playback_device.h" |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 12 | #include "dvr_types.h" |
| 13 | #include "dvr_crypto.h" |
| 14 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 15 | #ifdef __cplusplus |
| 16 | extern "C" { |
| 17 | #endif |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 18 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 19 | /**\brief dvr play segment flag */ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 20 | typedef enum |
| 21 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 22 | DVR_PLAYBACK_SEGMENT_ENCRYPTED = (1 << 0), /**< encrypted stream */ |
| 23 | DVR_PLAYBACK_SEGMENT_DISPLAYABLE = (1 << 1), /**< displayable stream */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 24 | DVR_PLAYBACK_SEGMENT_CONTINUOUS = (1 << 2)/**< continuous stream with pre one */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 25 | } DVR_PlaybackSegmentFlag_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 26 | |
| 27 | /**\brief dvr pid type*/ |
| 28 | typedef enum |
| 29 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 30 | DVR_PLAYBACK_SYNC, /**< sync play mode */ |
| 31 | DVR_PLAYBACK_ASYNC /**< out of sync play mode */ |
| 32 | } DVR_PlaybackSyncMode_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 33 | |
| 34 | |
| 35 | /**\brief dvr play pids */ |
| 36 | typedef struct |
| 37 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 38 | DVR_StreamInfo_t video; /**< Video.*/ |
| 39 | DVR_StreamInfo_t audio; /**< Audio.*/ |
| 40 | DVR_StreamInfo_t ad; /**< AD.*/ |
| 41 | DVR_StreamInfo_t subtitle; /**< Subtitle.*/ |
| 42 | DVR_StreamInfo_t pcr; /**< PCR.*/ |
| 43 | } DVR_PlaybackPids_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 44 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 45 | /**\brief dvr segments info */ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 46 | typedef struct |
| 47 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 48 | struct list_head head; /**< Segment node.*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 49 | uint64_t segment_id; /**< Segment's index.*/ |
| 50 | char location[DVR_MAX_LOCATION_SIZE]; /**< chunk location */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 51 | DVR_PlaybackPids_t pids; /**< Streams' PIDs.*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 52 | DVR_PlaybackSegmentFlag_t flags; /**< Segment's flag */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 53 | int key_data_id; /**< ??? */ |
| 54 | } DVR_PlaybackSegmentInfo_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 55 | |
| 56 | /**\brief play flag, if set this flag, player need pause when decode first frame */ |
| 57 | typedef enum |
| 58 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 59 | DVR_PLAYBACK_STARTED_PAUSEDLIVE = (1 << 0) /**< dvr play stat,need change to pause state if set */ |
| 60 | } DVR_PlaybackFlag_t; |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 61 | |
| 62 | /**\brief playback speed mode*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 63 | typedef enum |
| 64 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 65 | DVR_PLAYBACK_FAST_FORWARD = 0, /**< fast forward */ |
| 66 | DVR_PLAYBACK_FAST_BACKWARD = 1, /**< fast backward */ |
| 67 | } DVR_PlaybackSpeedMode_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 68 | |
| 69 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 70 | /**\brief playback play speed*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 71 | typedef struct |
| 72 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 73 | Playback_DeviceSpeeds_t speed; /**< playback speed */ |
| 74 | DVR_PlaybackSpeedMode_t mode; /**< playback 0: fast forword or 1: fast backword*/ |
| 75 | } DVR_PlaybackSpeed_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 76 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 77 | /**Maximum supported speed modes.*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 78 | #define DVR_MAX_SUPPORTED_SPEEDS 32 |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 79 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 80 | /**\brief playback capability*/ |
| 81 | typedef struct |
| 82 | { |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 83 | int nb_supported_speeds; /**< support playback speed count*/ |
| 84 | int supported_speeds[DVR_MAX_SUPPORTED_SPEEDS]; /**< support playback speed*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 85 | } DVR_PlaybackCapability_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 86 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 87 | /**Playback handle.*/ |
| 88 | typedef void* DVR_PlaybackHandle_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 89 | |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 90 | |
| 91 | /**\brief playback error reason*/ |
| 92 | typedef enum |
| 93 | { |
| 94 | DVR_PLAYBACK_PID_ERROR, /**< uninit state */ |
| 95 | DVR_PLAYBACK_FMT_ERROR /**< fmt not surport backword */ |
| 96 | } DVR_PlaybackError_t; |
| 97 | |
| 98 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 99 | /**\brief playback play state*/ |
| 100 | typedef enum |
| 101 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 102 | DVR_PLAYBACK_STATE_UNINIT, /**< uninit state */ |
| 103 | DVR_PLAYBACK_STATE_INIT, /**< init state, open device */ |
| 104 | DVR_PLAYBACK_STATE_START, /**< start play */ |
| 105 | DVR_PLAYBACK_STATE_STOP, /**< stop */ |
| 106 | DVR_PLAYBACK_STATE_PAUSE, /**< pause */ |
| 107 | DVR_PLAYBACK_STATE_FF, /**< fast forward */ |
| 108 | DVR_PLAYBACK_STATE_FB /**< fast backword */ |
| 109 | } DVR_PlaybackPlayState_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 110 | |
| 111 | /**\brief playback play status*/ |
| 112 | typedef struct |
| 113 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 114 | DVR_PlaybackPlayState_t state; /**< playback play state */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 115 | uint64_t segment_id; /**< playback ongoing segment index */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 116 | uint32_t time_cur; /**< playback cur time,0 <--> time_end Ms*/ |
| 117 | uint32_t time_end; /**< playback ongoing segment dur,Ms */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 118 | DVR_PlaybackPids_t pids; /**< playback played pids */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 119 | int speed; /**< playback speed */ |
| 120 | DVR_PlaybackSegmentFlag_t flags; /**< playback played segment flag */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 121 | } DVR_PlaybackStatus_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 122 | |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 123 | /**\brief DVR playback event*/ |
| 124 | typedef enum { |
| 125 | DVR_PLAYBACK_EVENT_ERROR = 0x1000, /**< Signal a critical playback error*/ |
| 126 | DVR_PLAYBACK_EVENT_TRANSITION_OK , /**< transition ok*/ |
| 127 | DVR_PLAYBACK_EVENT_TRANSITION_FAILED, /**< transition failed*/ |
| 128 | DVR_PLAYBACK_EVENT_KEY_FAILURE, /**< key failure*/ |
| 129 | DVR_PLAYBACK_EVENT_NO_KEY, /**< no key*/ |
| 130 | DVR_PLAYBACK_EVENT_REACHED_BEGIN , /**< reached begin*/ |
| 131 | DVR_PLAYBACK_EVENT_REACHED_END /**< reached end*/ |
| 132 | } DVR_PlaybackEvent_t; |
| 133 | |
| 134 | /**\brief DVR playback event notify function*/ |
| 135 | typedef struct |
| 136 | { |
| 137 | DVR_PlaybackEvent_t event; /**< event type*/ |
| 138 | DVR_PlaybackStatus_t play_status; /**< play status*/ |
| 139 | union |
| 140 | { |
| 141 | uint8_t unused; |
| 142 | uint8_t error_reason; /**< error reason*/ |
| 143 | struct |
| 144 | { |
| 145 | uint64_t segment_id; /**< error segment id*/ |
| 146 | uint32_t key_data_id; /**< key data id*/ |
| 147 | uint8_t error; /**< error*/ |
| 148 | } transition_failed_data; |
| 149 | } info; |
| 150 | } DVR_Play_Notify_t; |
| 151 | |
| 152 | /**\brief DVR playback event notify function*/ |
| 153 | typedef DVR_Result_t (*DVR_PlaybackEventFunction_t) (DVR_PlaybackEvent_t event, void *params, void *userdata); |
| 154 | |
| 155 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 156 | /**\brief playback open params*/ |
| 157 | typedef struct |
| 158 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 159 | int dmx_dev_id; /**< playback used dmx device index*/ |
| 160 | int block_size; /**< playback inject block size*/ |
| 161 | DVR_Bool_t is_timeshift; /**< 0:playback mode, 1 : is timeshift mode*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 162 | Playback_DeviceHandle_t playback_handle; /**< Playback device handle.*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 163 | DVR_CryptoFunction_t crypto_fn; /**< Crypto function.*/ |
| 164 | void *crypto_data; /**< Crypto function's user data.*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 165 | DVR_Bool_t has_pids; /**< has video audo pid fmt info*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 166 | DVR_PlaybackEventFunction_t event_fn; /**< playback event callback function*/ |
| 167 | void *event_userdata; /**< event userdata*/ |
| 168 | size_t notification_size; /**< playback notification size, playback moudle would send a notifaction when the size of current segment is multiple of this value. Put 0 in this argument if you don't want to receive the notification*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 169 | } DVR_PlaybackOpenParams_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 170 | |
| 171 | /**\brief playback play state*/ |
| 172 | typedef enum |
| 173 | { |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 174 | DVR_PLAYBACK_CMD_START, /**< start av */ |
| 175 | DVR_PLAYBACK_CMD_STOP, /**< stop av */ |
| 176 | DVR_PLAYBACK_CMD_VSTART, /**< v start */ |
| 177 | DVR_PLAYBACK_CMD_ASTART , /**< a start */ |
| 178 | DVR_PLAYBACK_CMD_VSTOP , /**< v stop */ |
| 179 | DVR_PLAYBACK_CMD_ASTOP, /**< a stop */ |
| 180 | DVR_PLAYBACK_CMD_VRESTART, /**< v restart */ |
| 181 | DVR_PLAYBACK_CMD_ARESTART, /**< a restart */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 182 | DVR_PLAYBACK_CMD_AVRESTART, /**< av restart */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 183 | DVR_PLAYBACK_CMD_VSTOPASTART, /**< v stop a start*/ |
| 184 | DVR_PLAYBACK_CMD_ASTOPVSTART, /**< a stop vstart */ |
| 185 | DVR_PLAYBACK_CMD_VSTOPARESTART, /**<v stop a restart*/ |
| 186 | DVR_PLAYBACK_CMD_ASTOPVRESTART, /**<a stop v restart*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 187 | DVR_PLAYBACK_CMD_VSTARTARESTART, /**<v start a restart*/ |
| 188 | DVR_PLAYBACK_CMD_ASTARTVRESTART, /**<a start v restart*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 189 | DVR_PLAYBACK_CMD_PAUSE, /**< pause */ |
| 190 | DVR_PLAYBACK_CMD_RESUME, /**< resume */ |
| 191 | DVR_PLAYBACK_CMD_SEEK, /**< seek */ |
| 192 | DVR_PLAYBACK_CMD_FF, /**< fast forward */ |
| 193 | DVR_PLAYBACK_CMD_FB, /**< fast backword */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 194 | DVR_PLAYBACK_CMD_NONE, /**< none */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 195 | } DVR_PlaybackCmd_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 196 | |
| 197 | |
| 198 | /**\brief playback struct*/ |
| 199 | typedef struct |
| 200 | { |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 201 | DVR_PlaybackSpeed_t speed; /**< play speed */ |
| 202 | DVR_PlaybackPlayState_t state; /**< play state */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 203 | DVR_PlaybackCmd_t cur_cmd; /**< cur send cmd */ |
| 204 | DVR_PlaybackCmd_t last_cmd; /**< last cmd */ |
| 205 | int pos; /**< seek pos at cur segment*/ |
| 206 | } DVR_PlaybackCmdInfo_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 207 | |
| 208 | |
| 209 | /**\brief playback struct*/ |
| 210 | typedef struct |
| 211 | { |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 212 | Playback_DeviceHandle_t handle; /**< device handle */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 213 | DVR_Bool_t segment_is_open; /**<segment is opend*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 214 | uint64_t cur_segment_id; /**< Current segment id*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 215 | DVR_PlaybackSegmentInfo_t cur_segment; /**< Current playing segment*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 216 | uint64_t last_segment_id; /**< last segment id*/ |
| 217 | DVR_PlaybackSegmentInfo_t last_segment; /**< last playing segment*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 218 | struct list_head segment_list; /**< segment list head*/ |
| 219 | pthread_t playback_thread; /**< playback thread*/ |
| 220 | pthread_mutex_t lock; /**< playback lock*/ |
| 221 | pthread_cond_t cond; /**< playback cond*/ |
| 222 | void *user_data; /**< playback userdata, used to send event*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 223 | int speed; /**< playback speed*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 224 | DVR_PlaybackPlayState_t state; /**< playback state*/ |
| 225 | DVR_PlaybackFlag_t play_flag; /**< playback play flag*/ |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 226 | int is_running; /**< playback htread is runing*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 227 | DVR_PlaybackCmdInfo_t cmd; /**< playback cmd*/ |
| 228 | int offset; /**< segment read offset*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 229 | uint32_t dur; /**< segment dur*/ |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 230 | Segment_Handle_t r_handle; /**< playback current segment handle*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 231 | DVR_PlaybackOpenParams_t openParams; /**< playback openParams*/ |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 232 | DVR_Bool_t has_video; /**< has video playing*/ |
| 233 | DVR_Bool_t has_audio; /**< has audio playing*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 234 | DVR_Bool_t has_pids; /**< has video audo pid fmt info*/ |
| 235 | int fffb_start; /**< fffb start time ms*/ |
| 236 | int fffb_current; /**< fffb current time*/ |
| 237 | int fffb_start_pcr; /**< fffb start pcr time*/ |
| 238 | int seek_time; |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 239 | } DVR_Playback_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 240 | |
| 241 | /**\brief Open an dvr palyback |
| 242 | * \param[out] p_handle dvr playback addr |
| 243 | * \param[in] params dvr playback open parameters |
| 244 | * \retval DVR_SUCCESS On success |
| 245 | * \return Error code |
| 246 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 247 | int dvr_playback_open(DVR_PlaybackHandle_t *p_handle, DVR_PlaybackOpenParams_t *params); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 248 | |
| 249 | /**\brief Close an dvr palyback |
| 250 | * \param[in] handle playback handle |
| 251 | * \retval DVR_SUCCESS On success |
| 252 | * \return Error code |
| 253 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 254 | int dvr_playback_close(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 255 | |
| 256 | |
| 257 | /**\brief Start play audio and video, used start auido api and start video api |
| 258 | * \param[in] handle playback handle |
| 259 | * \param[in] params audio playback params,contains fmt and pid... |
| 260 | * \retval DVR_SUCCESS On success |
| 261 | * \return Error code |
| 262 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 263 | int dvr_playback_start(DVR_PlaybackHandle_t handle, DVR_PlaybackFlag_t flag); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 264 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 265 | /**\brief dvr play back add segment info to segment list |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 266 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 267 | * \param[in] info added segment info,con vpid fmt apid fmt..... |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 268 | * \retval DVR_SUCCESS On success |
| 269 | * \return Error code |
| 270 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 271 | int dvr_playback_add_segment(DVR_PlaybackHandle_t handle, DVR_PlaybackSegmentInfo_t *info); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 272 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 273 | /**\brief dvr play back remove segment info by segmentkid |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 274 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 275 | * \param[in] segmentid need removed segment id |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 276 | * \retval DVR_SUCCESS On success |
| 277 | * \return Error code |
| 278 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 279 | int dvr_playback_remove_segment(DVR_PlaybackHandle_t handle, uint64_t segmentid); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 280 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 281 | /**\brief dvr play back add segment info |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 282 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 283 | * \param[in] info added segment info,con vpid fmt apid fmt..... |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 284 | * \retval DVR_SUCCESS On success |
| 285 | * \return Error code |
| 286 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 287 | int dvr_playback_update_segment_flags(DVR_PlaybackHandle_t handle, |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 288 | uint64_t segment_id, |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 289 | DVR_PlaybackSegmentFlag_t flags); |
| 290 | /**\brief dvr play back up1date segment pids |
| 291 | * if updated segment is ongoing segment, we need start new |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 292 | * add pid stream and stop remove pid stream. |
| 293 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 294 | * \param[in] segment_id need updated pids segment id |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 295 | * \retval DVR_SUCCESS On success |
| 296 | * \return Error code |
| 297 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 298 | int dvr_playback_update_segment_pids(DVR_PlaybackHandle_t handle, uint64_t segmentid, |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 299 | DVR_PlaybackPids_t *p_pids); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 300 | |
| 301 | /**\brief Stop play, will stop video and audio |
| 302 | * \param[in] handle playback handle |
| 303 | * \param[in] clear is clear last frame |
| 304 | * \retval DVR_SUCCESS On success |
| 305 | * \return Error code |
| 306 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 307 | int dvr_playback_stop(DVR_PlaybackHandle_t handle, DVR_Bool_t clear); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 308 | |
| 309 | /**\brief Start play audio |
| 310 | * \param[in] handle playback handle |
| 311 | * \param[in] params audio playback params,contains fmt and pid... |
| 312 | * \retval DVR_SUCCESS On success |
| 313 | * \return Error code |
| 314 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 315 | int dvr_playback_audio_start(DVR_PlaybackHandle_t handle, Playback_DeviceAudioParams_t *param); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 316 | |
| 317 | /**\brief Stop play audio |
| 318 | * \param[in] handle playback handle |
| 319 | * \retval DVR_SUCCESS On success |
| 320 | * \return Error code |
| 321 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 322 | int dvr_playback_audio_stop(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 323 | |
| 324 | /**\brief Start play video |
| 325 | * \param[in] handle playback handle |
| 326 | * \param[in] params video playback params,contains fmt and pid... |
| 327 | * \retval DVR_SUCCESS On success |
| 328 | * \return Error code |
| 329 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 330 | int dvr_playback_video_start(DVR_PlaybackHandle_t handle, Playback_DeviceVideoParams_t *param); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 331 | |
| 332 | /**\brief Stop play video |
| 333 | * \param[in] handle playback handle |
| 334 | * \retval DVR_SUCCESS On success |
| 335 | * \return Error code |
| 336 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 337 | int dvr_playback_video_stop(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 338 | |
| 339 | /**\brief Pause play |
| 340 | * \param[in] handle playback handle |
| 341 | * \param[in] flush whether its internal buffers should be flushed |
| 342 | * \retval DVR_SUCCESS On success |
| 343 | * \return Error code |
| 344 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 345 | int dvr_playback_pause(DVR_PlaybackHandle_t handle, DVR_Bool_t flush); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 346 | |
| 347 | |
| 348 | /**\brief seek |
| 349 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 350 | * \param[in] time_offset time offset base cur segment |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 351 | * \retval DVR_SUCCESS On success |
| 352 | * \return Error code |
| 353 | */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame^] | 354 | int dvr_playback_seek(DVR_PlaybackHandle_t handle, uint64_t segment_id, uint32_t time_offset); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 355 | |
| 356 | /**\brief Set play speed |
| 357 | * \param[in] handle playback handle |
| 358 | * \param[in] speed playback speed |
| 359 | * \retval DVR_SUCCESS On success |
| 360 | * \return Error code |
| 361 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 362 | int dvr_playback_set_speed(DVR_PlaybackHandle_t handle, DVR_PlaybackSpeed_t speed); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 363 | |
| 364 | /**\brief Get playback status |
| 365 | * \param[in] handle playback handle |
| 366 | * \param[out] p_status playback status |
| 367 | * \retval DVR_SUCCESS On success |
| 368 | * \return Error code |
| 369 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 370 | int dvr_playback_get_status(DVR_PlaybackHandle_t handle, DVR_PlaybackStatus_t *p_status); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 371 | |
| 372 | /**\brief Get playback capabilities |
| 373 | * \param[out] p_capability playback capability |
| 374 | * \retval DVR_SUCCESS On success |
| 375 | * \return Error code |
| 376 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 377 | int dvr_playback_get_capabilities(DVR_PlaybackCapability_t *p_capability); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 378 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 379 | /**\brief dump segmentinfo throw print log |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 380 | * \param[int] handle playback |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 381 | * \param[int] segment_id if segment_id > 0, only dump this log. else dump all segment info |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 382 | * \retval DVR_SUCCESS On success |
| 383 | * \return Error code |
| 384 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 385 | int dvr_dump_segmentinfo(DVR_PlaybackHandle_t handle, uint64_t segment_id); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 386 | |
| 387 | #ifdef __cplusplus |
| 388 | } |
| 389 | #endif |
| 390 | |
| 391 | #endif /*END DVR_PLAYBACK_H_*/ |