Skip to content

Commit da0bb98

Browse files
Cherry pick PR #9145: media: Optimize Mojo IPC via batched sample writes in StarboardRenderer (#9271)
Refer to the original PR: #9145 Refactor StarboardRenderer to support batched sample writes. This improves the efficiency of Mojo IPC between the Renderer and player_worker by reducing the overhead of high-frequency individual packet transfers. Batching allows the renderer to "burst" data through the IPC layer whenever the thread has control. This reduces the pipeline's sensitivity to Renderer thread contention, ensuring a more stable data flow and decreasing the risk of playback being impacted by transient thread starvation or hangs. Issue: 375674101 --------- Co-authored-by: Kyujung Youn <kjyoun@google.com>
1 parent 6372d48 commit da0bb98

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

media/starboard/starboard_renderer.cc

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ using ::starboard::GetPlayerStateName;
4747
// buffer, this extra write during preroll can be eliminated.
4848
const int kPrerollGuardAudioBuffer = 1;
4949

50+
constexpr int kDefaultMaxSamplePerWrite = 1;
51+
5052
bool HasRemoteAudioOutputs(
5153
const std::vector<SbMediaAudioConfiguration>& configurations) {
5254
for (auto&& configuration : configurations) {
@@ -136,6 +138,8 @@ StarboardRenderer::StarboardRenderer(
136138
audio_write_duration_local_(audio_write_duration_local),
137139
audio_write_duration_remote_(audio_write_duration_remote),
138140
max_video_capabilities_(max_video_capabilities),
141+
// TODO: b/375674101 - Connect this to the starboard::feature.
142+
max_samples_per_write_(kDefaultMaxSamplePerWrite),
139143
viewport_size_(viewport_size)
140144
#if BUILDFLAG(IS_ANDROID)
141145
,
@@ -144,7 +148,13 @@ StarboardRenderer::StarboardRenderer(
144148
{
145149
DCHECK(task_runner_);
146150
DCHECK(media_log_);
147-
LOG(INFO) << "StarboardRenderer constructed.";
151+
CHECK_GT(max_samples_per_write_, 0);
152+
LOG(INFO) << "StarboardRenderer constructed: audio_write_duration_local="
153+
<< audio_write_duration_local_
154+
<< ", audio_write_duration_remote=" << audio_write_duration_remote_
155+
<< ", max_video_capabilities=\"" << max_video_capabilities_ << "\""
156+
<< ", max_samples_per_write=" << max_samples_per_write_
157+
<< ", view_port_size=" << viewport_size_.ToString();
148158
}
149159

150160
StarboardRenderer::~StarboardRenderer() {
@@ -724,13 +734,14 @@ void StarboardRenderer::UpdateDecoderConfig(DemuxerStream* stream) {
724734

725735
void StarboardRenderer::OnDemuxerStreamRead(
726736
DemuxerStream* stream,
737+
int max_buffers,
727738
DemuxerStream::Status status,
728739
DemuxerStream::DecoderBufferVector buffers) {
729740
if (!task_runner_->RunsTasksInCurrentSequence()) {
730741
task_runner_->PostTask(
731-
FROM_HERE,
732-
base::BindOnce(&StarboardRenderer::OnDemuxerStreamRead,
733-
weak_factory_.GetWeakPtr(), stream, status, buffers));
742+
FROM_HERE, base::BindOnce(&StarboardRenderer::OnDemuxerStreamRead,
743+
weak_factory_.GetWeakPtr(), stream,
744+
max_buffers, status, buffers));
734745
return;
735746
}
736747

@@ -802,8 +813,10 @@ void StarboardRenderer::OnDemuxerStreamRead(
802813
stream->video_decoder_config().visible_rect().size());
803814
}
804815
UpdateDecoderConfig(stream);
805-
stream->Read(1, base::BindOnce(&StarboardRenderer::OnDemuxerStreamRead,
806-
weak_factory_.GetWeakPtr(), stream));
816+
stream->Read(
817+
max_buffers,
818+
base::BindOnce(&StarboardRenderer::OnDemuxerStreamRead,
819+
weak_factory_.GetWeakPtr(), stream, max_buffers));
807820
} else if (status == DemuxerStream::kError) {
808821
client_->OnError(PIPELINE_ERROR_READ);
809822
}
@@ -826,10 +839,8 @@ void StarboardRenderer::OnNeedData(DemuxerStream::Type type,
826839
return;
827840
}
828841

829-
int max_buffers = max_audio_samples_per_write_ > 1
830-
? std::min(max_number_of_buffers_to_write,
831-
max_audio_samples_per_write_)
832-
: 1;
842+
int max_buffers =
843+
std::min(max_number_of_buffers_to_write, max_samples_per_write_);
833844

834845
if (type == DemuxerStream::AUDIO) {
835846
if (!audio_stream_) {
@@ -884,13 +895,12 @@ void StarboardRenderer::OnNeedData(DemuxerStream::Type type,
884895
audio_read_delayed_ = true;
885896
return;
886897
}
887-
if (max_audio_samples_per_write_ > 1 &&
888-
!time_ahead_of_playback.is_negative()) {
898+
if (max_samples_per_write_ > 1 && !time_ahead_of_playback.is_negative()) {
889899
estimated_max_buffers = GetEstimatedMaxBuffers(adjusted_write_duration,
890900
time_ahead_of_playback,
891901
false /* is_preroll */);
892902
}
893-
} else if (max_audio_samples_per_write_ > 1) {
903+
} else if (max_samples_per_write_ > 1) {
894904
if (!time_ahead_of_playback_for_preroll.is_negative()) {
895905
estimated_max_buffers = GetEstimatedMaxBuffers(
896906
adjusted_write_duration_for_preroll,
@@ -925,7 +935,7 @@ void StarboardRenderer::OnNeedData(DemuxerStream::Type type,
925935

926936
stream->Read(max_buffers,
927937
base::BindOnce(&StarboardRenderer::OnDemuxerStreamRead,
928-
weak_factory_.GetWeakPtr(), stream));
938+
weak_factory_.GetWeakPtr(), stream, max_buffers));
929939
}
930940

931941
void StarboardRenderer::OnPlayerStatus(SbPlayerState state) {
@@ -1060,8 +1070,7 @@ int StarboardRenderer::GetEstimatedMaxBuffers(TimeDelta write_duration,
10601070
DCHECK_GE(time_ahead_of_playback.InMicroseconds(), 0);
10611071

10621072
int estimated_max_buffers = 1;
1063-
if (!(max_audio_samples_per_write_ > 1) ||
1064-
write_duration <= time_ahead_of_playback) {
1073+
if (max_samples_per_write_ <= 1 || write_duration <= time_ahead_of_playback) {
10651074
return estimated_max_buffers;
10661075
}
10671076

media/starboard/starboard_renderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ class MEDIA_EXPORT StarboardRenderer : public Renderer,
142142
void ApplyPendingBounds();
143143
void UpdateDecoderConfig(DemuxerStream* stream);
144144
void OnDemuxerStreamRead(DemuxerStream* stream,
145+
int max_buffers,
145146
DemuxerStream::Status status,
146147
DemuxerStream::DecoderBufferVector buffers);
147148
void OnStatisticsUpdate(const PipelineStatistics& stats);
@@ -185,6 +186,7 @@ class MEDIA_EXPORT StarboardRenderer : public Renderer,
185186
const TimeDelta audio_write_duration_local_;
186187
const TimeDelta audio_write_duration_remote_;
187188
const std::string max_video_capabilities_;
189+
const int max_samples_per_write_;
188190
const gfx::Size viewport_size_;
189191
#if BUILDFLAG(IS_ANDROID)
190192
const AndroidOverlayMojoFactoryCB android_overlay_factory_cb_;
@@ -241,8 +243,6 @@ class MEDIA_EXPORT StarboardRenderer : public Renderer,
241243
Time last_time_media_time_retrieved_;
242244

243245
bool audio_read_delayed_ = false;
244-
// TODO(b/375674101): Support batched samples write.
245-
const int max_audio_samples_per_write_ = 1;
246246

247247
SbDrmSystem drm_system_{kSbDrmSystemInvalid};
248248

0 commit comments

Comments
 (0)