[TTVD] Fix config updating when starting from partial view 04/318004/7
authorJakub Gajownik <j.gajownik2@samsung.com>
Mon, 16 Sep 2024 18:01:44 +0000 (20:01 +0200)
committerBot Blink <blinkbot@samsung.com>
Mon, 23 Sep 2024 13:03:07 +0000 (13:03 +0000)
Video decoder might enter partial view mode before updating
config. In such situation, when it gets resumed, we didn't
had proper config set before this patch.
The problem is that first decoded after resuming might not
refer to keyframe what makes parsing not very helpful.

This change ensures that config is updated using first
keyframe and previous buffer are ignored.

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

index 26cc4101218d3d45c3386f1e1a60e96cdc6360df..5adf8f183e914d62287418663a11c7eea4c02f47 100644 (file)
@@ -426,6 +426,11 @@ void TTvdVideoDecoderImpl::Decode(scoped_refptr<DecoderBuffer> buffer,
           base::BindOnce(std::move(decode_cb), DecoderStatus::Codes::kFailed));
       return;
     case DecoderState::kLazyInitializing:
+      if (needs_keyframe_ && !buffer->is_key_frame()) {
+        RequestKeyframe(std::move(decode_cb));
+        return;
+      }
+
       TIZEN_MEDIA_LOG(VERBOSE) << "Continue lazy inititalization";
       UpdateConfig(&config_, *buffer.get());
       HandleDecodingRequest(buffer, std::move(decode_cb));
@@ -627,21 +632,7 @@ void TTvdVideoDecoderImpl::HandleDecodingRequest(
 
   if (needs_keyframe_) {
     if (!buffer->is_key_frame()) {
-      if (config_.is_rtc()) {
-        if (!keyframe_requested_) {
-          TIZEN_MEDIA_LOG(INFO) << "Non keyframe after switching, request one: "
-                                << buffer->timestamp();
-          std::move(decode_cb).Run(DecoderStatus::Codes::kKeyFrameRequired);
-          keyframe_requested_ = true;
-        } else {
-          std::move(decode_cb).Run(DecoderStatus::Codes::kOk);
-        }
-        return;
-      }
-
-      TIZEN_MEDIA_LOG(ERROR) << "Non keyframe received when it's required: "
-                             << buffer->timestamp();
-      std::move(decode_cb).Run(DecoderStatus::Codes::kOk);
+      RequestKeyframe(std::move(decode_cb));
       return;
     }
     needs_keyframe_ = false;
@@ -989,11 +980,10 @@ void TTvdVideoDecoderImpl::Resume() {
   needs_keyframe_ = !SkipDecodingUptoKeyframe();
   keyframe_requested_ = false;
 
-  decoder_state_ = DecoderState::kLazyInitializeProcess;
+  decoder_state_ = DecoderState::kLazyInitializing;
   // Notify this collection is renderable, because it could be blocked by
   // resource conflict before suspending this process.
   output_surface_manager_->NotifyCollectionCreate(collection_token_);
-  InitializeInternal();
 }
 
 void TTvdVideoDecoderImpl::ReleaseResources() {
@@ -2152,6 +2142,26 @@ void TTvdVideoDecoderImpl::TriggerEos() {
   std::move(eos_cb_).Run(DecoderStatus::Codes::kOk);
 }
 
+void TTvdVideoDecoderImpl::RequestKeyframe(VideoDecoder::DecodeCB decode_cb) {
+  if (!config_.is_rtc()) {
+    // Non-RTC pipeline doesn't have any method allowing to request keyframe.
+    // Is such case just wait until we'll reach one.
+    TIZEN_MEDIA_LOG(ERROR) << "Non keyframe received when it's required";
+    std::move(decode_cb).Run(DecoderStatus::Codes::kOk);
+    return;
+  }
+
+  if (!keyframe_requested_) {
+    TIZEN_MEDIA_LOG(INFO) << "Non keyframe after switching, request one";
+    std::move(decode_cb).Run(DecoderStatus::Codes::kKeyFrameRequired);
+    keyframe_requested_ = true;
+  } else {
+    // Keyframe might not be immediate after requesting (or other side might not
+    // support it). Similarly to standard pipeline just wait until there is one.
+    std::move(decode_cb).Run(DecoderStatus::Codes::kOk);
+  }
+}
+
 std::ostream& operator<<(std::ostream& o,
                          TTvdVideoDecoderImpl::DecoderState state) {
   switch (state) {
index b546f9873106b2ab4b643bb52ede2268e12e566b..25e9a78397146d9e0ee3846b5c41d4e2bcb3370d 100644 (file)
@@ -260,6 +260,8 @@ class MEDIA_EXPORT TTvdVideoDecoderImpl {
   // in |decoding_requests_|.
   void TriggerEos();
 
+  void RequestKeyframe(VideoDecoder::DecodeCB decode_cb);
+
   const gpu::GpuDriverBugWorkarounds workarounds_;
 
   DecoderState decoder_state_ = DecoderState::kCreated;