blob: d8a3c2b7e4b71bfeae2e83cc3c9e2de0eb87b627 [file] [log] [blame]
Gong Ke3489c0f2020-01-16 18:11:44 +08001/**
2 * \file
3 * Playback module.
4 */
5
hualing chenb31a6c62020-01-13 17:27:00 +08006#ifndef DVR_PLAYBACK_H_
7#define DVR_PLAYBACK_H_
hualing chenb31a6c62020-01-13 17:27:00 +08008#include "list.h"
Gong Ke3489c0f2020-01-16 18:11:44 +08009#include "dvr_types.h"
hualing chen86e7d482020-01-16 15:13:33 +080010#include "segment.h"
hualing chenb31a6c62020-01-13 17:27:00 +080011#include "playback_device.h"
12#ifdef __cplusplus
13extern "C" {
14#endif
Gong Ke3489c0f2020-01-16 18:11:44 +080015
hualing chenb31a6c62020-01-13 17:27:00 +080016/**\brief dvr play chunk flag */
17typedef enum
18{
Gong Ke3489c0f2020-01-16 18:11:44 +080019 DVR_PLAYBACK_SEGMENT_ENCRYPTED = (1 << 0), /**< encrypted stream */
20 DVR_PLAYBACK_SEGMENT_DISPLAYABLE = (1 << 1), /**< displayable stream */
21 DVR_PLAYBACK_SEGMENT_CONTINUOUS = (1 << 2) /**< continuous stream with pre one */
22} DVR_PlaybackSegmentFlag_t;
hualing chenb31a6c62020-01-13 17:27:00 +080023
24/**\brief dvr pid type*/
25typedef enum
26{
Gong Ke3489c0f2020-01-16 18:11:44 +080027 DVR_PLAYBACK_SYNC, /**< sync play mode */
28 DVR_PLAYBACK_ASYNC /**< out of sync play mode */
29} DVR_PlaybackSyncMode_t;
hualing chenb31a6c62020-01-13 17:27:00 +080030
31
32/**\brief dvr play pids */
33typedef struct
34{
Gong Ke3489c0f2020-01-16 18:11:44 +080035 DVR_StreamInfo_t video; /**< Video.*/
36 DVR_StreamInfo_t audio; /**< Audio.*/
37 DVR_StreamInfo_t ad; /**< AD.*/
38 DVR_StreamInfo_t subtitle; /**< Subtitle.*/
39 DVR_StreamInfo_t pcr; /**< PCR.*/
40} DVR_PlaybackPids_t;
hualing chenb31a6c62020-01-13 17:27:00 +080041
Gong Ke3489c0f2020-01-16 18:11:44 +080042/**\brief dvr segments info */
hualing chenb31a6c62020-01-13 17:27:00 +080043typedef struct
44{
Gong Ke3489c0f2020-01-16 18:11:44 +080045 struct list_head head; /**< Segment node.*/
46 int segment_id; /**< Segment's index.*/
47 DVR_PlaybackPids_t pids; /**< Streams' PIDs.*/
48 DVR_PlaybackChunkFlag_t flags; /**< Segment's flag */
49 int key_data_id; /**< ??? */
50} DVR_PlaybackSegmentInfo_t;
hualing chenb31a6c62020-01-13 17:27:00 +080051
52/**\brief play flag, if set this flag, player need pause when decode first frame */
53typedef enum
54{
Gong Ke3489c0f2020-01-16 18:11:44 +080055 DVR_PLAYBACK_STARTED_PAUSEDLIVE = (1 << 0) /**< dvr play stat,need change to pause state if set */
56} DVR_PlaybackFlag_t;
hualing chen86e7d482020-01-16 15:13:33 +080057
58/**\brief playback speed mode*/
hualing chenb31a6c62020-01-13 17:27:00 +080059typedef enum
60{
Gong Ke3489c0f2020-01-16 18:11:44 +080061 DVR_PLAYBACK_FAST_FORWARD = 0, /**< fast forward */
62 DVR_PLAYBACK_FAST_BACKWARD = 1, /**< fast backward */
63} DVR_PlaybackSpeedMode_t;
hualing chenb31a6c62020-01-13 17:27:00 +080064
65
Gong Ke3489c0f2020-01-16 18:11:44 +080066/**\brief playback play speed*/
hualing chenb31a6c62020-01-13 17:27:00 +080067typedef struct
68{
Gong Ke3489c0f2020-01-16 18:11:44 +080069 Playback_DeviceSpeeds_t speed; /**< playback speed */
70 DVR_PlaybackSpeedMode_t mode; /**< playback 0: fast forword or 1: fast backword*/
71} DVR_PlaybackSpeed_t;
hualing chenb31a6c62020-01-13 17:27:00 +080072
Gong Ke3489c0f2020-01-16 18:11:44 +080073/**Maximum supported speed modes.*/
hualing chenb31a6c62020-01-13 17:27:00 +080074#define DVR_MAX_SUPPORTED_SPEEDS 32
Gong Ke3489c0f2020-01-16 18:11:44 +080075
hualing chenb31a6c62020-01-13 17:27:00 +080076/**\brief playback capability*/
77typedef struct
78{
hualing chen86e7d482020-01-16 15:13:33 +080079 int nb_supported_speeds; /**< support playback speed count*/
80 int supported_speeds[DVR_MAX_SUPPORTED_SPEEDS]; /**< support playback speed*/
Gong Ke3489c0f2020-01-16 18:11:44 +080081} DVR_PlaybackCapability_t;
hualing chenb31a6c62020-01-13 17:27:00 +080082
Gong Ke3489c0f2020-01-16 18:11:44 +080083/**Playback handle.*/
84typedef void* DVR_PlaybackHandle_t;
hualing chenb31a6c62020-01-13 17:27:00 +080085
86/**\brief playback play state*/
87typedef enum
88{
Gong Ke3489c0f2020-01-16 18:11:44 +080089 DVR_PLAYBACK_STATE_UNINIT, /**< uninit state */
90 DVR_PLAYBACK_STATE_INIT, /**< init state, open device */
91 DVR_PLAYBACK_STATE_START, /**< start play */
92 DVR_PLAYBACK_STATE_STOP, /**< stop */
93 DVR_PLAYBACK_STATE_PAUSE, /**< pause */
94 DVR_PLAYBACK_STATE_FF, /**< fast forward */
95 DVR_PLAYBACK_STATE_FB /**< fast backword */
96} DVR_PlaybackPlayState_t;
hualing chenb31a6c62020-01-13 17:27:00 +080097
98/**\brief playback play status*/
99typedef struct
100{
Gong Ke3489c0f2020-01-16 18:11:44 +0800101 DVR_PlaybackPlayState_t state; /**< playback play state */
102 int segment_id; /**< playback ongoing segment index */
103 int time_cur; /**< playback cur time,0 <--> time_end Ms*/
104 int time_end; /**< playback ongoing chunk dur,Ms */
105 DVR_PlaybackPids_t pids; /**< playback played pids */
106 Playback_DeviceSpeeds_t speed; /**< playback speed */
107 DVR_PlaybackSegmentFlag_t flags;/**< playback played segment flag */
108} DVR_PlaybackStatus_t;
hualing chenb31a6c62020-01-13 17:27:00 +0800109
110/**\brief playback open params*/
111typedef struct
112{
Gong Ke3489c0f2020-01-16 18:11:44 +0800113 int dmx_dev_id; /**< playback used dmx device index*/
114 int block_size; /**< playback inject block size*/
115 DVR_Bool_t is_timeshift; /**< 0:playback mode, 1 : is timeshift mode*/
116 PlaybackDeviceHandle_t playback_handle; /**< Playback device handle.*/
117 DVR_CryptoFunction_t crypto_fn; /**< Crypto function.*/
118 void *crypto_data; /**< Crypto function's user data.*/
119} DVR_PlaybackOpenParams_t;
hualing chenb31a6c62020-01-13 17:27:00 +0800120
121/**\brief playback play state*/
122typedef enum
123{
hualing chen86e7d482020-01-16 15:13:33 +0800124 DVR_PlayBack_Cmd_Start, /**< start av */
125 DVR_PlayBack_Cmd_Stop, /**< stop av */
126 DVR_PlayBack_Cmd_VStart, /**< v start */
127 DVR_PlayBack_Cmd_AStart, /**< a start */
128 DVR_PlayBack_Cmd_VStop, /**< v stop */
129 DVR_PlayBack_Cmd_AStop, /**< a stop */
130 DVR_PlayBack_Cmd_VReStart, /**<v restart */
131 DVR_PlayBack_Cmd_AReStart, /**< a restart */
132 DVR_PlayBack_Cmd_VStopAStart, /**< v stop a start*/
133 DVR_PlayBack_Cmd_AStopVStart, /**< a stop vstart */
134 DVR_PlayBack_Cmd_VStopAReStart, /**<v stop a restart*/
135 DVR_PlayBack_Cmd_AStopVReStart, /**<a stop v restart*/
136 DVR_PlayBack_Cmd_Pause, /**< pause */
137 DVR_PlayBack_Cmd_Resume, /**< resume */
138 DVR_PlayBack_Cmd_Seek, /**< seek */
139 DVR_PlayBack_Cmd_FF, /**< fast forward */
140 DVR_PlayBack_Cmd_FB, /**< fast backword */
hualing chen96357e42020-01-16 15:54:12 +0800141} DVR_PlayBackCmd_t;
hualing chenb31a6c62020-01-13 17:27:00 +0800142
143
144/**\brief playback struct*/
145typedef struct
146{
hualing chen96357e42020-01-16 15:54:12 +0800147 PlayBack_DeviceSpeeds_t speed; /**< play speed */
148 DVR_PlayBackPlayState_t state; /**< plat state */
149 DVR_PlayBackCmd_t cur_cmd; /**< cur send cmd */
150 DVR_PlayBackCmd_t last_cmd; /**< last cmd */
hualing chen86e7d482020-01-16 15:13:33 +0800151 int pos; /**< seek pos at cur chunk*/
hualing chen96357e42020-01-16 15:54:12 +0800152} DVR_PlayBackCmdInfo_t;
hualing chenb31a6c62020-01-13 17:27:00 +0800153
154
155/**\brief playback struct*/
156typedef struct
157{
hualing chen96357e42020-01-16 15:54:12 +0800158 PlayBack_DeviceHandle_t handle; /**< device handle */
hualing chen86e7d482020-01-16 15:13:33 +0800159 int cur_chunkid; /**< Current chunk id*/
hualing chen96357e42020-01-16 15:54:12 +0800160 DVR_PlayBackChunkInfo_t cur_chunk; /**< Current playing chunk*/
hualing chen86e7d482020-01-16 15:13:33 +0800161 struct list_head chunk_list; /**< chunk list head*/
162 pthread_t playback_thread; /**< playback thread*/
163 pthread_mutex_t lock; /**< playback lock*/
164 pthread_cond_t cond; /**< playback cond*/
165 void *user_data; /**< playback userdata, used to send event*/
hualing chen96357e42020-01-16 15:54:12 +0800166 DVR_PlayBackPlayParams_t params; /**< playback playparams,cont vpid vfm apid afmt...*/
167 PlayBack_DeviceSpeeds_t speed; /**< playback speed*/
168 DVR_PlayBackPlayState_t state; /**< playback state*/
169 DVR_PlayBackFlag_t play_flag; /**< playback play flag*/
hualing chen86e7d482020-01-16 15:13:33 +0800170 int is_running; /**< playback htread is runing*/
hualing chen96357e42020-01-16 15:54:12 +0800171 DVR_PlayBackCmdInfo_t cmd; /**< playback cmd*/
hualing chen86e7d482020-01-16 15:13:33 +0800172 int offset; /**< chunk read offset*/
173 Segment_Handle_t r_handle; /**< playback current segment handle*/
hualing chen96357e42020-01-16 15:54:12 +0800174 DVR_PlayBackOpenParams_t openParams; /**< playback openParams*/
hualing chen86e7d482020-01-16 15:13:33 +0800175 DVR_Bool_t has_video; /**< has video playing*/
176 DVR_Bool_t has_audio; /**< has audio playing*/
hualing chenb31a6c62020-01-13 17:27:00 +0800177} Dvr_PlayBack_t;
178
179/**\brief Open an dvr palyback
180 * \param[out] p_handle dvr playback addr
181 * \param[in] params dvr playback open parameters
182 * \retval DVR_SUCCESS On success
183 * \return Error code
184 */
Gong Ke3489c0f2020-01-16 18:11:44 +0800185int dvr_playback_open(DVR_PlaybackHandle_t *p_handle, DVR_PlaybackOpenParams_t *params);
hualing chenb31a6c62020-01-13 17:27:00 +0800186
187/**\brief Close an dvr palyback
188 * \param[in] handle playback handle
189 * \retval DVR_SUCCESS On success
190 * \return Error code
191 */
Gong Ke3489c0f2020-01-16 18:11:44 +0800192int dvr_playback_close(DVR_PlaybackHandle_t handle);
hualing chenb31a6c62020-01-13 17:27:00 +0800193
194
195/**\brief Start play audio and video, used start auido api and start video api
196 * \param[in] handle playback handle
197 * \param[in] params audio playback params,contains fmt and pid...
198 * \retval DVR_SUCCESS On success
199 * \return Error code
200 */
Gong Ke3489c0f2020-01-16 18:11:44 +0800201int dvr_playback_start(DVR_PlaybackHandle_t handle, DVR_PlaybackFlag_t flag);
hualing chenb31a6c62020-01-13 17:27:00 +0800202
203/**\brief dvr play back add chunk info to chunk list
204 * \param[in] handle playback handle
205 * \param[in] info added chunk info,con vpid fmt apid fmt.....
206 * \retval DVR_SUCCESS On success
207 * \return Error code
208 */
hualing chen96357e42020-01-16 15:54:12 +0800209int dvr_playback_add_chunk(DVR_PlayBackHandle_t handle, DVR_PlayBackChunkInfo_t *info);
hualing chenb31a6c62020-01-13 17:27:00 +0800210
211/**\brief dvr play back remove chunk info by chunkid
212 * \param[in] handle playback handle
213 * \param[in] chunkid need removed chunk id
214 * \retval DVR_SUCCESS On success
215 * \return Error code
216 */
hualing chen96357e42020-01-16 15:54:12 +0800217int dvr_playback_remove_chunk(DVR_PlayBackHandle_t handle, int chunkid);
hualing chenb31a6c62020-01-13 17:27:00 +0800218
219/**\brief dvr play back add chunk info
220 * \param[in] handle playback handle
221 * \param[in] info added chunk info,con vpid fmt apid fmt.....
222 * \retval DVR_SUCCESS On success
223 * \return Error code
224 */
hualing chen96357e42020-01-16 15:54:12 +0800225int dvr_playback_Update_Chunk_Flags(DVR_PlayBackHandle_t handle,
hualing chenb31a6c62020-01-13 17:27:00 +0800226 int chunk_id,
hualing chen96357e42020-01-16 15:54:12 +0800227 DVR_PlayBackChunkFlag_t flags);
228/**\brief dvr play back up1date chunk pids
hualing chenb31a6c62020-01-13 17:27:00 +0800229 * if updated chunk is ongoing chunk, we need start new
230 * add pid stream and stop remove pid stream.
231 * \param[in] handle playback handle
232 * \param[in] chunk_id need updated pids chunk id
233 * \retval DVR_SUCCESS On success
234 * \return Error code
235 */
hualing chen96357e42020-01-16 15:54:12 +0800236int dvr_playback_Update_Chunk_Pids(DVR_PlayBackHandle_t handle, int chunkid,
237DVR_PlayBackPids_t *p_pids);
hualing chenb31a6c62020-01-13 17:27:00 +0800238
239/**\brief Stop play, will stop video and audio
240 * \param[in] handle playback handle
241 * \param[in] clear is clear last frame
242 * \retval DVR_SUCCESS On success
243 * \return Error code
244 */
hualing chen96357e42020-01-16 15:54:12 +0800245int dvr_playback_stop(DVR_PlayBackHandle_t handle, DVR_Bool_t clear);
hualing chenb31a6c62020-01-13 17:27:00 +0800246
247/**\brief Start play audio
248 * \param[in] handle playback handle
249 * \param[in] params audio playback params,contains fmt and pid...
250 * \retval DVR_SUCCESS On success
251 * \return Error code
252 */
hualing chen96357e42020-01-16 15:54:12 +0800253int dvr_playback_audio_start(DVR_PlayBackHandle_t handle, PlayBack_DeviceAudioParams_t *param);
hualing chenb31a6c62020-01-13 17:27:00 +0800254
255/**\brief Stop play audio
256 * \param[in] handle playback handle
257 * \retval DVR_SUCCESS On success
258 * \return Error code
259 */
hualing chen96357e42020-01-16 15:54:12 +0800260int dvr_playback_audio_stop(DVR_PlayBackHandle_t handle);
hualing chenb31a6c62020-01-13 17:27:00 +0800261
262/**\brief Start play video
263 * \param[in] handle playback handle
264 * \param[in] params video playback params,contains fmt and pid...
265 * \retval DVR_SUCCESS On success
266 * \return Error code
267 */
hualing chen96357e42020-01-16 15:54:12 +0800268int dvr_playback_video_start(DVR_PlayBackHandle_t handle, PlayBack_DeviceVideoParams_t *param);
hualing chenb31a6c62020-01-13 17:27:00 +0800269
270/**\brief Stop play video
271 * \param[in] handle playback handle
272 * \retval DVR_SUCCESS On success
273 * \return Error code
274 */
hualing chen96357e42020-01-16 15:54:12 +0800275int dvr_playback_video_stop(DVR_PlayBackHandle_t handle);
hualing chenb31a6c62020-01-13 17:27:00 +0800276
277/**\brief Pause play
278 * \param[in] handle playback handle
279 * \param[in] flush whether its internal buffers should be flushed
280 * \retval DVR_SUCCESS On success
281 * \return Error code
282 */
hualing chen96357e42020-01-16 15:54:12 +0800283int dvr_playback_pause(DVR_PlayBackHandle_t handle, DVR_Bool_t flush);
hualing chenb31a6c62020-01-13 17:27:00 +0800284
285
286/**\brief seek
287 * \param[in] handle playback handle
288 * \param[in] time_offset time offset base cur chunk
289 * \retval DVR_SUCCESS On success
290 * \return Error code
291 */
hualing chen96357e42020-01-16 15:54:12 +0800292int dvr_playback_seek(DVR_PlayBackHandle_t handle, int chunk_id, int time_offset);
hualing chenb31a6c62020-01-13 17:27:00 +0800293
294/**\brief Set play speed
295 * \param[in] handle playback handle
296 * \param[in] speed playback speed
297 * \retval DVR_SUCCESS On success
298 * \return Error code
299 */
hualing chen96357e42020-01-16 15:54:12 +0800300int dvr_playback_set_speed(DVR_PlayBackHandle_t handle, PlayBack_DeviceSpeeds_t speed);
hualing chenb31a6c62020-01-13 17:27:00 +0800301
302/**\brief Get playback status
303 * \param[in] handle playback handle
304 * \param[out] p_status playback status
305 * \retval DVR_SUCCESS On success
306 * \return Error code
307 */
hualing chen96357e42020-01-16 15:54:12 +0800308int dvr_playback_get_status(DVR_PlayBackHandle_t handle, DVR_PlayBackStatus_t *p_status);
hualing chenb31a6c62020-01-13 17:27:00 +0800309
310/**\brief Get playback capabilities
311 * \param[out] p_capability playback capability
312 * \retval DVR_SUCCESS On success
313 * \return Error code
314 */
hualing chen96357e42020-01-16 15:54:12 +0800315int dvr_playback_get_capabilities(DVR_PlayBackCapability_t *p_capability);
hualing chenb31a6c62020-01-13 17:27:00 +0800316
317/**\brief dump chunkinfo throw print log
318 * \param[int] handle playback
319 * \param[int] chunk_id if chunk_id > 0, only dump this log. else dump all chunk info
320 * \retval DVR_SUCCESS On success
321 * \return Error code
322 */
hualing chen96357e42020-01-16 15:54:12 +0800323int dvr_dump_chunkinfo(DVR_PlayBackHandle_t handle, int chunk_id);
hualing chenb31a6c62020-01-13 17:27:00 +0800324
325#ifdef __cplusplus
326}
327#endif
328
329#endif /*END DVR_PLAYBACK_H_*/