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); }