libdvr: Playback duration of the recorded file is not correct [1/1]
PD#SWPL-109031
Problem:
Recording playback teminates far earlier than expect under "speed control"
and multiple segments recording conditions. Unsigned "ply_dur"/"ply_sta"
of DVR_PlaybackConSpe_t can overflow during segment switch which causes
playback problem.
Solution:
1. Fix the overflow by changing their types to signed int.
2. Reset DVR_PlaybackConSpe_t during segment switch.
Verify:
Locally tested OK in AndroidT/AndroidR environment.
Signed-off-by: Wentao.MA <wentao.ma@amlogic.com>
Change-Id: I576cc9358474b27670795778855765654f973765
diff --git a/include/dvr_playback.h b/include/dvr_playback.h
index 5f6c2c6..276e0a6 100644
--- a/include/dvr_playback.h
+++ b/include/dvr_playback.h
@@ -275,8 +275,8 @@
{
uint32_t sys_dur; /**< system duration */
uint32_t sys_sta; /**< system start time */
- uint32_t ply_dur; /**< play duration */
- uint32_t ply_sta; /**< play start time */
+ int32_t ply_dur; /**< play duration */
+ int32_t ply_sta; /**< play start time */
} DVR_PlaybackConSpe_t;
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index 64f82a4..3ef1bd3 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -707,6 +707,10 @@
DVR_PB_INFO("seek pos [%d]", total - FB_DEFAULT_LEFT_TIME);
}
player->dur = total;
+ player->con_spe.ply_dur = 0;
+ player->con_spe.ply_sta = 0;
+ player->con_spe.sys_dur = 0;
+ player->con_spe.sys_sta = 0;
pthread_mutex_unlock(&player->segment_lock);
DVR_PB_INFO("next segment dur [%d] flag [0x%x]", player->dur, player->cur_segment.flags);
return ret;
@@ -898,7 +902,7 @@
return DVR_TRUE;
}
- DVR_PB_INFO(":play speed: %f ply dur: %u sys_dur: %u",
+ DVR_PB_INFO(":play speed: %f ply dur: %d sys_dur: %u",
player->speed,
player->con_spe.ply_dur,
player->con_spe.sys_dur);
@@ -3924,14 +3928,14 @@
if (player->control_speed_enable == 1) {
if (player->con_spe.ply_sta == 0) {
- DVR_PB_INFO("player dur[%u] sta[%u] cur[%d] -----reinit",
+ DVR_PB_INFO("player dur[%d] sta[%d] cur[%d] -----reinit",
player->con_spe.ply_dur,
player->con_spe.ply_sta,
p_status->time_cur);
player->con_spe.ply_sta = p_status->time_cur;
} else if (player->speed == 1.0f && player->con_spe.ply_sta < p_status->time_cur) {
player->con_spe.ply_dur += (p_status->time_cur - player->con_spe.ply_sta);
- DVR_PB_INFO("player dur[%u] sta[%u] cur[%d]",
+ DVR_PB_INFO("player dur[%d] sta[%d] cur[%d]",
player->con_spe.ply_dur,
player->con_spe.ply_sta,
p_status->time_cur);