const bool has_best_first_frame = !is_eos && HasBestFirstFrame(*frame);
const auto format = frame->format();
const auto natural_size = frame->natural_size();
+ const auto has_overlay = frame->metadata().overlay_plane_id.has_value();
if (is_eos) {
DCHECK(!received_end_of_stream_);
if (latency_hint_.has_value() && !latency_hint_->is_zero())
UpdateLatencyHintBufferingCaps_Locked(frame_duration);
+ MaybeUpdateOverlayBufferingCaps_Locked(has_overlay);
+
// Signal buffering state if we've met our conditions.
if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked())
TransitionToHaveEnough_Locked();
last_reported_memory_usage_ = total_video_memory;
}
+void TTvdVideoRenderer::MaybeUpdateOverlayBufferingCaps_Locked(
+ bool frame_with_overlay) {
+ if (last_frame_with_overlay_ == frame_with_overlay) {
+ return;
+ }
+
+ last_frame_with_overlay_ = frame_with_overlay;
+
+ if (latency_hint_.has_value()) {
+ return;
+ }
+
+ max_buffered_frames_ = last_frame_with_overlay_
+ ? initial_buffering_size_.value()
+ : kAbsoluteMaxFrames;
+}
+
} // namespace media
// Called by decoder to indicate new total memory used for held video frames.
void OnTotalMemoryUsageReport(int64_t total_video_memory);
+ void MaybeUpdateOverlayBufferingCaps_Locked(bool frame_with_overlay);
+
scoped_refptr<base::SequencedTaskRunner> task_runner_;
// Sink which calls into TTvdVideoRenderer via Render() for video frames. Do
// When set, it's prefered when sending pipeline statistics.
absl::optional<int64_t> last_reported_memory_usage_;
+ // Holds whether last decoded frame was assumed to be render using overlay.
+ bool last_frame_with_overlay_ = false;
+
// Value saved from last call to SetLatencyHint(). Used to recompute buffering
// limits as framerate fluctuates.
absl::optional<base::TimeDelta> latency_hint_;