PREMIUMAPP-854: NPLB Test- SbMediaCanPlayMimeAndKeySystem.ValidatePerformance failure

Reason for change: Caching supported decorders in platform for passing
SbMediaCanPlayMimeAndKeySystem.ValidatePerformance nplb test.

Test Procedure: Refer ticket
Risks: None
Signed-off-by: Vaisakh Anand <vaisakh_anand@comcast.com>
Change-Id: I6fee781957eed50121e17bc5eacc1758eedba481
diff --git a/src/third_party/starboard/rdk/shared/media/gst_media_utils.cc b/src/third_party/starboard/rdk/shared/media/gst_media_utils.cc
index 4f19891..934c5c8 100644
--- a/src/third_party/starboard/rdk/shared/media/gst_media_utils.cc
+++ b/src/third_party/starboard/rdk/shared/media/gst_media_utils.cc
@@ -15,6 +15,7 @@
 //
 // SPDX-License-Identifier: Apache-2.0
 #include <memory>
+#include <map>
 #include <type_traits>
 
 #include <glib.h>
@@ -56,18 +57,14 @@
 }
 
 template <typename C>
-bool GstRegistryHasElementForCodec(C codec) {
+bool GstRegistryHasElementForCodecImpl(C codec) {
   static_assert(std::is_same<C, SbMediaVideoCodec>::value ||
                 std::is_same<C, SbMediaAudioCodec>::value, "Invalid codec");
   auto type = std::is_same<C, SbMediaVideoCodec>::value
                   ? GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO
                   : GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO;
-  UniqueFeatureList parser_factories{gst_element_factory_list_get_elements(
-      GST_ELEMENT_FACTORY_TYPE_PARSER | type, GST_RANK_MARGINAL)};
   UniqueFeatureList decoder_factories{gst_element_factory_list_get_elements(
       GST_ELEMENT_FACTORY_TYPE_DECODER | type, GST_RANK_MARGINAL)};
-  // UniqueFeatureList demuxer_factories{gst_element_factory_list_get_elements(
-  //     GST_ELEMENT_FACTORY_TYPE_DEMUXER, GST_RANK_MARGINAL)};
 
   UniqueFeatureList elements;
   std::vector<std::string> caps;
@@ -93,6 +90,9 @@
     return true;
   }
 
+  UniqueFeatureList parser_factories{gst_element_factory_list_get_elements(
+      GST_ELEMENT_FACTORY_TYPE_PARSER | type, GST_RANK_MARGINAL)};
+
   SB_DLOG(INFO) << "No decoder for codec " << codec << ". Falling back to parsers.";
   // No decoder. Check if there's a parser and a decoder accepting its caps.
   for (auto single_caps : caps) {
@@ -129,6 +129,17 @@
   return false;
 }
 
+template <typename C>
+bool GstRegistryHasElementForCodec(C codec) {
+  static std::map<C, bool> cache;
+  auto it = cache.find(codec);
+  if (it != cache.end())
+    return it->second;
+  bool r = GstRegistryHasElementForCodecImpl(codec);
+  cache[codec] = r;
+  return r;
+}
+
 }  // namespace
 
 bool GstRegistryHasElementForMediaType(SbMediaVideoCodec codec) {