libdvr: Unexpected sound output in audio-only timeshift start phase [1/1]

PD#SWPL-105889
PD#SWPL-105789

Problem:
Unexpected sound output in audio-only timeshift playback starting phase.

Solution:
Mute audio in the mentioned interim.

Verify:
Locally tested OK in AndroidT environment.

Signed-off-by: Wentao.MA <wentao.ma@amlogic.com>
Change-Id: Ibedfac766e9959bdbd7378e6ad87a072245a1808
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index 3ef1bd3..5a9dcd8 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -51,7 +51,7 @@
 static int write_success = 0;
 //
 static int _dvr_playback_fffb(DVR_PlaybackHandle_t handle);
-static int _do_check_pid_info(DVR_PlaybackHandle_t handle, DVR_PlaybackPids_t  now_pids, DVR_PlaybackPids_t pids, int type);
+static int _do_handle_pid_update(DVR_PlaybackHandle_t handle, DVR_PlaybackPids_t  now_pids, DVR_PlaybackPids_t pids, int type);
 static int _dvr_get_cur_time(DVR_PlaybackHandle_t handle);
 static int _dvr_get_end_time(DVR_PlaybackHandle_t handle);
 static int _dvr_playback_calculate_seekpos(DVR_PlaybackHandle_t handle);
@@ -882,14 +882,14 @@
   //if (player->cmd.state == DVR_PLAYBACK_STATE_START)
   {
     //check video pids, stop or restart
-    _do_check_pid_info(handle, player->last_segment.pids, player->cur_segment.pids, 0);
+    _do_handle_pid_update(handle, player->last_segment.pids, player->cur_segment.pids, 0);
     //check sub audio pids stop or restart
-    _do_check_pid_info(handle, player->last_segment.pids, player->cur_segment.pids, 2);
+    _do_handle_pid_update(handle, player->last_segment.pids, player->cur_segment.pids, 2);
     //check audio pids stop or restart
-    _do_check_pid_info(handle, player->last_segment.pids, player->cur_segment.pids, 1);
+    _do_handle_pid_update(handle, player->last_segment.pids, player->cur_segment.pids, 1);
     DVR_PB_INFO(":last apid: %d  set apid: %d", player->last_segment.pids.audio.pid,player->cur_segment.pids.audio.pid);
     //check pcr pids stop or restart
-    _do_check_pid_info(handle, player->last_segment.pids, player->cur_segment.pids, 3);
+    _do_handle_pid_update(handle, player->last_segment.pids, player->cur_segment.pids, 3);
   }
   return DVR_SUCCESS;
 }
@@ -1115,6 +1115,11 @@
             AmTsPlayer_setTrickMode(player->handle, AV_VIDEO_TRICK_MODE_NONE);
             AmTsPlayer_pauseVideoDecoding(player->handle);
             AmTsPlayer_pauseAudioDecoding(player->handle);
+
+            // Audio is unmuted here, for it was muted before receiving first frame event.
+            if (player->cur_segment.flags & DVR_PLAYBACK_SEGMENT_DISPLAYABLE) {
+              AmTsPlayer_setAudioMute(player->handle,0,0);
+            }
           } else {
             DVR_PB_INFO("clear first frame value-------");
             player->first_frame = 0;
@@ -2046,11 +2051,16 @@
 }
 
 
-static int _do_check_pid_info(DVR_PlaybackHandle_t handle, DVR_PlaybackPids_t  now_pids, DVR_PlaybackPids_t set_pids, int type) {
+static int _do_handle_pid_update(DVR_PlaybackHandle_t handle, DVR_PlaybackPids_t  now_pids, DVR_PlaybackPids_t set_pids, int type) {
   DVR_Playback_t *player = (DVR_Playback_t *) handle;
   DVR_StreamInfo_t set_pid;
   DVR_StreamInfo_t now_pid;
 
+  if (player == NULL) {
+    DVR_PB_INFO("player is NULL");
+    return DVR_FAILURE;
+  }
+
   if (type == 0) {
     set_pid = set_pids.video;
     now_pid = now_pids.video;
@@ -2065,10 +2075,12 @@
     now_pid = now_pids.pcr;
   }
 
-  if (player == NULL) {
-    DVR_PB_INFO("player is NULL");
-    return DVR_FAILURE;
+  if (type == 1 && VALID_PID(set_pid.pid) && player->cmd.state == DVR_PLAYBACK_STATE_START) {
+    // Here we mute audio no matter it is displayable or not in starting phase of a playback.
+    // Audio will be unmuted shortly on receiving first frame event.
+    AmTsPlayer_setAudioMute(player->handle,1,1);
   }
+
   if (now_pid.pid == set_pid.pid) {
     //do nothing
     return 0;
@@ -2133,6 +2145,7 @@
           if (player->audio_presentation_id > -1) {
             AmTsPlayer_setParams(player->handle, AM_TSPLAYER_KEY_AUDIO_PRESENTATION_ID, &player->audio_presentation_id);
           }
+
           AmTsPlayer_startAudioDecoding(player->handle);
           //playback_device_audio_start(player->handle,&audio_params);
         }
@@ -2313,13 +2326,13 @@
             }
           }
           //check video pids, stop or restart
-          _do_check_pid_info((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 0);
+          _do_handle_pid_update((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 0);
           //check sub audio pids stop or restart
-          _do_check_pid_info((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 2);
+          _do_handle_pid_update((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 2);
           //check audio pids stop or restart
-          _do_check_pid_info((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 1);
+          _do_handle_pid_update((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 1);
           //check pcr pids stop or restart
-          _do_check_pid_info((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 3);
+          _do_handle_pid_update((DVR_PlaybackHandle_t)player, segment->pids, *p_pids, 3);
 
           dvr_mutex_lock(&player->lock);
         } else if (player->cmd.state == DVR_PLAYBACK_STATE_PAUSE) {