Treat color space changes as config changes.
It turns out some decoding pipelines don't reliably support just
evicting picture buffers. We need to actual go through a full
reset of the underlying decoder to avoid issues.
This removes the kColorSpaceChange constant and adds a feature
flag controlling the usage of color space changes (enabled by
default).
R=andrescj, sandersd
Bug: 1474191
Change-Id: I36e1e8beb02274776043d0ebc115d1048993102f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4919595
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Andres Calderon Jaramillo <andrescj@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1207936}
diff --git a/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc
index 8dfb1a85..9f71d15 100644
--- a/media/gpu/vp9_decoder.cc
+++ b/media/gpu/vp9_decoder.cc
@@ -291,6 +291,12 @@
DCHECK(!new_pic_size.IsEmpty());
+ bool is_color_space_change = false;
+ if (base::FeatureList::IsEnabled(kAVDColorSpaceChanges)) {
+ is_color_space_change = new_color_space.IsSpecified() &&
+ new_color_space != picture_color_space_;
+ }
+
const bool is_pic_size_different = new_pic_size != pic_size_;
const bool is_pic_size_larger = new_pic_size.width() > pic_size_.width() ||
new_pic_size.height() > pic_size_.height();
@@ -298,13 +304,15 @@
(ignore_resolution_changes_to_smaller_for_testing_
? is_pic_size_larger
: is_pic_size_different) ||
- new_profile != profile_ || curr_frame_hdr_->bit_depth != bit_depth_;
+ new_profile != profile_ || curr_frame_hdr_->bit_depth != bit_depth_ ||
+ is_color_space_change;
if (is_new_configuration_different_enough) {
DVLOG(1) << "New profile: " << GetProfileName(new_profile)
<< ", new resolution: " << new_pic_size.ToString()
<< ", new bit depth: "
- << base::strict_cast<int>(curr_frame_hdr_->bit_depth);
+ << base::strict_cast<int>(curr_frame_hdr_->bit_depth)
+ << ", new color space: " << new_color_space.ToString();
if (!curr_frame_hdr_->IsKeyframe() &&
!(curr_frame_hdr_->IsIntra() && pic_size_.IsEmpty())) {
@@ -339,19 +347,6 @@
return kConfigChange;
}
- if (new_color_space.IsSpecified() &&
- new_color_space != picture_color_space_ &&
- curr_frame_hdr_->IsKeyframe()) {
- // TODO(posciak): This requires us to be on a keyframe (see above) and is
- // required, because VDA clients expect all surfaces to be returned before
- // they can cycle surface sets after receiving kConfigChange.
- // This is only an implementation detail of VDAs and can be improved.
- ref_frames_.Clear();
-
- picture_color_space_ = new_color_space;
- return kColorSpaceChange;
- }
-
scoped_refptr<VP9Picture> pic = accelerator_->CreateVP9Picture();
if (!pic) {
return kRanOutOfSurfaces;