blob: 25e25edcb1f98659f523573f9d3659511a094092 [file] [log] [blame]
Gong Ke80b8d2a2020-02-04 18:34:35 +08001/**
Gong Ke497c4c22020-03-20 10:15:42 +08002 * \mainpage Amlogic DVR library
3 *
4 * \section Introduction
5 * "libdvr" is a library provides basic DVR functions used by Amlogic platform.
6 * It supports:
7 * \li Record
8 * \li Playback
9 * \li Index file generated
10 * \li Segment split
11 * \li Encrypt and decrypt
Gong Ke497c4c22020-03-20 10:15:42 +080012 *
Gong Ke80b8d2a2020-02-04 18:34:35 +080013 * \file
Gong Ke497c4c22020-03-20 10:15:42 +080014 * \brief libdvr wrapper layer
15 *
16 * Wrapper layer is upper layer of libdvr.
17 * It is on top of dvr_record and dvr_playback.
18 * It supports:
19 * \li Separate record segments automatically.
20 * \li Load segments automatically.
Gong Ke80b8d2a2020-02-04 18:34:35 +080021 */
22
23#ifndef DVR_WRAPPER_H_
24#define DVR_WRAPPER_H_
25
26#include "dvr_types.h"
27#include "dvr_crypto.h"
28#include "dvr_playback.h"
29#include "dvr_record.h"
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/**Record wrapper handle.*/
36typedef void* DVR_WrapperRecord_t;
37/**Playback wrapper handle.*/
38typedef void* DVR_WrapperPlayback_t;
39
Zhiqiang Han2d8cd822020-03-16 13:58:10 +080040typedef void* Playback_DeviceHandle_t;
41
42typedef struct {
43 time_t time; /**< time duration, unit on ms*/
44 loff_t size; /**< size*/
45 uint32_t pkts; /**< number of ts packets*/
46} DVR_WrapperInfo_t;
47
48typedef struct {
49 uint32_t nb_pids; /**< Number of PIDs.*/
50 DVR_StreamPid_t pids[DVR_MAX_RECORD_PIDS_COUNT]; /**< PIDs to be recorded.*/
51} DVR_WrapperPidsInfo_t;
52
53typedef struct {
Zhiqiang Hanaeb0c712020-04-30 15:17:26 +080054 DVR_PlaybackPlayState_t state; /**< DVR playback state*/
55 DVR_WrapperInfo_t info_cur; /**< DVR playback current information*/
Wentao MAe8ba5172022-08-09 11:18:17 +080056 DVR_WrapperInfo_t info_full; /**< DVR playback total(non-obsolete) information*/
Zhiqiang Hanaeb0c712020-04-30 15:17:26 +080057 DVR_PlaybackPids_t pids; /**< DVR playback pids information*/
58 float speed; /**< DVR playback current speed*/
59 DVR_PlaybackSegmentFlag_t flags; /**< DVR playback flags*/
60 DVR_WrapperInfo_t info_obsolete; /**< DVR playback obsolete information, take into account for timeshift*/
hualing chen56c0a162022-01-27 17:01:50 +080061 DVR_WrapperInfo_t disguised_info_obsolete; /**< DVR playback disguised obsolete information, take into account for timeshift*/
Zhiqiang Han2d8cd822020-03-16 13:58:10 +080062} DVR_WrapperPlaybackStatus_t;
63
64typedef struct {
65 DVR_RecordState_t state; /**< DVR record state*/
66 DVR_WrapperInfo_t info; /**< DVR record information*/
67 DVR_WrapperPidsInfo_t pids; /**< DVR record pids info*/
Zhiqiang Hanaeb0c712020-04-30 15:17:26 +080068 DVR_WrapperInfo_t info_obsolete; /**< DVR record obsolete information, take into account for timeshift*/
Zhiqiang Han2d8cd822020-03-16 13:58:10 +080069} DVR_WrapperRecordStatus_t;
70
Gong Ke80b8d2a2020-02-04 18:34:35 +080071/**Record wrapper open parameters.*/
72typedef struct {
Yahui Hance15e9c2020-12-08 18:08:32 +080073 int fend_dev_id; /**< Frontend device's index.*/
Gong Ke80b8d2a2020-02-04 18:34:35 +080074 int dmx_dev_id; /**< Demux device's index.*/
75 char location[DVR_MAX_LOCATION_SIZE]; /**< Location of the record file.*/
76 DVR_Bool_t is_timeshift; /**< The record file is used by timeshift.*/
77 loff_t segment_size; /**< Segment file's size.*/
Zhiqiang Hanaeb0c712020-04-30 15:17:26 +080078 loff_t max_size; /**< Maximum record file size in bytes(for timeshift).*/
79 time_t max_time; /**< Maximum record time in milliseconds(for timeshift).*/
Gong Ke80b8d2a2020-02-04 18:34:35 +080080 DVR_RecordFlag_t flags; /**< Flags.*/
81 DVR_CryptoPeriod_t crypto_period; /**< Crypto period.*/
82 DVR_CryptoFunction_t crypto_fn; /**< Crypto callback function.*/
Yahui Han1fbf3292021-11-08 18:17:19 +080083 void *crypto_data; /**< User data of crypto function.*/
84 uint8_t *clearkey; /**< key for encrypted PVR on FTA.*/
Wentao MAe8ba5172022-08-09 11:18:17 +080085 uint8_t *cleariv; /**< iv for encrypted PVR on FTA.*/
Yahui Han1fbf3292021-11-08 18:17:19 +080086 uint32_t keylen; /**< key/iv length.*/
87 DVR_RecordEventFunction_t event_fn; /**< DVR record event callback function.*/
88 void *event_userdata; /**< DVR event userdata.*/
89 int flush_size; /**< DVR flush size.*/
90 int ringbuf_size; /**< DVR ringbuf size.*/
wentao.ma35a69d42022-03-10 18:08:40 +080091 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*/
Gong Ke80b8d2a2020-02-04 18:34:35 +080092} DVR_WrapperRecordOpenParams_t;
93
Gong Ke80b8d2a2020-02-04 18:34:35 +080094typedef struct {
Zhiqiang Han2d8cd822020-03-16 13:58:10 +080095 DVR_WrapperPidsInfo_t pids_info;
Wentao MAe8ba5172022-08-09 11:18:17 +080096 int save_rec_file; /**< save rec file with same location,default is 0.*/
Gong Ke80b8d2a2020-02-04 18:34:35 +080097} DVR_WrapperRecordStartParams_t;
98
Gong Ke80b8d2a2020-02-04 18:34:35 +080099typedef struct {
100 uint32_t nb_pids; /**< Number of PID actions.*/
101 DVR_StreamPid_t pids[DVR_MAX_RECORD_PIDS_COUNT]; /**< PIDs.*/
102 DVR_RecordPidAction_t pid_action[DVR_MAX_RECORD_PIDS_COUNT]; /**< Actions.*/
103} DVR_WrapperUpdatePidsParams_t;
104
105/**Playback wrapper open parameters.*/
106typedef struct {
107 int dmx_dev_id; /**< playback used dmx device index*/
108 char location[DVR_MAX_LOCATION_SIZE]; /**< Location of the record file.*/
109 int block_size; /**< playback inject block size*/
110 DVR_Bool_t is_timeshift; /**< 0:playback mode, 1 : is timeshift mode*/
111 Playback_DeviceHandle_t playback_handle; /**< Playback device handle.*/
112 DVR_CryptoFunction_t crypto_fn; /**< Crypto function.*/
Yahui Han1fbf3292021-11-08 18:17:19 +0800113 void *crypto_data; /**< Crypto function's user data.*/
114 uint8_t *clearkey; /**< key for encrypted PVR on FTA.*/
Wentao MAe8ba5172022-08-09 11:18:17 +0800115 uint8_t *cleariv; /**< iv for encrypted PVR on FTA.*/
Yahui Han1fbf3292021-11-08 18:17:19 +0800116 uint32_t keylen; /**< key/iv length.*/
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800117 DVR_PlaybackEventFunction_t event_fn; /**< playback event callback function*/
118 void *event_userdata; /**< event userdata*/
hualing chen90b3ae62021-03-30 10:49:28 +0800119 DVR_Bool_t is_notify_time; /**< 0:not notify time, 1 : notify*/
120 DVR_PlaybackVendor_t vendor; /**< vendor type*/
shenghui.gengbec6a462023-01-12 15:21:02 +0800121 DVR_Bool_t control_speed_enable; /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/
Gong Ke80b8d2a2020-02-04 18:34:35 +0800122} DVR_WrapperPlaybackOpenParams_t;
123
124/**
125 * Open a new record wrapper.
126 * \param[out] rec Return the new record handle.
127 * \param params Record open parameters.
128 * \retval DVR_SUCCESS On success.
129 * \return Error code.
130 */
131int dvr_wrapper_open_record (DVR_WrapperRecord_t *rec, DVR_WrapperRecordOpenParams_t *params);
132
133/**
134 * Close an unused record wrapper.
135 * \param rec The record handle.
136 * \retval DVR_SUCCESS On success.
137 * \return Error code.
138 */
139int dvr_wrapper_close_record (DVR_WrapperRecord_t rec);
140
141/**
142 * Start recording.
143 * \param rec The record handle.
144 * \param params Record start parameters.
145 * \retval DVR_SUCCESS On success.
146 * \return Error code.
147 */
148int dvr_wrapper_start_record (DVR_WrapperRecord_t rec, DVR_WrapperRecordStartParams_t *params);
149
150/**
151 * Stop recording..
152 * \param rec The record handle.
153 * \retval DVR_SUCCESS On success.
154 * \return Error code.
155 */
156int dvr_wrapper_stop_record (DVR_WrapperRecord_t rec);
157
158/**
hualing chen03fd4942021-07-15 15:56:41 +0800159 * Pause recording..
160 * \param rec The record handle.
161 * \retval DVR_SUCCESS On success.
162 * \return Error code.
163 */
164int dvr_wrapper_pause_record (DVR_WrapperRecord_t rec);
165
166/**
167 * Resume recording..
168 * \param rec The record handle.
169 * \retval DVR_SUCCESS On success.
170 * \return Error code.
171 */
172int dvr_wrapper_resume_record (DVR_WrapperRecord_t rec);
173
174/**
Gong Ke80b8d2a2020-02-04 18:34:35 +0800175 * Update the recording PIDs.
176 * \param rec The record handle.
177 * \param params The new PIDs.
178 * \retval DVR_SUCCESS On success.
179 * \return Error code.
180 */
181int dvr_wrapper_update_record_pids (DVR_WrapperRecord_t rec, DVR_WrapperUpdatePidsParams_t *params);
182
183/**
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800184 * Get the current recording status.
185 * \param rec The record handle.
186 * \param status The recording status returned.
187 * \retval DVR_SUCCESS On success.
188 * \return Error code.
189 */
190int dvr_wrapper_get_record_status (DVR_WrapperRecord_t rec, DVR_WrapperRecordStatus_t *status);
191
192/**
hualing chen4fe3bee2020-10-23 13:58:52 +0800193 * check record mode is secure or free.
194 * \param rec The record handle.
195 * \retval 1:secure 0: free mode.
196 * \return secure or free.
197 */
198int dvr_wrapper_record_is_secure_mode(DVR_WrapperRecord_t rec);
199
200/**
hualing chen266b9502020-04-04 17:39:39 +0800201 * Set record secure buffer.
202 * \param rec The record handle.
203 * \param p_secure_buf record p_secure_buf addr.
204 * \param len record p_secure_buf len.
205 * \retval DVR_SUCCESS On success.
206 * \return Error code.
207 */
208int dvr_wrapper_set_record_secure_buffer (DVR_WrapperRecord_t rec, uint8_t *p_secure_buf, uint32_t len);
209
210/**
211 * Set record decrypt callback.
212 * \param rec The record handle.
213 * \param func record dec cb.
214 * \param userdata cb user data.
215 * \retval DVR_SUCCESS On success.
216 * \return Error code.
217 */
218int dvr_wrapper_set_record_decrypt_callback (DVR_WrapperRecord_t rec, DVR_CryptoFunction_t func, void *userdata);
219
220/**
Gong Ke80b8d2a2020-02-04 18:34:35 +0800221 * Open a new playback wrapper handle.
222 * \param[out] playback Return the new playback handle.
223 * \param params Playback handle open parameters.
224 * \retval DVR_SUCCESS On success.
225 * \return Error code.
226 */
227int dvr_wrapper_open_playback (DVR_WrapperPlayback_t *playback, DVR_WrapperPlaybackOpenParams_t *params);
228
229/**
230 * Close a unused playback handle.
231 * \param playback The playback handle to be closed.
232 * \retval DVR_SUCCESS On success.
233 * \return Error code.
234 */
235int dvr_wrapper_close_playback (DVR_WrapperPlayback_t playback);
236
237/**
238 * Start playback.
239 * \param playback The playback handle.
240 * \param flags Playback flags.
241 * \retval DVR_SUCCESS On success.
242 * \return Error code.
243 */
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800244int dvr_wrapper_start_playback (DVR_WrapperPlayback_t playback, DVR_PlaybackFlag_t flags, DVR_PlaybackPids_t *p_pids);
Gong Ke80b8d2a2020-02-04 18:34:35 +0800245
246/**
247 * Stop playback.
248 * \param playback The playback handle.
249 * \retval DVR_SUCCESS On success.
250 * \return Error code.
251 */
252int dvr_wrapper_stop_playback (DVR_WrapperPlayback_t playback);
253
254/**
255 * Pause the playback.
256 * \param playback The playback handle.
257 * \retval DVR_SUCCESS On success.
258 * \return Error code.
259 */
260int dvr_wrapper_pause_playback (DVR_WrapperPlayback_t playback);
261
262/**
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800263 * resume the playback.
264 * \param playback The playback handle.
265 * \retval DVR_SUCCESS On success.
266 * \return Error code.
267 */
268int dvr_wrapper_resume_playback (DVR_WrapperPlayback_t playback);
269
270/**
Gong Ke80b8d2a2020-02-04 18:34:35 +0800271 * Set the playback speed.
272 * \param playback The playback handle.
273 * \param speed The new speed.
274 * \retval DVR_SUCCESS On success.
275 * \return Error code.
276 */
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800277int dvr_wrapper_set_playback_speed (DVR_WrapperPlayback_t playback, float speed);
Gong Ke80b8d2a2020-02-04 18:34:35 +0800278
279/**
hualing chen03fd4942021-07-15 15:56:41 +0800280 * set the current playback limit info.
281 * \param playback The playback handle.
282 * \param time The rec time in milliseconds.
283 * \param limit The rec limit time in milliseconds.
284 * \retval DVR_SUCCESS On success.
285 * \return Error code.
286 */
287int dvr_wrapper_setlimit_playback (DVR_WrapperPlayback_t playback, uint64_t time, int32_t limit);
288
289/**
Gong Ke80b8d2a2020-02-04 18:34:35 +0800290 * Seek the current playback position.
291 * \param playback The playback handle.
292 * \param time_offset The current time in milliseconds.
293 * \retval DVR_SUCCESS On success.
294 * \return Error code.
295 */
Zhiqiang Han2d8cd822020-03-16 13:58:10 +0800296int dvr_wrapper_seek_playback (DVR_WrapperPlayback_t playback, uint32_t time_offset);
297
298/**
299 * Get the current playback status.
300 * \param playback The playback handle.
301 * \param status The playback status returned.
302 * \retval DVR_SUCCESS On success.
303 * \return Error code.
304 */
305int dvr_wrapper_get_playback_status (DVR_WrapperPlayback_t playback, DVR_WrapperPlaybackStatus_t *status);
306
307/**
308 * Update playback.
309 * \param playback The playback handle.
310 * \param flags Playback flags.
311 * \retval DVR_SUCCESS On success.
312 * \return Error code.
313 */
314int dvr_wrapper_update_playback (DVR_WrapperPlayback_t playback, DVR_PlaybackPids_t *p_pids);
315
hualing chen266b9502020-04-04 17:39:39 +0800316/**
hualing chena5f03222021-12-02 11:22:35 +0800317 * only Update playback info.
318 * \param playback The playback handle.
319 * \param flags Playback flags.
320 * \retval DVR_SUCCESS On success.
321 * \return Error code.
322 */
323int dvr_wrapper_only_update_playback (DVR_WrapperPlayback_t playback, DVR_PlaybackPids_t *p_pids);
324
325/**
hualing chen266b9502020-04-04 17:39:39 +0800326 * Set playback secure buffer.
327 * \param playback The playback handle.
328 * \param p_secure_buf Playback p_secure_buf addr.
329 * \param len Playback p_secure_buf len.
330 * \retval DVR_SUCCESS On success.
331 * \return Error code.
332 */
333int dvr_wrapper_set_secure_buffer (DVR_WrapperPlayback_t playback, uint8_t *p_secure_buf, uint32_t len);
334
335/**
336 * Set playback decrypt callback.
337 * \param playback The playback handle.
338 * \param func Playback dec cb.
339 * \param userdata cb user data.
340 * \retval DVR_SUCCESS On success.
341 * \return Error code.
342 */
343int dvr_wrapper_set_decrypt_callback (DVR_WrapperPlayback_t playback, DVR_CryptoFunction_t func, void *userdata);
344
Zhiqiang Han620b9252021-11-09 14:23:20 +0800345/**
346 * Delete all info of segment whose location is "*location"
347 * \param[in] location The record of need del file's location
348 * \retval DVR_SUCCESS On success.
349 * \return Error code.
350 */
351int dvr_wrapper_segment_del_by_location (const char *location);
352
353/**
354 * Get the info of segment whose location is "*location"
355 * \param[in] location The record file's location
356 * \retval DVR_SUCCESS On success.
357 * \return Error code.
358 */
359int dvr_wrapper_segment_get_info_by_location (const char *location, DVR_WrapperInfo_t *p_info);
360
hualing chen002e5b92022-02-23 17:51:21 +0800361/**
Wentao MAe8ba5172022-08-09 11:18:17 +0800362 * Stop timeshift.
hualing chen002e5b92022-02-23 17:51:21 +0800363 * \param playback The playback handle.
364 * \retval DVR_SUCCESS On success.
365 * \return Error code.
366 */
367int dvr_wrapper_stop_timeshift (DVR_WrapperPlayback_t playback);
368/**
369 * reStart timeshift.
370 * \param playback The playback handle.
371 * \param flags Playback flags.
372 * \param p_pids playback pids info
373 * \retval DVR_SUCCESS On success.
374 * \return Error code.
375 */
376int dvr_wrapper_restart_timeshift(DVR_WrapperPlayback_t playback, DVR_PlaybackFlag_t flags, DVR_PlaybackPids_t *p_pids);
Gong Ke80b8d2a2020-02-04 18:34:35 +0800377
Wentao MA96f68962022-06-15 19:45:35 +0800378/**
379 * Set log level
380 * \param level Log level, 0: UNKNOWN, 1: DEFAULT, 2:VERBOSE, 3:DEBUG.
381 * 4: INFO, 5: WARN, 6: ERROR, 7: FATAL
382 * \retval DVR_SUCCESS On success.
383 * \return Error code.
384 */
385int dvr_wrapper_set_log_level (int level);
386
Wentao MA5629ad82022-08-24 10:03:02 +0800387/**
388 * Set AC4 audio preselection id for playback
389 * \param playback The playback handle.
390 * \param presel_id AC4 audio preselection id
391 * \retval DVR_SUCCESS On success.
392 * \return Error code.
393 */
394int dvr_wrapper_set_ac4_preselection_id(DVR_WrapperPlayback_t playback, int presel_id);
395
wentao ma7d642782022-10-23 18:26:16 -0700396/**
397 * Set various libdvr properties
398 * \param[in] prop_name property name
399 * \param[in] prop_value property value
400 * \retval DVR_SUCCESS On success.
401 * \return DVR_FAILURE On failure.
402 */
403int dvr_wrapper_property_set(const char* prop_name, const char* prop_value);
404
405/**
406 * Get various libdvr properties
407 * \param[in] prop_name property name
408 * \param[out] prop_value property value. Buffer lifecycle is managed by caller.
409 * \param[in] length buffer length of prop_value
410 * \retval DVR_SUCCESS On success.
411 * \return DVR_FAILURE On failure.
412 */
413int dvr_wrapper_property_get(const char* prop_name, char* prop_value, int length);
414
Zhiqiang Han2f019af2023-08-31 11:12:02 +0800415/**
416 * Control the internal recording logic
417 * \param rec The record handle.
418 * \param cmd control command
419 * \param data control data
420 * \param size size of the control data
421 * \retval DVR_SUCCESS On success.
422 * \return Error code.
423 */
424int dvr_wrapper_ioctl_record(DVR_WrapperRecord_t rec, unsigned int cmd, void *data, size_t size);
425
Gong Ke80b8d2a2020-02-04 18:34:35 +0800426#ifdef __cplusplus
427}
428#endif
429
430#endif /*DVR_WRAPPER_H_*/
431