[TTVD] Increase video buffering in overlay mode 08/325108/1
authorJakub Gajownik <j.gajownik2@samsung.com>
Wed, 21 May 2025 06:37:32 +0000 (08:37 +0200)
committerj.gajownik2 <j.gajownik2@samsung.com>
Tue, 3 Jun 2025 10:07:25 +0000 (10:07 +0000)
When using hardware video decoder, we can enter overlay
mode that's not consuming memory for decoded video frame.
In such scenario, we can increase maximum number of decoded
frames without negative impact on memory usage. Doing so
helps with video frame processing stability in case there
are any stalls in pipeline.
Additionally, for encrypted contents platform video decoder
requires more input data to be buffered to return frames
on time.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-710
Change-Id: Ic733c1b4ee648e48558ca54723bc2b549a893819
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
media/filters/tizen/ttvd_video_renderer.cc
media/filters/tizen/ttvd_video_renderer.h

index 8886d979d348f185fd7823a64f9e934892686b0e..f7f20904af3689b255cf6c40d140f0c98a18d467 100644 (file)
@@ -936,6 +936,7 @@ void TTvdVideoRenderer::FrameReady(VideoDecoderStream::ReadResult result) {
   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_);
@@ -1025,6 +1026,8 @@ void TTvdVideoRenderer::FrameReady(VideoDecoderStream::ReadResult result) {
   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();
@@ -1440,4 +1443,21 @@ void TTvdVideoRenderer::OnTotalMemoryUsageReport(int64_t total_video_memory) {
   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
index 804c294f461a744e17907506958b5f1259608a52..4acf248a6ff4ca0676c80b0c9439abe298c6fcb5 100644 (file)
@@ -252,6 +252,8 @@ class MEDIA_EXPORT TTvdVideoRenderer
   // 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
@@ -426,6 +428,9 @@ class MEDIA_EXPORT TTvdVideoRenderer
   // 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_;