| // Copyright 2018 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "starboard/shared/starboard/player/video_dmp_common.h" |
| |
| #include <limits> |
| |
| #if SB_HAS(PLAYER_FILTER_TESTS) |
| namespace starboard { |
| namespace shared { |
| namespace starboard { |
| namespace player { |
| namespace video_dmp { |
| |
| #define DEFINE_READ_AS_INT32_FUNCTION(Type) \ |
| void Read(const ReadCB& read_cb, bool reverse_byte_order, Type* value) { \ |
| SB_DCHECK(value); \ |
| int32_t int32_value; \ |
| Read(read_cb, &int32_value, sizeof(int32_value)); \ |
| if (reverse_byte_order) { \ |
| std::reverse(reinterpret_cast<uint8_t*>(&int32_value), \ |
| reinterpret_cast<uint8_t*>(&int32_value + 1)); \ |
| } \ |
| *value = static_cast<Type>(int32_value); \ |
| } |
| |
| #define DEFINE_READ_AS_UINT32_FUNCTION(Type) \ |
| void Read(const ReadCB& read_cb, bool reverse_byte_order, Type* value) { \ |
| SB_DCHECK(value); \ |
| uint32_t uint32_value; \ |
| Read(read_cb, &uint32_value, sizeof(uint32_value)); \ |
| if (reverse_byte_order) { \ |
| std::reverse(reinterpret_cast<uint8_t*>(&uint32_value), \ |
| reinterpret_cast<uint8_t*>(&uint32_value + 1)); \ |
| } \ |
| *value = static_cast<Type>(uint32_value); \ |
| } |
| |
| #define DEFINE_WRITE_AS_INT32_FUNCTION(Type) \ |
| void Write(const WriteCB& write_cb, Type value) { \ |
| int32_t int32_value = static_cast<int32_t>(value); \ |
| Write(write_cb, &int32_value, sizeof(int32_value)); \ |
| } |
| |
| #define DEFINE_WRITE_AS_UINT32_FUNCTION(Type) \ |
| void Write(const WriteCB& write_cb, Type value) { \ |
| int32_t uint32_value = static_cast<uint32_t>(value); \ |
| Write(write_cb, &uint32_value, sizeof(uint32_value)); \ |
| } |
| |
| DEFINE_READ_AS_INT32_FUNCTION(bool) |
| DEFINE_WRITE_AS_INT32_FUNCTION(bool) |
| |
| DEFINE_READ_AS_INT32_FUNCTION(int) |
| DEFINE_WRITE_AS_INT32_FUNCTION(int) |
| |
| DEFINE_READ_AS_UINT32_FUNCTION(unsigned int) |
| DEFINE_WRITE_AS_UINT32_FUNCTION(unsigned int) |
| |
| DEFINE_WRITE_AS_UINT32_FUNCTION(RecordType) |
| |
| void Read(const ReadCB& read_cb, void* buffer, size_t size) { |
| if (size == 0) { |
| return; |
| } |
| int bytes_to_read = static_cast<int>(size); |
| int bytes_read = read_cb(buffer, bytes_to_read); |
| SB_DCHECK(bytes_read == bytes_to_read); |
| } |
| |
| void Write(const WriteCB& write_cb, const void* buffer, size_t size) { |
| if (size == 0) { |
| return; |
| } |
| int bytes_to_write = static_cast<int>(size); |
| int bytes_written = write_cb(buffer, bytes_to_write); |
| SB_DCHECK(bytes_written == bytes_to_write); |
| } |
| |
| void Read(const ReadCB& read_cb, |
| bool reverse_byte_order, |
| SbMediaAudioHeaderWithConfig* audio_header) { |
| Read(read_cb, reverse_byte_order, &audio_header->format_tag); |
| Read(read_cb, reverse_byte_order, &audio_header->number_of_channels); |
| Read(read_cb, reverse_byte_order, &audio_header->samples_per_second); |
| Read(read_cb, reverse_byte_order, &audio_header->average_bytes_per_second); |
| Read(read_cb, reverse_byte_order, &audio_header->block_alignment); |
| Read(read_cb, reverse_byte_order, &audio_header->bits_per_sample); |
| Read(read_cb, reverse_byte_order, &audio_header->audio_specific_config_size); |
| audio_header->stored_audio_specific_config.resize( |
| audio_header->audio_specific_config_size); |
| #if SB_API_VERSION >= 6 |
| audio_header->audio_specific_config = |
| audio_header->stored_audio_specific_config.data(); |
| #else |
| SB_DCHECK(8 >= audio_header->stored_audio_specific_config.size()); |
| SbMemoryCopy(audio_header->audio_specific_config, |
| audio_header->stored_audio_specific_config.data(), |
| audio_header->stored_audio_specific_config.size()); |
| #endif |
| Read(read_cb, audio_header->stored_audio_specific_config.data(), |
| audio_header->audio_specific_config_size); |
| } |
| |
| void Write(const WriteCB& write_cb, const SbMediaAudioHeader& audio_header) { |
| Write(write_cb, audio_header.format_tag); |
| Write(write_cb, audio_header.number_of_channels); |
| Write(write_cb, audio_header.samples_per_second); |
| Write(write_cb, audio_header.average_bytes_per_second); |
| Write(write_cb, audio_header.block_alignment); |
| Write(write_cb, audio_header.bits_per_sample); |
| Write(write_cb, audio_header.audio_specific_config_size); |
| Write(write_cb, audio_header.audio_specific_config, |
| audio_header.audio_specific_config_size); |
| } |
| |
| void Read(const ReadCB& read_cb, |
| bool reverse_byte_order, |
| SbDrmSampleInfoWithSubSampleMapping* drm_sample_info) { |
| SB_DCHECK(drm_sample_info); |
| |
| Read(read_cb, reverse_byte_order, |
| &drm_sample_info->initialization_vector_size); |
| Read(read_cb, drm_sample_info->initialization_vector, |
| drm_sample_info->initialization_vector_size); |
| Read(read_cb, reverse_byte_order, &drm_sample_info->identifier_size); |
| Read(read_cb, drm_sample_info->identifier, drm_sample_info->identifier_size); |
| Read(read_cb, reverse_byte_order, &drm_sample_info->subsample_count); |
| drm_sample_info->stored_subsample_mapping.resize( |
| static_cast<size_t>(drm_sample_info->subsample_count)); |
| drm_sample_info->subsample_mapping = |
| drm_sample_info->stored_subsample_mapping.data(); |
| for (int i = 0; i < drm_sample_info->subsample_count; ++i) { |
| Read(read_cb, reverse_byte_order, |
| &(drm_sample_info->stored_subsample_mapping[i].clear_byte_count)); |
| Read(read_cb, reverse_byte_order, |
| &(drm_sample_info->stored_subsample_mapping[i].encrypted_byte_count)); |
| } |
| } |
| |
| void Write(const WriteCB& write_cb, const SbDrmSampleInfo& drm_sample_info) { |
| Write(write_cb, drm_sample_info.initialization_vector_size); |
| Write(write_cb, drm_sample_info.initialization_vector, |
| drm_sample_info.initialization_vector_size); |
| Write(write_cb, drm_sample_info.identifier_size); |
| Write(write_cb, drm_sample_info.identifier, drm_sample_info.identifier_size); |
| Write(write_cb, drm_sample_info.subsample_count); |
| for (int i = 0; i < drm_sample_info.subsample_count; ++i) { |
| Write(write_cb, drm_sample_info.subsample_mapping[i].clear_byte_count); |
| Write(write_cb, drm_sample_info.subsample_mapping[i].encrypted_byte_count); |
| } |
| } |
| |
| void Read(const ReadCB& read_cb, |
| bool reverse_byte_order, |
| SbMediaVideoSampleInfoWithOptionalColorMetadata* video_sample_info) { |
| Read(read_cb, reverse_byte_order, &video_sample_info->is_key_frame); |
| Read(read_cb, reverse_byte_order, &video_sample_info->frame_width); |
| Read(read_cb, reverse_byte_order, &video_sample_info->frame_height); |
| bool has_color_metadata; |
| |
| Read(read_cb, reverse_byte_order, &has_color_metadata); |
| |
| if (!has_color_metadata) { |
| video_sample_info->color_metadata = NULL; |
| return; |
| } |
| video_sample_info->color_metadata = &video_sample_info->stored_color_metadata; |
| |
| auto& color_metadata = *video_sample_info->color_metadata; |
| Read(read_cb, reverse_byte_order, &color_metadata.bits_per_channel); |
| Read(read_cb, reverse_byte_order, |
| &color_metadata.chroma_subsampling_horizontal); |
| Read(read_cb, reverse_byte_order, |
| &color_metadata.chroma_subsampling_vertical); |
| Read(read_cb, reverse_byte_order, &color_metadata.cb_subsampling_horizontal); |
| Read(read_cb, reverse_byte_order, &color_metadata.cb_subsampling_vertical); |
| Read(read_cb, reverse_byte_order, &color_metadata.chroma_siting_horizontal); |
| Read(read_cb, reverse_byte_order, &color_metadata.chroma_siting_vertical); |
| |
| auto& mastering_metadata = color_metadata.mastering_metadata; |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_r_chromaticity_x); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_r_chromaticity_y); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_g_chromaticity_x); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_g_chromaticity_y); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_b_chromaticity_x); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.primary_b_chromaticity_y); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.white_point_chromaticity_x); |
| Read(read_cb, reverse_byte_order, |
| &mastering_metadata.white_point_chromaticity_y); |
| Read(read_cb, reverse_byte_order, &mastering_metadata.luminance_max); |
| Read(read_cb, reverse_byte_order, &mastering_metadata.luminance_min); |
| |
| Read(read_cb, reverse_byte_order, &color_metadata.max_cll); |
| Read(read_cb, reverse_byte_order, &color_metadata.max_fall); |
| Read(read_cb, reverse_byte_order, &color_metadata.primaries); |
| Read(read_cb, reverse_byte_order, &color_metadata.transfer); |
| Read(read_cb, reverse_byte_order, &color_metadata.matrix); |
| Read(read_cb, reverse_byte_order, &color_metadata.range); |
| for (int i = 0; i < 12; ++i) { |
| Read(read_cb, reverse_byte_order, &color_metadata.custom_primary_matrix[i]); |
| } |
| } |
| |
| void Write(const WriteCB& write_cb, |
| const SbMediaVideoSampleInfo& video_sample_info) { |
| Write(write_cb, video_sample_info.is_key_frame); |
| Write(write_cb, video_sample_info.frame_width); |
| Write(write_cb, video_sample_info.frame_height); |
| |
| if (!video_sample_info.color_metadata) { |
| Write(write_cb, false); |
| return; |
| } |
| Write(write_cb, true); |
| |
| auto& color_metadata = *video_sample_info.color_metadata; |
| Write(write_cb, color_metadata.bits_per_channel); |
| Write(write_cb, color_metadata.chroma_subsampling_horizontal); |
| Write(write_cb, color_metadata.chroma_subsampling_vertical); |
| Write(write_cb, color_metadata.cb_subsampling_horizontal); |
| Write(write_cb, color_metadata.cb_subsampling_vertical); |
| Write(write_cb, color_metadata.chroma_siting_horizontal); |
| Write(write_cb, color_metadata.chroma_siting_vertical); |
| |
| auto& mastering_metadata = color_metadata.mastering_metadata; |
| Write(write_cb, mastering_metadata.primary_r_chromaticity_x); |
| Write(write_cb, mastering_metadata.primary_r_chromaticity_y); |
| Write(write_cb, mastering_metadata.primary_g_chromaticity_x); |
| Write(write_cb, mastering_metadata.primary_g_chromaticity_y); |
| Write(write_cb, mastering_metadata.primary_b_chromaticity_x); |
| Write(write_cb, mastering_metadata.primary_b_chromaticity_y); |
| Write(write_cb, mastering_metadata.white_point_chromaticity_x); |
| Write(write_cb, mastering_metadata.white_point_chromaticity_y); |
| Write(write_cb, mastering_metadata.luminance_max); |
| Write(write_cb, mastering_metadata.luminance_min); |
| |
| Write(write_cb, color_metadata.max_cll); |
| Write(write_cb, color_metadata.max_fall); |
| Write(write_cb, color_metadata.primaries); |
| Write(write_cb, color_metadata.transfer); |
| Write(write_cb, color_metadata.matrix); |
| Write(write_cb, color_metadata.range); |
| for (int i = 0; i < 12; ++i) { |
| Write(write_cb, color_metadata.custom_primary_matrix[i]); |
| } |
| } |
| |
| } // namespace video_dmp |
| } // namespace player |
| } // namespace starboard |
| } // namespace shared |
| } // namespace starboard |
| #endif // SB_HAS(PLAYER_FILTER_TESTS) |