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);