1515#include " starboard/android/shared/video_render_algorithm.h"
1616
1717#include < algorithm>
18+ #include < list>
1819
20+ #include " cobalt/android/jni_headers/VideoFrameReleaseTimeHelper_jni.h"
1921#include " starboard/android/shared/media_common.h"
2022#include " starboard/common/check_op.h"
2123#include " starboard/common/log.h"
22-
23- #include " cobalt/android/jni_headers/VideoFrameReleaseTimeHelper_jni.h"
24+ #include " starboard/shared/starboard/features.h"
2425
2526namespace starboard {
2627
@@ -43,7 +44,10 @@ jlong GetSystemNanoTime() {
4344VideoRenderAlgorithmAndroid::VideoRenderAlgorithmAndroid (
4445 MediaCodecVideoDecoder* video_decoder,
4546 VideoFrameTracker* frame_tracker)
46- : video_decoder_(video_decoder), frame_tracker_(frame_tracker) {
47+ : video_decoder_(video_decoder),
48+ frame_tracker_ (frame_tracker),
49+ release_frames_after_audio_starts_(features::FeatureList::IsEnabled(
50+ features::kReleaseVideoFramesAfterAudioStarts )) {
4751 SB_CHECK (video_decoder_);
4852 video_decoder_->SetPlaybackRate (playback_rate_);
4953}
@@ -70,9 +74,22 @@ void VideoRenderAlgorithmAndroid::Render(
7074 double playback_rate;
7175 int64_t playback_time = media_time_provider->GetCurrentMediaTime (
7276 &is_audio_playing, &is_audio_eos_played, &is_underflow, &playback_rate);
73- if (!is_audio_playing) {
74- break ;
77+
78+ if (release_frames_after_audio_starts_) {
79+ // After the first frame, stop rendering if audio isn't playing, or if
80+ // audio playback hasn't advanced past the current seek_to_time (or
81+ // initial time 0). This ensures video doesn't run ahead if audio is
82+ // stalled or hasn't consumed frames yet.
83+ if (first_frame_released_ &&
84+ (!is_audio_playing || playback_time == seek_to_time_)) {
85+ break ;
86+ }
87+ } else {
88+ if (!is_audio_playing) {
89+ break ;
90+ }
7591 }
92+
7693 if (playback_rate != playback_rate_) {
7794 playback_rate_ = playback_rate;
7895 video_decoder_->SetPlaybackRate (playback_rate);
@@ -116,6 +133,7 @@ void VideoRenderAlgorithmAndroid::Render(
116133 draw_frame_cb (frames->front (), adjusted_release_time_ns);
117134 SB_DCHECK_EQ (status, VideoRendererSink::kReleased );
118135 frames->pop_front ();
136+ first_frame_released_ = true ;
119137 } else {
120138 break ;
121139 }
@@ -126,6 +144,8 @@ void VideoRenderAlgorithmAndroid::Seek(int64_t seek_to_time) {
126144 if (frame_tracker_) {
127145 frame_tracker_->Seek (seek_to_time);
128146 }
147+ first_frame_released_ = false ;
148+ seek_to_time_ = seek_to_time;
129149}
130150
131151int VideoRenderAlgorithmAndroid::GetDroppedFrames () {
0 commit comments