Encode drm metrics.

And re-try if allocated buffer was too small.

Change-Id: I495369e8cd1426a1d8c41be9e53b3b73f9bf6c0b
Signed-off-by: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
diff --git a/src/third_party/starboard/rdk/shared/drm/drm_system_ocdm.cc b/src/third_party/starboard/rdk/shared/drm/drm_system_ocdm.cc
index 7bca5e6..6a67de6 100644
--- a/src/third_party/starboard/rdk/shared/drm/drm_system_ocdm.cc
+++ b/src/third_party/starboard/rdk/shared/drm/drm_system_ocdm.cc
@@ -26,6 +26,7 @@
 #include "starboard/common/mutex.h"
 #include "starboard/shared/starboard/thread_checker.h"
 
+#include <websocket/URL.h>
 #include <opencdm/open_cdm.h>
 #include <opencdm/open_cdm_adapter.h>
 
@@ -312,16 +313,16 @@
   if (!session)
     return ERROR_INVALID_SESSION;
 
-  if (g_ocdmGstSessionDecryptBuffer != nullptr) {
-    return g_ocdmGstSessionDecryptBuffer(session, buffer, caps);
-  }
-
   if (g_ocdmGstSessionDecryptEx != nullptr) {
     return g_ocdmGstSessionDecryptEx(session, buffer,
                                      sub_sample, sub_sample_count, iv,
                                      key, 0, caps);
   }
 
+  if (g_ocdmGstSessionDecryptBuffer != nullptr) {
+    return g_ocdmGstSessionDecryptBuffer(session, buffer, caps);
+  }
+
   return opencdm_gstreamer_session_decrypt(session, buffer,
                                            sub_sample, sub_sample_count, iv,
                                            key, 0);
@@ -749,14 +750,28 @@
   if ( !g_ocdmGetMetricSystemData )
     return nullptr;
 
-  std::vector<uint8_t> tmp;
-  tmp.resize(4 * 1024);
+  int i = 1;
+  do {
+    uint32_t buffer_length =  i * 4 * 1024;
 
-  uint32_t buffer_length = tmp.size();
-  uint8_t *buffer_ptr = tmp.data();
+    std::vector<uint8_t> tmp;
+    tmp.resize(buffer_length);
 
-  if ( g_ocdmGetMetricSystemData(ocdm_system_, &buffer_length, buffer_ptr) == ERROR_NONE )
-    metrics_.assign(buffer_ptr, buffer_ptr + buffer_length);
+    auto rc = g_ocdmGetMetricSystemData(ocdm_system_, &buffer_length, tmp.data());
+    if ( rc == ERROR_BUFFER_TOO_SMALL && ++i <= 4 ) {
+      continue;
+    }
+
+    if ( rc == ERROR_NONE ) {
+      uint16_t out_length = (((buffer_length * 8) / 6) + 4) * sizeof(TCHAR);
+      metrics_.resize(out_length, '\0');
+      out_length = WPEFramework::Core::URL::Base64Encode(tmp.data(), buffer_length, reinterpret_cast<char*>(metrics_.data()), out_length, false);
+      metrics_.resize(out_length);
+    }  else  {
+      SB_LOG(ERROR) << "Failed to get drm metrics, rc = " << rc;
+    }
+
+  } while(false);
 
   *size = static_cast<int>(metrics_.size());
   return metrics_.data();