libdvr: when adjust the size more than 1 time PVR can't playing [1/1]
PD#OTT-39917
PD#SWPL-119694
Problem:
Cannot repeatedly playback a recording. Dtvkitserver crashes always.
Solution:
Fix a libdvr defect. With the fix, libdvr can recognize an error condition
earlier and handle it properly without propagating it to subsequent process.
Verify:
Tested pass on S805C3 Zapper+.
Signed-off-by: Wentao.MA <wentao.ma@amlogic.com>
Change-Id: Ie418f505b84069c16f51bc9998e9356b703946c7
diff --git a/include/dvr_playback.h b/include/dvr_playback.h
index 276e0a6..a811c0d 100644
--- a/include/dvr_playback.h
+++ b/include/dvr_playback.h
@@ -310,7 +310,7 @@
DVR_PlaybackCmdInfo_t cmd; /**< playback cmd*/
int offset; /**< segment read offset*/
uint32_t dur; /**< segment dur*/
- Segment_Handle_t r_handle; /**< playback current segment handle*/
+ Segment_Handle_t segment_handle; /**< playback current segment handle*/
DVR_PlaybackOpenParams_t openParams; /**< playback openParams*/
DVR_Bool_t has_video; /**< has video playing*/
DVR_Bool_t has_audio; /**< has audio playing*/
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index db15f7b..3067341 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -456,23 +456,6 @@
return DVR_SUCCESS;
}
-//check is ongoing segment
-static int _dvr_check_segment_ongoing(DVR_PlaybackHandle_t handle) {
-
- DVR_Playback_t *player = (DVR_Playback_t *) handle;
-
- if (player == NULL) {
- DVR_PB_INFO("player is NULL");
- return DVR_FAILURE;
- }
- int ret = segment_ongoing(player->r_handle);
- if (ret != DVR_SUCCESS) {
- return DVR_FALSE;
- }
- return DVR_TRUE;
-}
-
-
static int _dvr_init_fffb_t(DVR_PlaybackHandle_t handle) {
DVR_Playback_t *player = (DVR_Playback_t *) handle;
player->fffb_start = _dvr_time_getClock();
@@ -615,8 +598,9 @@
}
//save segment info
player->last_segment_id = player->cur_segment_id;
- if (player->r_handle)
- player->last_segment_total = segment_tell_total_time(player->r_handle);
+ if (player->segment_handle) {
+ player->last_segment_total = segment_tell_total_time(player->segment_handle);
+ }
player->last_segment.segment_id = player->cur_segment.segment_id;
player->last_segment.flags = player->cur_segment.flags;
memcpy(player->last_segment.location, player->cur_segment.location, DVR_MAX_LOCATION_SIZE);
@@ -676,10 +660,10 @@
return DVR_FAILURE;
}
- if (player->r_handle != NULL) {
+ if (player->segment_handle != NULL) {
DVR_PB_INFO("close segment");
- segment_close(player->r_handle);
- player->r_handle = NULL;
+ segment_close(player->segment_handle);
+ player->segment_handle = NULL;
}
memset((void*)¶ms,0,sizeof(params));
@@ -689,7 +673,7 @@
params.mode = SEGMENT_MODE_READ;
DVR_PB_INFO("open segment location[%s]id[%lld]flag[0x%x]", params.location, params.segment_id, player->cur_segment.flags);
- ret = segment_open(¶ms, &(player->r_handle));
+ ret = segment_open(¶ms, &(player->segment_handle));
if (ret == DVR_FAILURE) {
DVR_PB_INFO("open segment error");
goto retry;
@@ -704,7 +688,7 @@
if (IS_FB(player->speed)) {
//seek end pos -FB_DEFAULT_LEFT_TIME
player->ts_cache_len = 0;
- segment_seek(player->r_handle, total - FB_DEFAULT_LEFT_TIME, player->openParams.block_size);
+ segment_seek(player->segment_handle, total - FB_DEFAULT_LEFT_TIME, player->openParams.block_size);
DVR_PB_INFO("seek pos [%d]", total - FB_DEFAULT_LEFT_TIME);
}
player->dur = total;
@@ -785,11 +769,11 @@
params.segment_id = (uint64_t)player->cur_segment.segment_id;
params.mode = SEGMENT_MODE_READ;
DVR_PB_INFO("open segment location[%s][%lld]cur flag[0x%x]", params.location, params.segment_id, player->cur_segment.flags);
- if (player->r_handle != NULL) {
- segment_close(player->r_handle);
- player->r_handle = NULL;
+ if (player->segment_handle != NULL) {
+ segment_close(player->segment_handle);
+ player->segment_handle = NULL;
}
- ret = segment_open(¶ms, &(player->r_handle));
+ ret = segment_open(¶ms, &(player->segment_handle));
if (ret == DVR_FAILURE) {
DVR_PB_INFO("segment open error");
}
@@ -1063,8 +1047,8 @@
// coverity[self_assign]
list_for_each_entry(_segment, &player->segment_list, head) {
if (player->cur_segment_id == _segment->segment_id) {
- int seg_size = segment_get_cur_segment_size(player->r_handle);
- int read_ptr = segment_tell_position(player->r_handle);
+ int seg_size = segment_get_cur_segment_size(player->segment_handle);
+ int read_ptr = segment_tell_position(player->segment_handle);
float progress = -1.0f;
if (seg_size>0) {
progress = (float)read_ptr*100/seg_size;
@@ -1260,7 +1244,7 @@
dvr_mutex_lock(&player->lock);
pthread_mutex_lock(&player->segment_lock);
//DVR_PB_INFO("start read");
- read = segment_read(player->r_handle, buf + real_read, buf_len - real_read);
+ read = segment_read(player->segment_handle, buf + real_read, buf_len - real_read);
real_read = real_read + read;
player->ts_cache_len = real_read;
//DVR_PB_INFO("start read end [%d]", read);
@@ -1377,7 +1361,7 @@
_dvr_replay_changed_pid((DVR_PlaybackHandle_t)player);
_dvr_check_cur_segment_flag((DVR_PlaybackHandle_t)player);
pthread_mutex_lock(&player->segment_lock);
- read = segment_read(player->r_handle, buf + real_read, buf_len - real_read);
+ read = segment_read(player->segment_handle, buf + real_read, buf_len - real_read);
real_read = real_read + read;
player->ts_cache_len = real_read;
pthread_mutex_unlock(&player->segment_lock);
@@ -1433,7 +1417,7 @@
crypto_params.type = DVR_CRYPTO_TYPE_DECRYPT;
memcpy(crypto_params.location, player->cur_segment.location, strlen(player->cur_segment.location));
crypto_params.segment_id = player->cur_segment.segment_id;
- crypto_params.offset = segment_tell_position(player->r_handle) - input_buffer.buf_size;
+ crypto_params.offset = segment_tell_position(player->segment_handle) - input_buffer.buf_size;
if ((crypto_params.offset % (player->openParams.block_size)) != 0)
DVR_PB_INFO("offset is not block_size %d", player->openParams.block_size);
crypto_params.input_buffer.type = DVR_BUFFER_TYPE_NORMAL;
@@ -1587,9 +1571,9 @@
_dvr_playback_sendSignal(handle);
pthread_join(player->playback_thread, NULL);
}
- if (player->r_handle) {
- segment_close(player->r_handle);
- player->r_handle = NULL;
+ if (player->segment_handle) {
+ segment_close(player->segment_handle);
+ player->segment_handle = NULL;
}
DVR_PB_INFO(":end");
return 0;
@@ -2324,7 +2308,7 @@
player->ts_cache_len = 0;
if (player->first_start_time > 0)
player->first_start_time = player->first_start_time - 1;
- segment_seek(player->r_handle, (uint64_t)(player->first_start_time), player->openParams.block_size);
+ segment_seek(player->segment_handle, (uint64_t)(player->first_start_time), player->openParams.block_size);
DVR_PB_ERROR("unlock segment update need seek time_offset %llu [0x%x][0x%x]", player->first_start_time, segment->pids.audio.pid, segment->pids.ad.pid);
pthread_mutex_unlock(&player->segment_lock);
}
@@ -3022,7 +3006,7 @@
return DVR_FAILURE;
}
if (time_offset >_dvr_get_end_time(handle) &&_dvr_has_next_segmentId(handle, segment_id) == DVR_FAILURE) {
- if (segment_ongoing(player->r_handle) == DVR_SUCCESS) {
+ if (segment_ongoing(player->segment_handle) == DVR_SUCCESS) {
DVR_PB_INFO("is ongoing segment when seek end, need return success");
time_offset = _dvr_get_end_time(handle);
} else {
@@ -3052,7 +3036,7 @@
pthread_mutex_lock(&player->segment_lock);
player->drop_ts = DVR_TRUE;
player->ts_cache_len = 0;
- int offset = segment_seek(player->r_handle, (uint64_t)time_offset, player->openParams.block_size);
+ int offset = segment_seek(player->segment_handle, (uint64_t)time_offset, player->openParams.block_size);
DVR_PB_ERROR("seek get offset by time offset, offset=%d time_offset %u",offset, time_offset);
pthread_mutex_unlock(&player->segment_lock);
player->offset = offset;
@@ -3245,14 +3229,14 @@
int64_t cache = 0;//default es buf cache 500ms
pthread_mutex_lock(&player->segment_lock);
- loff_t pos = segment_tell_position(player->r_handle) -player->ts_cache_len;
+ loff_t pos = segment_tell_position(player->segment_handle) -player->ts_cache_len;
uint64_t cur = 0;
if (player->ts_cache_len > 0 && pos < 0) {
//this case is open new segment end,but cache data is last segment.
//we need used last segment len to send play time.
cur = 0;
} else {
- cur = segment_tell_position_time(player->r_handle, pos);
+ cur = segment_tell_position_time(player->segment_handle, pos);
}
AmTsPlayer_getDelayTime(player->handle, &cache);
pthread_mutex_unlock(&player->segment_lock);
@@ -3270,13 +3254,12 @@
static int _dvr_get_play_cur_time(DVR_PlaybackHandle_t handle, uint64_t *id) {
//get cur time of segment
DVR_Playback_t *player = (DVR_Playback_t *) handle;
-
DVR_RETURN_IF_FALSE(player != NULL);
- DVR_RETURN_IF_FALSE(player->handle != 0);
+ DVR_RETURN_IF_FALSE(player->segment_handle != NULL);
pthread_mutex_lock(&player->segment_lock);
- const loff_t pos = segment_tell_position(player->r_handle);
- const uint64_t cur = segment_tell_position_time(player->r_handle, pos);
+ const loff_t pos = segment_tell_position(player->segment_handle);
+ const uint64_t cur = segment_tell_position_time(player->segment_handle, pos);
pthread_mutex_unlock(&player->segment_lock);
int cache = 0;
@@ -3305,6 +3288,8 @@
static int _dvr_get_end_time(DVR_PlaybackHandle_t handle) {
//get cur time of segment
DVR_Playback_t *player = (DVR_Playback_t *) handle;
+ DVR_RETURN_IF_FALSE(player != NULL);
+ DVR_RETURN_IF_FALSE(player->segment_handle != NULL);
if (player == NULL) {
DVR_PB_INFO("player is NULL");
@@ -3312,7 +3297,7 @@
}
pthread_mutex_lock(&player->segment_lock);
- uint64_t end = segment_tell_total_time(player->r_handle);
+ uint64_t end = segment_tell_total_time(player->segment_handle);
pthread_mutex_unlock(&player->segment_lock);
return (int)end;
}
@@ -3509,7 +3494,7 @@
seek_time = 0;
}
//seek segment pos
- if (player->r_handle) {
+ if (player->segment_handle) {
pthread_mutex_lock(&player->segment_lock);
player->ts_cache_len = 0;
if (seek_time < FB_MIX_SEEK_TIME && IS_FB(player->speed)) {
@@ -3541,7 +3526,7 @@
}
//case can play
}
- if (segment_seek(player->r_handle, seek_time, player->openParams.block_size) == DVR_FAILURE) {
+ if (segment_seek(player->segment_handle, seek_time, player->openParams.block_size) == DVR_FAILURE) {
seek_time = 0;
}
pthread_mutex_unlock(&player->segment_lock);