Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 1 | /** |
| 2 | * \file |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 3 | * \brief Playback module. |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 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 | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 11 | #include "AmTsPlayer.h" |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 12 | #include "dvr_types.h" |
| 13 | #include "dvr_crypto.h" |
Zhiqiang Han | f9c0e27 | 2022-06-14 13:54:03 +0800 | [diff] [blame] | 14 | #include "dvr_mutex.h" |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 15 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 16 | #ifdef __cplusplus |
| 17 | extern "C" { |
| 18 | #endif |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 19 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 20 | /**\brief dvr play segment flag */ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 21 | typedef enum |
| 22 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 23 | DVR_PLAYBACK_SEGMENT_ENCRYPTED = (1 << 0), /**< encrypted stream */ |
| 24 | DVR_PLAYBACK_SEGMENT_DISPLAYABLE = (1 << 1), /**< displayable stream */ |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 25 | DVR_PLAYBACK_SEGMENT_CONTINUOUS = (1 << 2) /**< continuous stream with pre one */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 26 | } DVR_PlaybackSegmentFlag_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 27 | |
| 28 | /**\brief dvr pid type*/ |
| 29 | typedef enum |
| 30 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 31 | DVR_PLAYBACK_SYNC, /**< sync play mode */ |
| 32 | DVR_PLAYBACK_ASYNC /**< out of sync play mode */ |
| 33 | } DVR_PlaybackSyncMode_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 34 | |
| 35 | |
| 36 | /**\brief dvr play pids */ |
| 37 | typedef struct |
| 38 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 39 | DVR_StreamInfo_t video; /**< Video.*/ |
| 40 | DVR_StreamInfo_t audio; /**< Audio.*/ |
| 41 | DVR_StreamInfo_t ad; /**< AD.*/ |
| 42 | DVR_StreamInfo_t subtitle; /**< Subtitle.*/ |
| 43 | DVR_StreamInfo_t pcr; /**< PCR.*/ |
| 44 | } DVR_PlaybackPids_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 45 | |
hualing chen | 1679f81 | 2021-11-08 15:17:46 +0800 | [diff] [blame] | 46 | /**\brief dvr play pids */ |
| 47 | typedef struct |
| 48 | { |
| 49 | DVR_PlaybackPids_t pids; /**< Video.*/ |
| 50 | int av_scale; |
| 51 | } DVR_Playback_info_t; |
| 52 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 53 | /**\brief dvr segments info */ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 54 | typedef struct |
| 55 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 56 | struct list_head head; /**< Segment node.*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 57 | uint64_t segment_id; /**< Segment's index.*/ |
| 58 | char location[DVR_MAX_LOCATION_SIZE]; /**< chunk location */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 59 | DVR_PlaybackPids_t pids; /**< Streams' PIDs.*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 60 | DVR_PlaybackSegmentFlag_t flags; /**< Segment's flag */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 61 | int key_data_id; /**< ??? */ |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 62 | int duration; /**< Segment dur time ms*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 63 | } DVR_PlaybackSegmentInfo_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 64 | |
| 65 | /**\brief play flag, if set this flag, player need pause when decode first frame */ |
| 66 | typedef enum |
| 67 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 68 | DVR_PLAYBACK_STARTED_PAUSEDLIVE = (1 << 0) /**< dvr play stat,need change to pause state if set */ |
| 69 | } DVR_PlaybackFlag_t; |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 70 | |
| 71 | /**\brief playback speed mode*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 72 | typedef enum |
| 73 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 74 | DVR_PLAYBACK_FAST_FORWARD = 0, /**< fast forward */ |
| 75 | DVR_PLAYBACK_FAST_BACKWARD = 1, /**< fast backward */ |
hualing chen | 3114087 | 2020-03-25 12:29:26 +0800 | [diff] [blame] | 76 | DVR_PLAYBACK_KERNEL_SUPPORT = 2, /**< kernel support mode */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 77 | } DVR_PlaybackSpeedMode_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 78 | |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 79 | /**\brief playback speed*/ |
| 80 | typedef enum |
| 81 | { |
hualing chen | e41f437 | 2020-06-06 16:29:17 +0800 | [diff] [blame] | 82 | PLAYBACK_SPEED_FBX1 = -100, /**<FB X 1 speed*/ |
hualing chen | a540a7e | 2020-03-27 16:44:05 +0800 | [diff] [blame] | 83 | PLAYBACK_SPEED_FBX2 = -200, /**<FB X 2 speed*/ |
| 84 | PLAYBACK_SPEED_FBX4 = -400, /**<FB X 4 speed*/ |
| 85 | PLAYBACK_SPEED_FBX8 = -800, /**<FB X 8 speed*/ |
hualing chen | 041c409 | 2020-04-05 15:11:50 +0800 | [diff] [blame] | 86 | PLAYBACK_SPEED_FBX12 = -1200, /**< FB 12 speed*/ |
| 87 | PLAYBACK_SPEED_FBX16 = -1600, /**<FB X 16 speed*/ |
| 88 | PLAYBACK_SPEED_FBX32 = -3200, /**<FB X 32 speed*/ |
| 89 | PLAYBACK_SPEED_FBX48 = -4800, /**<FB X 48 speed*/ |
| 90 | PLAYBACK_SPEED_FBX64 = -6400, /**<FB X 64 speed*/ |
| 91 | PLAYBACK_SPEED_FBX128 = -12800, /**<FB X 128 speed*/ |
hualing chen | a540a7e | 2020-03-27 16:44:05 +0800 | [diff] [blame] | 92 | PLAYBACK_SPEED_S8 = 12, /**<slow 1/8 speed*/ |
| 93 | PLAYBACK_SPEED_S4 = 25, /**<slow 1/4 speed*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 94 | PLAYBACK_SPEED_S2 = 50, /**<slow 1/2 speed*/ |
| 95 | PLAYBACK_SPEED_X1 = 100, /**< X 1 normal speed*/ |
| 96 | PLAYBACK_SPEED_X2 = 200, /**< X 2 speed*/ |
hualing chen | a540a7e | 2020-03-27 16:44:05 +0800 | [diff] [blame] | 97 | PLAYBACK_SPEED_X3 = 300, /**< X 3 speed*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 98 | PLAYBACK_SPEED_X4 = 400, /**< X 4 speed*/ |
hualing chen | a540a7e | 2020-03-27 16:44:05 +0800 | [diff] [blame] | 99 | PLAYBACK_SPEED_X5 = 500, /**< X 5 speed*/ |
| 100 | PLAYBACK_SPEED_X6 = 600, /**< X 6 speed*/ |
| 101 | PLAYBACK_SPEED_X7 = 700, /**< X 7 speed*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 102 | PLAYBACK_SPEED_X8 = 800, /**< X 8 speed*/ |
hualing chen | 041c409 | 2020-04-05 15:11:50 +0800 | [diff] [blame] | 103 | PLAYBACK_SPEED_X12 = 1200, /**< X 12 speed*/ |
| 104 | PLAYBACK_SPEED_X16 = 1600, /**< X 16 speed*/ |
| 105 | PLAYBACK_SPEED_X32 = 3200, /**< X 32 speed*/ |
| 106 | PLAYBACK_SPEED_X48 = 4800, /**< X 48 speed*/ |
| 107 | PLAYBACK_SPEED_X64 = 6400, /**< X 64 speed*/ |
| 108 | PLAYBACK_SPEED_X128 = 12800, /**< X 128 speed*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 109 | PlayBack_Speed_MAX, |
| 110 | } Playback_SpeedValue_t; |
| 111 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 112 | /**\brief playback speed*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 113 | typedef struct Playback_Speeds_s { |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 114 | int speed; /**< playback speed value*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 115 | } Playback_Speeds_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 116 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 117 | /**\brief playback play speed*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 118 | typedef struct |
| 119 | { |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 120 | Playback_Speeds_t speed; /**< playback speed */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 121 | DVR_PlaybackSpeedMode_t mode; /**< playback 0: fast forword or 1: fast backword*/ |
| 122 | } DVR_PlaybackSpeed_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 123 | |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 124 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 125 | /**Maximum supported speed modes.*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 126 | #define DVR_MAX_SUPPORTED_SPEEDS 32 |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 127 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 128 | /**\brief playback capability*/ |
| 129 | typedef struct |
| 130 | { |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 131 | int nb_supported_speeds; /**< support playback speed count*/ |
| 132 | int supported_speeds[DVR_MAX_SUPPORTED_SPEEDS]; /**< support playback speed*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 133 | } DVR_PlaybackCapability_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 134 | |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 135 | /**Playback handle.*/ |
| 136 | typedef void* DVR_PlaybackHandle_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 137 | |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 138 | |
| 139 | /**\brief playback error reason*/ |
| 140 | typedef enum |
| 141 | { |
| 142 | DVR_PLAYBACK_PID_ERROR, /**< uninit state */ |
Wentao MA | 9a16400 | 2022-08-29 11:20:24 +0800 | [diff] [blame] | 143 | DVR_PLAYBACK_FMT_ERROR /**< fmt not support backword */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 144 | } DVR_PlaybackError_t; |
| 145 | |
| 146 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 147 | /**\brief playback play state*/ |
| 148 | typedef enum |
| 149 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 150 | DVR_PLAYBACK_STATE_START, /**< start play */ |
| 151 | DVR_PLAYBACK_STATE_STOP, /**< stop */ |
| 152 | DVR_PLAYBACK_STATE_PAUSE, /**< pause */ |
| 153 | DVR_PLAYBACK_STATE_FF, /**< fast forward */ |
| 154 | DVR_PLAYBACK_STATE_FB /**< fast backword */ |
| 155 | } DVR_PlaybackPlayState_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 156 | |
| 157 | /**\brief playback play status*/ |
| 158 | typedef struct |
| 159 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 160 | DVR_PlaybackPlayState_t state; /**< playback play state */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 161 | uint64_t segment_id; /**< playback ongoing segment index */ |
Wentao MA | ac5ea06 | 2022-08-11 11:44:27 +0800 | [diff] [blame] | 162 | int32_t time_cur; /**< current playback time position in ms of a segment. |
| 163 | It can be a negative value to refer to relative time |
| 164 | position of previous segment*/ |
| 165 | int32_t time_end; /**< end time position of a segment in ms */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 166 | DVR_PlaybackPids_t pids; /**< playback played pids */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 167 | int speed; /**< playback speed */ |
| 168 | DVR_PlaybackSegmentFlag_t flags; /**< playback played segment flag */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 169 | } DVR_PlaybackStatus_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 170 | |
hualing chen | fbf8e02 | 2020-06-15 13:43:11 +0800 | [diff] [blame] | 171 | /**\brief DVR playback vendor*/ |
| 172 | typedef enum { |
Wentao MA | 292380e | 2022-12-14 14:46:19 +0800 | [diff] [blame] | 173 | DVR_PLAYBACK_VENDOR_DEF, /**< default, for Irdeto*/ |
hualing chen | 90b3ae6 | 2021-03-30 10:49:28 +0800 | [diff] [blame] | 174 | DVR_PLAYBACK_VENDOR_AML, /**< aml*/ |
| 175 | DVR_PLAYBACK_VENDOR_AMAZON /**< amazon*/ |
hualing chen | fbf8e02 | 2020-06-15 13:43:11 +0800 | [diff] [blame] | 176 | } DVR_PlaybackVendor_t; |
| 177 | |
| 178 | |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 179 | /**\brief DVR playback event*/ |
| 180 | typedef enum { |
| 181 | DVR_PLAYBACK_EVENT_ERROR = 0x1000, /**< Signal a critical playback error*/ |
| 182 | DVR_PLAYBACK_EVENT_TRANSITION_OK , /**< transition ok*/ |
| 183 | DVR_PLAYBACK_EVENT_TRANSITION_FAILED, /**< transition failed*/ |
| 184 | DVR_PLAYBACK_EVENT_KEY_FAILURE, /**< key failure*/ |
| 185 | DVR_PLAYBACK_EVENT_NO_KEY, /**< no key*/ |
| 186 | DVR_PLAYBACK_EVENT_REACHED_BEGIN , /**< reached begin*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 187 | DVR_PLAYBACK_EVENT_REACHED_END, /**< reached end*/ |
Wentao MA | 270dc0f | 2022-08-23 13:17:26 +0800 | [diff] [blame] | 188 | DVR_PLAYBACK_EVENT_NOTIFY_PLAYTIME, /**< notify play cur segment time ms*/ |
hualing chen | e3797f0 | 2021-01-13 14:53:28 +0800 | [diff] [blame] | 189 | DVR_PLAYBACK_EVENT_FIRST_FRAME, /**< first frame*/ |
| 190 | DVR_PLAYBACK_EVENT_NODATA, /**< no data*/ |
Wentao MA | 9e31f69 | 2023-09-26 17:42:18 +0800 | [diff] [blame] | 191 | DVR_PLAYBACK_EVENT_DATARESUME, /**< data resume*/ |
| 192 | DVR_PLAYBACK_EVENT_TIMESHIFT_FR_REACHED_BEGIN, |
| 193 | DVR_PLAYBACK_EVENT_TIMESHIFT_FF_REACHED_END, |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 194 | } DVR_PlaybackEvent_t; |
| 195 | |
| 196 | /**\brief DVR playback event notify function*/ |
| 197 | typedef struct |
| 198 | { |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 199 | DVR_PlaybackEvent_t event; /**< event type*/ |
| 200 | DVR_PlaybackStatus_t play_status; /**< play status*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 201 | union |
| 202 | { |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 203 | uint8_t unused; |
| 204 | uint8_t error_reason;/**< error reason*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 205 | struct |
| 206 | { |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 207 | uint64_t segment_id; /**< error segment id*/ |
| 208 | uint32_t key_data_id; /**< key data id*/ |
| 209 | uint8_t error; /**< error*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 210 | } transition_failed_data; |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 211 | } info; /**< information*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 212 | } DVR_Play_Notify_t; |
| 213 | |
| 214 | /**\brief DVR playback event notify function*/ |
| 215 | typedef DVR_Result_t (*DVR_PlaybackEventFunction_t) (DVR_PlaybackEvent_t event, void *params, void *userdata); |
| 216 | |
| 217 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 218 | /**\brief playback open params*/ |
| 219 | typedef struct |
| 220 | { |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 221 | int dmx_dev_id; /**< playback used dmx device index*/ |
| 222 | int block_size; /**< playback inject block size*/ |
| 223 | DVR_Bool_t is_timeshift; /**< 0:playback mode, 1 : is timeshift mode*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 224 | am_tsplayer_handle player_handle; /**< am tsplayer handle.*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 225 | DVR_CryptoFunction_t crypto_fn; /**< Crypto function.*/ |
Yahui Han | 1fbf329 | 2021-11-08 18:17:19 +0800 | [diff] [blame] | 226 | void *crypto_data; /**< Crypto function's user data.*/ |
| 227 | uint8_t *clearkey; /**< key for encrypted PVR on FTA.*/ |
Wentao MA | e8ba517 | 2022-08-09 11:18:17 +0800 | [diff] [blame] | 228 | uint8_t *cleariv; /**< iv for encrypted PVR on FTA.*/ |
Yahui Han | 1fbf329 | 2021-11-08 18:17:19 +0800 | [diff] [blame] | 229 | uint32_t keylen; /**< key/iv length.*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 230 | DVR_Bool_t has_pids; /**< has video audo pid fmt info*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 231 | DVR_PlaybackEventFunction_t event_fn; /**< playback event callback function*/ |
| 232 | void *event_userdata; /**< event userdata*/ |
hualing chen | fbf8e02 | 2020-06-15 13:43:11 +0800 | [diff] [blame] | 233 | DVR_PlaybackVendor_t vendor; /**< vendor type,default is 0*/ |
hualing chen | e3797f0 | 2021-01-13 14:53:28 +0800 | [diff] [blame] | 234 | DVR_Bool_t is_notify_time; /**< notify play time info true or not*/ |
shenghui.geng | bec6a46 | 2023-01-12 15:21:02 +0800 | [diff] [blame] | 235 | DVR_Bool_t control_speed_enable; /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 236 | } DVR_PlaybackOpenParams_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 237 | |
| 238 | /**\brief playback play state*/ |
| 239 | typedef enum |
| 240 | { |
Zhiqiang Han | 8392364 | 2023-11-03 12:06:48 +0800 | [diff] [blame] | 241 | /*Bit order to check: |
| 242 | stop > start, |
| 243 | */ |
| 244 | DVR_PLAYBACK_CMD_V_START = 0x0001, /**< v start */ |
| 245 | DVR_PLAYBACK_CMD_V_STOP = 0x0002, /**< v stop */ |
| 246 | DVR_PLAYBACK_CMD_A_START = 0x0100, /**< a start */ |
| 247 | DVR_PLAYBACK_CMD_A_STOP = 0x0200, /**< a stop */ |
| 248 | DVR_PLAYBACK_CMD_V_RESTART = (DVR_PLAYBACK_CMD_V_STOP | DVR_PLAYBACK_CMD_V_START ), /**< v restart */ |
| 249 | DVR_PLAYBACK_CMD_A_RESTART = (DVR_PLAYBACK_CMD_A_STOP | DVR_PLAYBACK_CMD_A_START ), /**< a restart */ |
| 250 | DVR_PLAYBACK_CMD_V_STOP_A_START = (DVR_PLAYBACK_CMD_V_STOP | DVR_PLAYBACK_CMD_A_START ), /**< v stop a start*/ |
| 251 | DVR_PLAYBACK_CMD_A_STOP_V_START = (DVR_PLAYBACK_CMD_A_STOP | DVR_PLAYBACK_CMD_V_START ), /**< a stop v_start */ |
| 252 | DVR_PLAYBACK_CMD_V_STOP_A_RESTART = (DVR_PLAYBACK_CMD_V_STOP | DVR_PLAYBACK_CMD_A_RESTART), /**<v stop a restart*/ |
| 253 | DVR_PLAYBACK_CMD_A_STOP_V_RESTART = (DVR_PLAYBACK_CMD_A_STOP | DVR_PLAYBACK_CMD_V_RESTART), /**<a stop v restart*/ |
| 254 | DVR_PLAYBACK_CMD_V_START_A_RESTART = (DVR_PLAYBACK_CMD_V_START | DVR_PLAYBACK_CMD_A_RESTART), /**<v start a restart*/ |
| 255 | DVR_PLAYBACK_CMD_A_START_V_RESTART = (DVR_PLAYBACK_CMD_A_START | DVR_PLAYBACK_CMD_V_RESTART), /**<a start v restart*/ |
| 256 | DVR_PLAYBACK_CMD_AV_RESTART = (DVR_PLAYBACK_CMD_A_RESTART | DVR_PLAYBACK_CMD_V_RESTART), /**< av restart */ |
| 257 | DVR_PLAYBACK_CMD_START = (DVR_PLAYBACK_CMD_V_START | DVR_PLAYBACK_CMD_A_START ), /**< start av */ |
| 258 | DVR_PLAYBACK_CMD_STOP = (DVR_PLAYBACK_CMD_V_STOP | DVR_PLAYBACK_CMD_A_STOP ), /**< stop av */ |
| 259 | |
| 260 | #define DVR_PLAYBACK_CMD_RESET_V(_c) ((_c) & (~0xFF)) |
| 261 | #define DVR_PLAYBACK_CMD_RESET_A(_c) ((_c) & (~0xFF00)) |
| 262 | |
| 263 | #define DVR_PLAYBACK_CMD_IS_RESTART(_c) ((_c) == 0x03) |
| 264 | #define DVR_PLAYBACK_CMD_IS_STOP(_c) ((_c) & 0x02) |
| 265 | #define DVR_PLAYBACK_CMD_IS_START(_c) ((_c) & 0x01) |
| 266 | |
| 267 | #define DVR_PLAYBACK_CMD_GET_V_CMD(_c) ((_c) & 0xFF) |
| 268 | #define DVR_PLAYBACK_CMD_GET_A_CMD(_c) (((_c) & 0xFF00) >> 8) |
| 269 | |
| 270 | #define DVR_PLAYBACK_CMD_IS_V_RESTART(_c) DVR_PLAYBACK_CMD_IS_RESTART(DVR_PLAYBACK_CMD_GET_V_CMD(_c)) |
| 271 | #define DVR_PLAYBACK_CMD_IS_A_RESTART(_c) DVR_PLAYBACK_CMD_IS_RESTART(DVR_PLAYBACK_CMD_GET_A_CMD(_c)) |
| 272 | |
| 273 | #define DVR_PLAYBACK_CMD_IS_V_STOP(_c) DVR_PLAYBACK_CMD_IS_STOP(DVR_PLAYBACK_CMD_GET_V_CMD(_c)) |
| 274 | #define DVR_PLAYBACK_CMD_IS_A_STOP(_c) DVR_PLAYBACK_CMD_IS_STOP(DVR_PLAYBACK_CMD_GET_A_CMD(_c)) |
| 275 | |
| 276 | #define DVR_PLAYBACK_CMD_IS_V_START(_c) DVR_PLAYBACK_CMD_IS_START(DVR_PLAYBACK_CMD_GET_V_CMD(_c)) |
| 277 | #define DVR_PLAYBACK_CMD_IS_A_START(_c) DVR_PLAYBACK_CMD_IS_START(DVR_PLAYBACK_CMD_GET_A_CMD(_c)) |
| 278 | |
| 279 | DVR_PLAYBACK_CMD_PAUSE = 0x10000, /**< pause */ |
| 280 | DVR_PLAYBACK_CMD_RESUME = 0x20000, /**< resume */ |
| 281 | DVR_PLAYBACK_CMD_SEEK = 0x40000, /**< seek */ |
| 282 | DVR_PLAYBACK_CMD_FF = 0x100000, /**< fast forward */ |
| 283 | DVR_PLAYBACK_CMD_FB = 0x200000, /**< fast backword */ |
| 284 | DVR_PLAYBACK_CMD_NONE = 0, /**< none */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 285 | } DVR_PlaybackCmd_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 286 | |
| 287 | |
| 288 | /**\brief playback struct*/ |
| 289 | typedef struct |
| 290 | { |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 291 | DVR_PlaybackSpeed_t speed; /**< play speed */ |
| 292 | DVR_PlaybackPlayState_t state; /**< play state */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 293 | DVR_PlaybackCmd_t cur_cmd; /**< cur send cmd */ |
| 294 | DVR_PlaybackCmd_t last_cmd; /**< last cmd */ |
| 295 | int pos; /**< seek pos at cur segment*/ |
| 296 | } DVR_PlaybackCmdInfo_t; |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 297 | |
hualing chen | d241c7a | 2021-06-22 13:34:27 +0800 | [diff] [blame] | 298 | /**\brief playback struct*/ |
| 299 | typedef struct |
| 300 | { |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 301 | uint32_t sys_dur; /**< system duration */ |
| 302 | uint32_t sys_sta; /**< system start time */ |
wentao.ma | fdba9a0 | 2023-01-17 16:43:26 +0800 | [diff] [blame] | 303 | int32_t ply_dur; /**< play duration */ |
| 304 | int32_t ply_sta; /**< play start time */ |
hualing chen | d241c7a | 2021-06-22 13:34:27 +0800 | [diff] [blame] | 305 | } DVR_PlaybackConSpe_t; |
| 306 | |
| 307 | |
pengfei.liu | 07ddc8a | 2020-03-24 23:36:53 +0800 | [diff] [blame] | 308 | /**\brief DVR playback decrypt function*/ |
| 309 | typedef DVR_Result_t (*DVR_PlaybackDecryptFunction_t) (uint8_t *p_in, |
| 310 | uint32_t in_len, |
| 311 | uint8_t *p_out, |
| 312 | uint32_t *p_out_len, |
| 313 | void *userdata); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 314 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 315 | /**\cond */ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 316 | /**\brief playback struct*/ |
| 317 | typedef struct |
| 318 | { |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 319 | am_tsplayer_handle handle; /**< tsplayer handle */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 320 | DVR_Bool_t segment_is_open; /**<segment is opend*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 321 | uint64_t cur_segment_id; /**< Current segment id*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 322 | DVR_PlaybackSegmentInfo_t cur_segment; /**< Current playing segment*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 323 | uint64_t last_segment_id; /**< last segment id*/ |
| 324 | DVR_PlaybackSegmentInfo_t last_segment; /**< last playing segment*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 325 | struct list_head segment_list; /**< segment list head*/ |
| 326 | pthread_t playback_thread; /**< playback thread*/ |
Zhiqiang Han | f9c0e27 | 2022-06-14 13:54:03 +0800 | [diff] [blame] | 327 | dvr_mutex_t lock; /**< playback lock*/ |
hualing chen | 2aba402 | 2020-03-02 13:49:55 +0800 | [diff] [blame] | 328 | pthread_mutex_t segment_lock; /**< playback segment lock*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 329 | pthread_cond_t cond; /**< playback cond*/ |
| 330 | void *user_data; /**< playback userdata, used to send event*/ |
hualing chen | 6d24aa9 | 2020-03-23 18:43:47 +0800 | [diff] [blame] | 331 | float speed; /**< playback speed*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 332 | DVR_PlaybackPlayState_t state; /**< playback state*/ |
| 333 | DVR_PlaybackFlag_t play_flag; /**< playback play flag*/ |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 334 | int is_running; /**< playback htread is runing*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 335 | DVR_PlaybackCmdInfo_t cmd; /**< playback cmd*/ |
| 336 | int offset; /**< segment read offset*/ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 337 | uint32_t dur; /**< segment dur*/ |
Wentao MA | f35c388 | 2023-04-17 12:36:19 +0800 | [diff] [blame] | 338 | Segment_Handle_t segment_handle; /**< playback current segment handle*/ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 339 | DVR_PlaybackOpenParams_t openParams; /**< playback openParams*/ |
hualing chen | 86e7d48 | 2020-01-16 15:13:33 +0800 | [diff] [blame] | 340 | DVR_Bool_t has_video; /**< has video playing*/ |
| 341 | DVR_Bool_t has_audio; /**< has audio playing*/ |
hualing chen | df118dd | 2020-05-21 15:49:11 +0800 | [diff] [blame] | 342 | DVR_Bool_t has_ad_audio; /**< has ad audio playing*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 343 | DVR_Bool_t has_pids; /**< has video audo pid fmt info*/ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 344 | uint32_t fffb_start; /**< fffb start time ms*/ |
| 345 | uint32_t fffb_current; /**< fffb current time*/ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 346 | int fffb_start_pcr; /**< fffb start pcr time*/ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 347 | uint32_t next_fffb_time;/**< fffb start pcr time*/ |
hualing chen | a540a7e | 2020-03-27 16:44:05 +0800 | [diff] [blame] | 348 | int seek_time;/**< fffb start pcr time*/ |
| 349 | event_callback player_callback_func;/**< tsplayer cb*/ |
| 350 | void *player_callback_userdata;/**< tsplayer cb data*/ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 351 | uint32_t send_time;/**< send event time*/ |
pengfei.liu | 27cc4ec | 2020-04-03 16:28:16 +0800 | [diff] [blame] | 352 | int first_frame;/**< show first frame*/ |
| 353 | DVR_CryptoFunction_t dec_func; /**< Decrypt function*/ |
| 354 | void *dec_userdata; /**< Decrypt userdata*/ |
Yahui Han | 1fbf329 | 2021-11-08 18:17:19 +0800 | [diff] [blame] | 355 | void *cryptor; /**< Cryptor for encrypted PVR on FTA.*/ |
pengfei.liu | 27cc4ec | 2020-04-03 16:28:16 +0800 | [diff] [blame] | 356 | int is_secure_mode; /**< Playback session run in secure pipeline */ |
| 357 | uint8_t *secure_buffer; /* Playback session secure buffer */ |
| 358 | uint32_t secure_buffer_size; /* Playback session secure buffer size */ |
hualing chen | 266b950 | 2020-04-04 17:39:39 +0800 | [diff] [blame] | 359 | DVR_Bool_t drop_ts; |
hualing chen | 4b7c15d | 2020-04-07 16:13:48 +0800 | [diff] [blame] | 360 | DVR_Bool_t fffb_play; |
| 361 | int32_t last_cur_time; |
| 362 | uint64_t last_send_time_id; |
hualing chen | 5605eed | 2020-05-26 18:18:06 +0800 | [diff] [blame] | 363 | int ts_cache_len; |
hualing chen | e41f437 | 2020-06-06 16:29:17 +0800 | [diff] [blame] | 364 | DVR_Bool_t first_trans_ok; |
hualing chen | fbf8e02 | 2020-06-15 13:43:11 +0800 | [diff] [blame] | 365 | DVR_PlaybackVendor_t vendor; |
hualing chen | e3797f0 | 2021-01-13 14:53:28 +0800 | [diff] [blame] | 366 | int noData; |
hualing chen | a5f0322 | 2021-12-02 11:22:35 +0800 | [diff] [blame] | 367 | DVR_Bool_t seek_pause; /**<set true when user call seek at pause state,we will start inject data, if first frame is got,set false and stop inject data*/ |
Wentao MA | 270dc0f | 2022-08-23 13:17:26 +0800 | [diff] [blame] | 368 | int last_segment_total; /**< last segment total time*/ |
hualing chen | 969fe7b | 2021-05-26 15:13:17 +0800 | [diff] [blame] | 369 | |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 370 | DVR_PlaybackConSpe_t con_spe; /**< inject data speed info*/ |
| 371 | |
| 372 | //limit info |
| 373 | int obsolete; /**< rec obsolete time in ms*/ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 374 | uint32_t rec_start; /**< rec start time in ms*/ |
| 375 | uint32_t limit; /**< rec data limit time in ms*/ |
hualing chen | 8a657f3 | 2021-08-30 13:12:49 +0800 | [diff] [blame] | 376 | //first play need seek to start time |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 377 | uint32_t first_start_time; |
Wentao MA | 01de0e6 | 2022-01-10 18:48:23 +0800 | [diff] [blame] | 378 | //The segment id where a playback is initially started |
| 379 | uint64_t first_start_id; |
Wentao MA | a0b9c00 | 2022-11-10 17:47:27 +0800 | [diff] [blame] | 380 | |
| 381 | // Tells whether the delay from AmTsPlayer_getDelayTime is valid. |
| 382 | // Notice it can be invalid in a short period at starting phase of a playback. |
| 383 | DVR_Bool_t delay_is_effective; |
| 384 | |
hualing chen | 8a657f3 | 2021-08-30 13:12:49 +0800 | [diff] [blame] | 385 | DVR_Bool_t need_seek_start; |
hualing chen | a5f0322 | 2021-12-02 11:22:35 +0800 | [diff] [blame] | 386 | //init fake pid |
| 387 | int fake_pid; |
Wentao MA | 5629ad8 | 2022-08-24 10:03:02 +0800 | [diff] [blame] | 388 | //Audio presentation id, used for dolby AC4 audio |
| 389 | int32_t audio_presentation_id; |
shenghui.geng | bec6a46 | 2023-01-12 15:21:02 +0800 | [diff] [blame] | 390 | |
| 391 | /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/ |
| 392 | DVR_Bool_t control_speed_enable; |
Zhiqiang Han | d5c1c04 | 2024-09-14 14:32:28 +0800 | [diff] [blame] | 393 | DVR_Bool_t control_speed_enable_user; |
| 394 | DVR_Bool_t control_speed_enable_last; |
| 395 | |
| 396 | int fake_mode; |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 397 | } DVR_Playback_t; |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 398 | /**\endcond*/ |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 399 | |
| 400 | /**\brief Open an dvr palyback |
| 401 | * \param[out] p_handle dvr playback addr |
| 402 | * \param[in] params dvr playback open parameters |
| 403 | * \retval DVR_SUCCESS On success |
| 404 | * \return Error code |
| 405 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 406 | 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] | 407 | |
| 408 | /**\brief Close an dvr palyback |
| 409 | * \param[in] handle playback handle |
| 410 | * \retval DVR_SUCCESS On success |
| 411 | * \return Error code |
| 412 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 413 | int dvr_playback_close(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 414 | |
| 415 | |
Wentao MA | 270dc0f | 2022-08-23 13:17:26 +0800 | [diff] [blame] | 416 | /**\brief Start play audio and video, used start audio api and start video api |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 417 | * \param[in] handle playback handle |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 418 | * \param[in] flag playback flag |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 419 | * \retval DVR_SUCCESS On success |
| 420 | * \return Error code |
| 421 | */ |
Gong Ke | 3489c0f | 2020-01-16 18:11:44 +0800 | [diff] [blame] | 422 | int dvr_playback_start(DVR_PlaybackHandle_t handle, DVR_PlaybackFlag_t flag); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 423 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 424 | /**\brief dvr play back add segment info to segment list |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 425 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 426 | * \param[in] info added segment info,con vpid fmt apid fmt..... |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 427 | * \retval DVR_SUCCESS On success |
| 428 | * \return Error code |
| 429 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 430 | 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] | 431 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 432 | /**\brief dvr play back remove segment info by segmentkid |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 433 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 434 | * \param[in] segmentid need removed segment id |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 435 | * \retval DVR_SUCCESS On success |
| 436 | * \return Error code |
| 437 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 438 | int dvr_playback_remove_segment(DVR_PlaybackHandle_t handle, uint64_t segmentid); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 439 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 440 | /**\brief dvr play back add segment info |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 441 | * \param[in] handle playback handle |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 442 | * \param[in] segment_id the segment's index |
| 443 | * \param[in] flags the segment's flags |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 444 | * \retval DVR_SUCCESS On success |
| 445 | * \return Error code |
| 446 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 447 | int dvr_playback_update_segment_flags(DVR_PlaybackHandle_t handle, |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 448 | uint64_t segment_id, |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 449 | DVR_PlaybackSegmentFlag_t flags); |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 450 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 451 | /**\brief dvr play back up1date segment pids |
| 452 | * if updated segment is ongoing segment, we need start new |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 453 | * add pid stream and stop remove pid stream. |
| 454 | * \param[in] handle playback handle |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 455 | * \param[in] segment_id need updated pids segment id |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 456 | * \param[in] p_pids the new PIDs |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 457 | * \retval DVR_SUCCESS On success |
| 458 | * \return Error code |
| 459 | */ |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 460 | int dvr_playback_update_segment_pids(DVR_PlaybackHandle_t handle, uint64_t segment_id, |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 461 | DVR_PlaybackPids_t *p_pids); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 462 | |
hualing chen | a5f0322 | 2021-12-02 11:22:35 +0800 | [diff] [blame] | 463 | /**\brief dvr play back only up1date segment pids |
| 464 | * only update segment info, not stop start codec. |
| 465 | * \param[in] handle playback handle |
| 466 | * \param[in] segment_id need updated pids segment id |
| 467 | * \param[in] p_pids the new PIDs |
| 468 | * \retval DVR_SUCCESS On success |
| 469 | * \return Error code |
| 470 | */ |
| 471 | int dvr_playback_only_update_segment_pids(DVR_PlaybackHandle_t handle, uint64_t segment_id, DVR_PlaybackPids_t *p_pids); |
| 472 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 473 | /**\brief Stop playing, will stop video and audio |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 474 | * \param[in] handle playback handle |
| 475 | * \param[in] clear is clear last frame |
| 476 | * \retval DVR_SUCCESS On success |
| 477 | * \return Error code |
| 478 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 479 | int dvr_playback_stop(DVR_PlaybackHandle_t handle, DVR_Bool_t clear); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 480 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 481 | /**\brief Start audio playing |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 482 | * \param[in] handle playback handle |
| 483 | * \param[in] params audio playback params,contains fmt and pid... |
Wentao MA | 270dc0f | 2022-08-23 13:17:26 +0800 | [diff] [blame] | 484 | * \param[in] ad_params ad audio playback params,contains fmt and pid... |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 485 | * \retval DVR_SUCCESS On success |
| 486 | * \return Error code |
| 487 | */ |
Wentao MA | 270dc0f | 2022-08-23 13:17:26 +0800 | [diff] [blame] | 488 | int dvr_playback_audio_start(DVR_PlaybackHandle_t handle, am_tsplayer_audio_params *param, am_tsplayer_audio_params *ad_param); |
hualing chen | df118dd | 2020-05-21 15:49:11 +0800 | [diff] [blame] | 489 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 490 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 491 | /**\brief Stop audio playing |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 492 | * \param[in] handle playback handle |
| 493 | * \retval DVR_SUCCESS On success |
| 494 | * \return Error code |
| 495 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 496 | int dvr_playback_audio_stop(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 497 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 498 | /**\brief Start video playing |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 499 | * \param[in] handle playback handle |
| 500 | * \param[in] params video playback params,contains fmt and pid... |
| 501 | * \retval DVR_SUCCESS On success |
| 502 | * \return Error code |
| 503 | */ |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 504 | int dvr_playback_video_start(DVR_PlaybackHandle_t handle, am_tsplayer_video_params *params); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 505 | |
| 506 | /**\brief Stop play video |
| 507 | * \param[in] handle playback handle |
| 508 | * \retval DVR_SUCCESS On success |
| 509 | * \return Error code |
| 510 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 511 | int dvr_playback_video_stop(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 512 | |
| 513 | /**\brief Pause play |
| 514 | * \param[in] handle playback handle |
| 515 | * \param[in] flush whether its internal buffers should be flushed |
| 516 | * \retval DVR_SUCCESS On success |
| 517 | * \return Error code |
| 518 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 519 | int dvr_playback_pause(DVR_PlaybackHandle_t handle, DVR_Bool_t flush); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 520 | |
hualing chen | 3114087 | 2020-03-25 12:29:26 +0800 | [diff] [blame] | 521 | /**\brief resume play |
| 522 | * \param[in] handle playback handle |
| 523 | * \retval DVR_SUCCESS On success |
| 524 | * \return Error code |
| 525 | */ |
| 526 | int dvr_playback_resume(DVR_PlaybackHandle_t handle); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 527 | |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 528 | /**\brief set limit |
| 529 | * \param[in] handle playback handle |
| 530 | * \param[in] rec start time ms |
| 531 | * \param[in] rec limit time ms |
| 532 | * \retval DVR_SUCCESS On success |
| 533 | * \return Error code |
| 534 | */ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 535 | int dvr_playback_setlimit(DVR_PlaybackHandle_t handle, uint32_t time, uint32_t limit); |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 536 | |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 537 | /**\brief Seek the playing position |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 538 | * \param[in] handle playback handle |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 539 | * \param[in] segment_id the segment's index |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 540 | * \param[in] time_offset time offset base cur segment |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 541 | * \retval DVR_SUCCESS On success |
| 542 | * \return Error code |
| 543 | */ |
hualing chen | cc91e1c | 2020-02-28 13:26:17 +0800 | [diff] [blame] | 544 | 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] | 545 | |
| 546 | /**\brief Set play speed |
| 547 | * \param[in] handle playback handle |
| 548 | * \param[in] speed playback speed |
| 549 | * \retval DVR_SUCCESS On success |
| 550 | * \return Error code |
| 551 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 552 | 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] | 553 | |
| 554 | /**\brief Get playback status |
| 555 | * \param[in] handle playback handle |
| 556 | * \param[out] p_status playback status |
| 557 | * \retval DVR_SUCCESS On success |
| 558 | * \return Error code |
| 559 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 560 | 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] | 561 | |
| 562 | /**\brief Get playback capabilities |
| 563 | * \param[out] p_capability playback capability |
| 564 | * \retval DVR_SUCCESS On success |
| 565 | * \return Error code |
| 566 | */ |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 567 | int dvr_playback_get_capabilities(DVR_PlaybackCapability_t *p_capability); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 568 | |
hualing chen | 040df22 | 2020-01-17 13:35:02 +0800 | [diff] [blame] | 569 | /**\brief dump segmentinfo throw print log |
Gong Ke | 497c4c2 | 2020-03-20 10:15:42 +0800 | [diff] [blame] | 570 | * \param[in] handle playback |
| 571 | * \param[in] 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] | 572 | * \retval DVR_SUCCESS On success |
| 573 | * \return Error code |
| 574 | */ |
hualing chen | 5cbe1a6 | 2020-02-10 16:36:36 +0800 | [diff] [blame] | 575 | int dvr_dump_segmentinfo(DVR_PlaybackHandle_t handle, uint64_t segment_id); |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 576 | |
pengfei.liu | 07ddc8a | 2020-03-24 23:36:53 +0800 | [diff] [blame] | 577 | /**\brief Set DVR playback decrypt function |
| 578 | * \param[in] handle, DVR playback session handle |
| 579 | * \param[in] func, DVR playback encrypt function |
| 580 | * \param[in] userdata, DVR playback userdata from the caller |
| 581 | * \return DVR_SUCCESS on success |
| 582 | * \return error code on failure |
| 583 | */ |
pengfei.liu | 27cc4ec | 2020-04-03 16:28:16 +0800 | [diff] [blame] | 584 | int dvr_playback_set_decrypt_callback(DVR_PlaybackHandle_t handle, DVR_CryptoFunction_t func, void *userdata); |
pengfei.liu | 07ddc8a | 2020-03-24 23:36:53 +0800 | [diff] [blame] | 585 | |
| 586 | /**\brief Set DVR playback secure buffer used for protect the secure content |
| 587 | * \param[in] handle, DVR playback session handle |
| 588 | * \param[in] p_secure_buf, Secure buffer address which can NOT access by ACPU |
| 589 | * \param[in] len, Secure buffer length |
| 590 | * \return DVR_SUCCESS on success |
| 591 | * \return error code on failure |
| 592 | */ |
| 593 | int dvr_playback_set_secure_buffer(DVR_PlaybackHandle_t handle, uint8_t *p_secure_buf, uint32_t len); |
| 594 | |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 595 | /**\brief set DVR playback calculate expired time len |
| 596 | * \param[in] handle, DVR playback session handle |
| 597 | * \return DVR_SUCCESS on success |
| 598 | * \return error code on failure |
| 599 | */ |
hualing chen | 7ea70a7 | 2021-09-09 11:25:13 +0800 | [diff] [blame] | 600 | uint32_t dvr_playback_calculate_expiredlen(DVR_PlaybackHandle_t handle); |
hualing chen | 03fd494 | 2021-07-15 15:56:41 +0800 | [diff] [blame] | 601 | |
| 602 | /**\brief set DVR playback obsolete time |
| 603 | * \param[in] handle, DVR playback session handle |
| 604 | * \param[in] obsolete, obsolete len |
| 605 | * \return DVR_SUCCESS on success |
| 606 | * \return error code on failure |
| 607 | */ |
| 608 | int dvr_playback_set_obsolete(DVR_PlaybackHandle_t handle, int obsolete); |
| 609 | |
| 610 | /**\brief update DVR playback newest segment duration |
| 611 | * \param[in] handle, DVR playback session handle |
| 612 | * \param[in] segmentid, newest segment id |
| 613 | * \param[in] dur dur time ms |
| 614 | * \return DVR_SUCCESS on success |
| 615 | * \return error code on failure |
| 616 | */ |
| 617 | int dvr_playback_update_duration(DVR_PlaybackHandle_t handle, |
| 618 | uint64_t segmentid, int dur); |
| 619 | |
| 620 | /**\brief check DVR playback is set limit info |
| 621 | * \param[in] handle, DVR playback session handle |
| 622 | * \return DVR_FALSE or DVR_TRUE |
| 623 | */ |
| 624 | DVR_Bool_t dvr_playback_check_limit(DVR_PlaybackHandle_t handle); |
| 625 | |
Wentao MA | 5629ad8 | 2022-08-24 10:03:02 +0800 | [diff] [blame] | 626 | /**\brief set ac4 audio preselection id for playback |
| 627 | * \param[in] handle, DVR playback session handle |
| 628 | * \param[in] presel_id, ac4 preselection id |
| 629 | * \return DVR_SUCCESS on success |
| 630 | * \return error code on failure |
| 631 | */ |
| 632 | int dvr_playback_set_ac4_preselection_id(DVR_PlaybackHandle_t handle, int presel_id); |
| 633 | |
hualing chen | b31a6c6 | 2020-01-13 17:27:00 +0800 | [diff] [blame] | 634 | #ifdef __cplusplus |
| 635 | } |
| 636 | #endif |
| 637 | |
| 638 | #endif /*END DVR_PLAYBACK_H_*/ |