libdvr: FF automatically changes to normal speed on reaching end [1/1]

PD#SWPL-139847
PD#OTT-49193

Problem:
Skyworth requests that libdvr should be able to automatically resume to
normal speed when FF reaches end during timeshift. On our reference
platforms, the said logic is implemented at higher layer.

Solution:
Implement the said logic in libdvr and keep it for skyworth only.

Verify:
Tested pass on ohm

Signed-off-by: Wentao.MA <wentao.ma@amlogic.com>
Change-Id: Ica7539183d6de461d01e0233ef215e4e2bec92c6
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index 3067341..ef8ac20 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -63,6 +63,7 @@
 static uint32_t dvr_playback_calculate_last_valid_segment(
   DVR_PlaybackHandle_t handle, uint64_t *segmentid, uint32_t *pos);
 static int get_effective_tsplayer_delay_time(DVR_Playback_t* playback, int *time);
+static int _dvr_get_play_cur_time(DVR_PlaybackHandle_t handle, uint64_t *id);
 
 
 
@@ -1368,6 +1369,26 @@
 
       dvr_mutex_unlock(&player->lock);
     }//read len 0 check end
+
+#ifdef FOR_SKYWORTH_FETCH_RDK
+    if (player->openParams.is_timeshift == DVR_TRUE && player->speed >= FF_SPEED)
+    {
+      DVR_PlaybackSegmentInfo_t *newest_segment
+        = list_last_entry(&player->segment_list, DVR_PlaybackSegmentInfo_t, head);
+      DVR_Bool_t cond1 = (player->cur_segment_id == newest_segment->segment_id);
+      int32_t time_end = _dvr_get_end_time((DVR_PlaybackHandle_t)player);
+      uint64_t cur_seg_id = 0;
+      int32_t time_cur = _dvr_get_play_cur_time((DVR_PlaybackHandle_t)player, &cur_seg_id);
+      DVR_Bool_t cond2 = (cur_seg_id == player->cur_segment_id && time_end - time_cur < 1000);
+      if (cond1 && cond2)
+      {
+        DVR_PlaybackSpeed_t normal_speed = {PLAYBACK_SPEED_X1,0};
+        DVR_PB_INFO("Change to normal speed due to FF reaching end");
+        dvr_playback_set_speed((DVR_PlaybackHandle_t)player,normal_speed);
+      }
+    }
+#endif
+
     if (player->noData >= check_no_data_time) {
       player->noData = 0;
       DVR_PB_INFO("playback send data event resume[%d]", player->noData);