Add extra logging and null checks

Also add an option to wrap A/V memory in GstBuffer without copy.

Change-Id: Ic8933d267ca954a397698400dbfad62dae96a845
diff --git a/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc b/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
index 42397ab..b81e294 100644
--- a/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
+++ b/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
@@ -24,6 +24,7 @@
 
 #include <gst/gst.h>
 #include <gst/base/gstbasetransform.h>
+#include <gst/base/gstbytereader.h>
 
 #include <opencdm/open_cdm.h>
 
@@ -130,9 +131,26 @@
         gst_buffer_unmap(key, &map_info);
       }
 
+      uint32_t total_clear = 0;
+      uint32_t total_encrypted = 0;
+      GstMapInfo sample_map;
+      if (gst_buffer_map(subsamples, &sample_map, GST_MAP_READ)) {
+        GstByteReader* reader = gst_byte_reader_new(sample_map.data, sample_map.size);
+        for (uint32_t i = 0; i < subsample_count; ++i) {
+          uint16_t clear = 0;
+          uint32_t encrypted = 0;
+          gst_byte_reader_get_uint16_be(reader, &clear);
+          gst_byte_reader_get_uint32_be(reader, &encrypted);
+          total_clear += clear;
+          total_encrypted += encrypted;
+        }
+        gst_byte_reader_free(reader);
+        gst_buffer_unmap(subsamples, &sample_map);
+      }
+
       GST_TRACE_OBJECT(self, "buf=(%" GST_PTR_FORMAT "), "
-                       "subsample_count=%u, subsamples=(%p), iv=(%p), key=(%p : %s)",
-                       buffer, subsample_count, subsamples, iv, key, md5sum);
+                       "subsample_count=%u, subsamples=(%p), clear=%u, encrypted=%u, iv=(%p), key=(%p : %s)",
+                       buffer, subsample_count, subsamples, total_clear, total_encrypted, iv, key, md5sum);
 
       g_free(md5sum);
     }
diff --git a/src/third_party/starboard/rdk/shared/player/player_get_info.cc b/src/third_party/starboard/rdk/shared/player/player_get_info.cc
index 8094775..b4f0324 100644
--- a/src/third_party/starboard/rdk/shared/player/player_get_info.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_get_info.cc
@@ -34,10 +34,14 @@
 
 #if SB_API_VERSION >= 15
 void SbPlayerGetInfo(SbPlayer player, SbPlayerInfo* out_player_info) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->GetInfo(out_player_info);
 }
 #else   // SB_API_VERSION >= 15
 void SbPlayerGetInfo2(SbPlayer player, SbPlayerInfo2* out_player_info) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->GetInfo(out_player_info);
 }
 #endif  // SB_API_VERSION >= 15
diff --git a/src/third_party/starboard/rdk/shared/player/player_get_maximum_number_of_samples_per_write.cc b/src/third_party/starboard/rdk/shared/player/player_get_maximum_number_of_samples_per_write.cc
index edaf734..ffa7fcd 100644
--- a/src/third_party/starboard/rdk/shared/player/player_get_maximum_number_of_samples_per_write.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_get_maximum_number_of_samples_per_write.cc
@@ -35,5 +35,7 @@
 
 int SbPlayerGetMaximumNumberOfSamplesPerWrite(SbPlayer player,
                                               SbMediaType /*sample_type*/) {
+  if (player == kSbPlayerInvalid)
+    return 0;
   return player->MaxNumberOfSamplesPerWrite();
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_internal.cc b/src/third_party/starboard/rdk/shared/player/player_internal.cc
index 1f884b9..21eea0e 100644
--- a/src/third_party/starboard/rdk/shared/player/player_internal.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_internal.cc
@@ -2109,13 +2109,36 @@
       sample_deallocate_func_(player_, context_, sample_infos[0].buffer);
       return;
   }
-  GstClockTime timestamp = sample_infos[0].timestamp * kSbTimeNanosecondsPerMicrosecond;
+
+#if defined(SB_RDK_ZERO_COPY_SAMPLE_WRITE) && SB_RDK_ZERO_COPY_SAMPLE_WRITE
+  using BufferInfo = std::tuple<SbPlayerDeallocateSampleFunc, SbPlayer, void*, const void*>;
+  GstBuffer* buffer =
+    gst_buffer_new_wrapped_full(
+      static_cast<GstMemoryFlags>(0),
+      const_cast<gpointer> (sample_infos[0].buffer),
+      sample_infos[0].buffer_size,
+      0,
+      sample_infos[0].buffer_size,
+      new BufferInfo(sample_deallocate_func_, player_, context_, sample_infos[0].buffer),
+      [](gpointer data) {
+        BufferInfo &info = *reinterpret_cast<BufferInfo*>(data);
+        auto deallocate_func = std::get<0>(info);
+        auto player = std::get<1>(info);
+        auto* context = std::get<2>(info);
+        const auto* buffer = std::get<3>(info);
+        deallocate_func(player, context, buffer);
+        delete &info;
+      });
+#else
   GstBuffer* buffer =
       gst_buffer_new_allocate(nullptr, sample_infos[0].buffer_size, nullptr);
   gsize sz = gst_buffer_fill(buffer, 0, sample_infos[0].buffer, sample_infos[0].buffer_size);
   SB_DCHECK(sz == sample_infos[0].buffer_size);
-  GST_BUFFER_TIMESTAMP(buffer) = timestamp;
   sample_deallocate_func_(player_, context_, sample_infos[0].buffer);
+#endif
+
+  GstClockTime timestamp = sample_infos[0].timestamp * kSbTimeNanosecondsPerMicrosecond;
+  GST_BUFFER_TIMESTAMP(buffer) = timestamp;
 
   if (sample_infos[0].type == kSbMediaTypeVideo) {
 #if SB_API_VERSION >= 15
diff --git a/src/third_party/starboard/rdk/shared/player/player_seek.cc b/src/third_party/starboard/rdk/shared/player/player_seek.cc
index 6c8898e..69ddbce 100644
--- a/src/third_party/starboard/rdk/shared/player/player_seek.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_seek.cc
@@ -38,5 +38,7 @@
 #else   // SB_API_VERSION >= 15
 void SbPlayerSeek2(SbPlayer player, SbTime seek_to_timestamp, int ticket) {
 #endif  // SB_API_VERSION >= 15
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->Seek(seek_to_timestamp, ticket);
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_set_bounds.cc b/src/third_party/starboard/rdk/shared/player/player_set_bounds.cc
index 84c5627..20b9f7b 100644
--- a/src/third_party/starboard/rdk/shared/player/player_set_bounds.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_set_bounds.cc
@@ -39,5 +39,7 @@
                        int y,
                        int width,
                        int height) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->SetBounds(z_index, x, y, width, height);
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_set_playback_rate.cc b/src/third_party/starboard/rdk/shared/player/player_set_playback_rate.cc
index e5d2083..3923883 100644
--- a/src/third_party/starboard/rdk/shared/player/player_set_playback_rate.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_set_playback_rate.cc
@@ -34,5 +34,7 @@
 #include "third_party/starboard/rdk/shared/player/player_internal.h"
 
 bool SbPlayerSetPlaybackRate(SbPlayer player, double playback_rate) {
+  if (player == kSbPlayerInvalid)
+    return false;
   return player->player_->SetRate(playback_rate);
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_set_volume.cc b/src/third_party/starboard/rdk/shared/player/player_set_volume.cc
index 0ad39dc..728fae3 100644
--- a/src/third_party/starboard/rdk/shared/player/player_set_volume.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_set_volume.cc
@@ -34,5 +34,7 @@
 #include "third_party/starboard/rdk/shared/player/player_internal.h"
 
 void SbPlayerSetVolume(SbPlayer player, double volume) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->SetVolume(volume);
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_write_end_of_stream.cc b/src/third_party/starboard/rdk/shared/player/player_write_end_of_stream.cc
index 23fef23..1b78f87 100644
--- a/src/third_party/starboard/rdk/shared/player/player_write_end_of_stream.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_write_end_of_stream.cc
@@ -34,5 +34,7 @@
 #include "third_party/starboard/rdk/shared/player/player_internal.h"
 
 void SbPlayerWriteEndOfStream(SbPlayer player, SbMediaType stream_type) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->MarkEOS(stream_type);
 }
diff --git a/src/third_party/starboard/rdk/shared/player/player_write_sample.cc b/src/third_party/starboard/rdk/shared/player/player_write_sample.cc
index ee4dc65..8336b8e 100644
--- a/src/third_party/starboard/rdk/shared/player/player_write_sample.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_write_sample.cc
@@ -42,6 +42,8 @@
                           SbMediaType sample_type,
                           const SbPlayerSampleInfo* sample_infos,
                           int number_of_sample_infos) {
+  if (player == kSbPlayerInvalid)
+    return;
   player->player_->WriteSample(sample_type, sample_infos,
                                number_of_sample_infos);
 }