libdvr: add system clock support. [1/1]

PD#SWPL-108319

Problem:
playback to end too quickly in oc test.

Solution:
add system clock support

Verify:
s905x4

Change-Id: I3438d5dc8105d47d56198461c2248cea9c7c098c
Signed-off-by: shenghui.geng <shenghui.geng@amlogic.com>
diff --git a/include/dvr_playback.h b/include/dvr_playback.h
index 38fdb01..5f6c2c6 100644
--- a/include/dvr_playback.h
+++ b/include/dvr_playback.h
@@ -230,6 +230,7 @@
   void                        *event_userdata;    /**< event userdata*/
   DVR_PlaybackVendor_t         vendor;    /**< vendor type,default is 0*/
   DVR_Bool_t                 is_notify_time;  /**< notify play time info true or not*/
+  DVR_Bool_t                 control_speed_enable;  /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/
 } DVR_PlaybackOpenParams_t;
 
 /**\brief playback play state*/
@@ -361,6 +362,9 @@
   int                         fake_pid;
   //Audio presentation id, used for dolby AC4 audio
   int32_t                     audio_presentation_id;
+
+  /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/
+  DVR_Bool_t                 control_speed_enable;
 } DVR_Playback_t;
 /**\endcond*/
 
diff --git a/include/dvr_wrapper.h b/include/dvr_wrapper.h
index 2917dc7..e04654c 100644
--- a/include/dvr_wrapper.h
+++ b/include/dvr_wrapper.h
@@ -118,6 +118,7 @@
   void                        *event_userdata;             /**< event userdata*/
   DVR_Bool_t              is_notify_time;                  /**< 0:not notify time, 1 : notify*/
   DVR_PlaybackVendor_t    vendor;                          /**< vendor type*/
+  DVR_Bool_t              control_speed_enable;            /**< 1: system clock, 0: libdvr can determine index time source based on actual situation*/
 } DVR_WrapperPlaybackOpenParams_t;
 
 /**
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index acdf81d..64f82a4 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -26,8 +26,6 @@
 
 #define VALID_PID(_pid_) ((_pid_)>0 && (_pid_)<0x1fff)
 
-#define CONTROL_SPEED_ENABLE    0
-
 #define FF_SPEED (2.0f)
 #define FB_SPEED (-1.0f)
 #define IS_FFFB(_SPEED_) ((_SPEED_) > FF_SPEED && (_SPEED_) < FB_SPEED)
@@ -427,12 +425,12 @@
     return DVR_FAILURE;
   }
   if (player->openParams.is_notify_time == DVR_FALSE) {
-    if (CONTROL_SPEED_ENABLE == 0)
+    if (player->control_speed_enable == 0)
        return DVR_SUCCESS;
   }
 
   if (player->send_time == 0) {
-    if (CONTROL_SPEED_ENABLE == 0)
+    if (player->control_speed_enable == 0)
       player->send_time = _dvr_time_getClock() + 500;
     else
       player->send_time = _dvr_time_getClock() + 20;
@@ -444,7 +442,7 @@
       return DVR_SUCCESS;
     }
   }
-  if (CONTROL_SPEED_ENABLE == 0)
+  if (player->control_speed_enable == 0)
     player->send_time = _dvr_time_getClock() + 500;
   else
     player->send_time = _dvr_time_getClock() + 20;
@@ -1488,7 +1486,7 @@
       pthread_mutex_unlock(&player->segment_lock);
       real_read = 0;
       write_success++;
-      if (CONTROL_SPEED_ENABLE == 1) {
+      if (player->control_speed_enable == 1) {
 check0:
             if (!player->is_running) {
                 //DVR_PB_DEBUG(1, "playback thread exit");
@@ -1508,7 +1506,7 @@
       DVR_PB_DEBUG("write time out write_success:%d buf_size:%d systime:%u",
           write_success, input_buffer.buf_size, _dvr_time_getClock());
       write_success = 0;
-      if (CONTROL_SPEED_ENABLE == 1) {
+      if (player->control_speed_enable == 1) {
 check1:
         if (!player->is_running) {
             //DVR_PB_DEBUG(1, "playback thread exit");
@@ -1654,6 +1652,7 @@
   player->has_pids = params->has_pids;
 
   player->handle = params->player_handle ;
+  player->control_speed_enable = params->control_speed_enable;
 
   AmTsPlayer_getCb(player->handle, &player->player_callback_func, &player->player_callback_userdata);
   //for test get callback
@@ -1711,7 +1710,7 @@
   player->seek_pause = DVR_FALSE;
 
   //speed con init
-  if (CONTROL_SPEED_ENABLE == 1) {
+  if (player->control_speed_enable == 1) {
     player->con_spe.ply_dur = 0;
     player->con_spe.ply_sta = 0;
     player->con_spe.sys_dur = 0;
@@ -3923,7 +3922,7 @@
   p_status->time_end = _dvr_get_end_time(handle);
   p_status->time_cur = _dvr_get_play_cur_time(handle, &segment_id);
 
-  if (CONTROL_SPEED_ENABLE == 1) {
+  if (player->control_speed_enable == 1) {
     if (player->con_spe.ply_sta == 0) {
           DVR_PB_INFO("player dur[%u] sta[%u] cur[%d] -----reinit",
                         player->con_spe.ply_dur,
diff --git a/src/dvr_record.c b/src/dvr_record.c
index 0825845..0dc1d41 100644
--- a/src/dvr_record.c
+++ b/src/dvr_record.c
@@ -12,8 +12,6 @@
 #include <sys/time.h>
 #include "am_crypt.h"
 
-#define CONTROL_SPEED_ENABLE 0
-
 #define CHECK_PTS_MAX_COUNT  (20)
 
 //#define DEBUG_PERFORMANCE
@@ -212,15 +210,13 @@
   DVR_SecureBuffer_t secure_buf = {0,0};
   DVR_NewDmxSecureBuffer_t new_dmx_secure_buf;
   int first_read = 0;
-  if (CONTROL_SPEED_ENABLE == 0)
-    p_ctx->index_type = DVR_INDEX_TYPE_INVALID;
-  else
-    p_ctx->index_type = DVR_INDEX_TYPE_LOCAL_CLOCK;
 
   // Force to use LOCAL_CLOCK as index type if force_sysclock is on. Please
   // refer to SWPL-75327
   if (p_ctx->force_sysclock)
     p_ctx->index_type = DVR_INDEX_TYPE_LOCAL_CLOCK;
+  else
+    p_ctx->index_type = DVR_INDEX_TYPE_INVALID;
   buf = (uint8_t *)malloc(block_size);
   if (!buf) {
     DVR_INFO("%s, malloc failed", __func__);
diff --git a/src/dvr_wrapper.c b/src/dvr_wrapper.c
index 516d303..702996c 100644
--- a/src/dvr_wrapper.c
+++ b/src/dvr_wrapper.c
@@ -1612,6 +1612,7 @@
     open_param.cleariv = params->cleariv;
     open_param.keylen = params->keylen;
   }
+  open_param.control_speed_enable = params->control_speed_enable;
 
   error = dvr_playback_open(&ctx->playback.player, &open_param);
   if (error) {