#include "tizen_src/chromium_impl/content/renderer/media/tizen/elementary_media_stream_source/common/codec_capabilities.h"
+#include <algorithm>
+#include <optional>
#include <tuple>
#include <vector>
#include "content/renderer/media/tizen/elementary_media_stream_source/common/logger.h"
#include "media/base/tizen/video_capabilities.h"
+#include "media/filters/tizen/video_decoding_capabilities.h"
namespace content::elementary_media_stream_source {
{media::VideoCodec::kVP9, {{3840, 2160}, 60}},
}};
+std::optional<gfx::Size> GetResolutionClipForCapabilities(
+ media::VideoCodecProfile profile,
+ const gfx::Size& resolution,
+ const media::SupportedVideoDecoderConfigs& decoder_capabilities) {
+ for (const auto& decoder_capability : decoder_capabilities) {
+ if (profile < decoder_capability.profile_min ||
+ profile > decoder_capability.profile_max) {
+ continue;
+ }
+ if (resolution.width() > decoder_capability.coded_size_max.width() ||
+ resolution.height() > decoder_capability.coded_size_max.height()) {
+ // Profile was found, but decoder reports resolution is lower than what
+ // was estimated based on resource manager info. Resolution should be
+ // clipped.
+ return {{decoder_capability.coded_size_max.width(),
+ decoder_capability.coded_size_max.height()}};
+ }
+ // Profile was found and decoder agrees with rm info, no need to clip.
+ return std::nullopt;
+ }
+ // Profile was not found, clip resolution to 0 to reject any potential config.
+ return {{0, 0}};
+}
+
} // anonymous namespace
std::vector<media::VideoCapability> GetVideoCapabilities(
const auto media_player_mode = player_mode == PlayerMode::kDecodeToTexture
? media::PlaybackMode::kVideoDecoder
: media::PlaybackMode::kPlayer;
- return media::GetVideoCapabilities(codec, profile, media_player_mode);
+ auto capabilities =
+ media::GetVideoCapabilities(codec, profile, media_player_mode);
+
+ // FIXME(vdwasm): There are two sources of truth regarding supported configs:
+ // * media::GetVideoCapabilities(...) in video_capabilities.h which answers
+ // whether or not hardware supports given config, which additionally takes
+ // into account video texture support preference.
+ // * media::GetVideoCapabilities() in video_decoding_capabilities.h which
+ // answers whether or not TTvd decoder declares support for a given
+ // configuration. This does not account for video texture support preference
+ // Unfortunately getting a correct answer regarding config support requires
+ // querying both sources. Those should be unified in the future...
+ const auto& decoder_capabilities = media::GetVideoCapabilities();
+ for (auto& capability : capabilities) {
+ if (auto clipped_resolution = GetResolutionClipForCapabilities(
+ profile, capability.max_resolution, decoder_capabilities)) {
+ EMSS_DEBUG_NO_INSTANCE()
+ << "Clipping capability for " << media::GetProfileName(profile)
+ << "; fps: " << capability.max_framerate
+ << ", resolution: " << capability.max_resolution.ToString() << " -> "
+ << clipped_resolution->ToString();
+ capability.max_resolution = *clipped_resolution;
+ } else {
+ EMSS_VERBOSE_NO_INSTANCE()
+ << "Discovered capability for " << media::GetProfileName(profile)
+ << "; fps: " << capability.max_framerate
+ << ", resolution: " << capability.max_resolution.ToString();
+ }
+ };
+
+ return capabilities;
}
} // namespace content::elementary_media_stream_source