Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Unified Diff: content/renderer/pepper/content_decryptor_delegate.cc

Issue 26956002: Plumb support for audio sample formats. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix cast. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/pepper/content_decryptor_delegate.cc
diff --git a/content/renderer/pepper/content_decryptor_delegate.cc b/content/renderer/pepper/content_decryptor_delegate.cc
index 3c9dce26496cdbb922b533ae3c80c0a0d15d3784..7ebceb1b2738fa631c6fa33f72e0c308c5f1bcb8 100644
--- a/content/renderer/pepper/content_decryptor_delegate.cc
+++ b/content/renderer/pepper/content_decryptor_delegate.cc
@@ -218,6 +218,27 @@ PP_DecryptorStreamType MediaDecryptorStreamTypeToPpStreamType(
}
}
+media::SampleFormat PpDecryptedSampleFormatToMediaSampleFormat(
+ PP_DecryptedSampleFormat result) {
+ switch (result) {
+ case PP_DECRYPTEDSAMPLEFORMAT_U8:
+ return media::kSampleFormatU8;
+ case PP_DECRYPTEDSAMPLEFORMAT_S16:
+ return media::kSampleFormatS16;
+ case PP_DECRYPTEDSAMPLEFORMAT_S32:
+ return media::kSampleFormatS32;
+ case PP_DECRYPTEDSAMPLEFORMAT_F32:
+ return media::kSampleFormatF32;
+ case PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16:
+ return media::kSampleFormatPlanarS16;
+ case PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32:
+ return media::kSampleFormatPlanarF32;
+ default:
+ NOTREACHED();
+ return media::kUnknownSampleFormat;
+ }
+}
+
} // namespace
ContentDecryptorDelegate::ContentDecryptorDelegate(
@@ -232,10 +253,8 @@ ContentDecryptorDelegate::ContentDecryptorDelegate(
pending_video_decoder_init_request_id_(0),
pending_audio_decode_request_id_(0),
pending_video_decode_request_id_(0),
- audio_sample_format_(media::kUnknownSampleFormat),
audio_samples_per_second_(0),
audio_channel_count_(0),
- audio_bytes_per_frame_(0),
weak_ptr_factory_(this) {
weak_this_ = weak_ptr_factory_.GetWeakPtr();
}
@@ -405,10 +424,8 @@ bool ContentDecryptorDelegate::InitializeAudioDecoder(
pp_decoder_config.samples_per_second = decoder_config.samples_per_second();
pp_decoder_config.request_id = next_decryption_request_id_++;
- audio_sample_format_ = decoder_config.sample_format();
audio_samples_per_second_ = pp_decoder_config.samples_per_second;
audio_channel_count_ = pp_decoder_config.channel_count;
- audio_bytes_per_frame_ = decoder_config.bytes_per_frame();
scoped_refptr<PPB_Buffer_Impl> extra_data_resource;
if (!MakeBufferResource(pp_instance_,
@@ -852,12 +869,12 @@ void ContentDecryptorDelegate::DeliverFrame(
void ContentDecryptorDelegate::DeliverSamples(
PP_Resource audio_frames,
- const PP_DecryptedBlockInfo* block_info) {
- DCHECK(block_info);
+ const PP_DecryptedSampleInfo* sample_info) {
+ DCHECK(sample_info);
- FreeBuffer(block_info->tracking_info.buffer_id);
+ FreeBuffer(sample_info->tracking_info.buffer_id);
- const uint32_t request_id = block_info->tracking_info.request_id;
+ const uint32_t request_id = sample_info->tracking_info.request_id;
DVLOG(2) << "DeliverSamples() - request_id: " << request_id;
// If the request ID is not valid or does not match what's saved, do nothing.
@@ -874,15 +891,19 @@ void ContentDecryptorDelegate::DeliverSamples(
const media::Decryptor::AudioBuffers empty_frames;
media::Decryptor::Status status =
- PpDecryptResultToMediaDecryptorStatus(block_info->result);
+ PpDecryptResultToMediaDecryptorStatus(sample_info->result);
if (status != media::Decryptor::kSuccess) {
audio_decode_cb.Run(status, empty_frames);
return;
}
+ media::SampleFormat sample_format =
+ PpDecryptedSampleFormatToMediaSampleFormat(sample_info->format);
+
media::Decryptor::AudioBuffers audio_frame_list;
if (!DeserializeAudioFrames(audio_frames,
- block_info->data_size,
+ sample_info->data_size,
+ sample_format,
&audio_frame_list)) {
NOTREACHED() << "CDM did not serialize the buffer correctly.";
audio_decode_cb.Run(media::Decryptor::kError, empty_frames);
@@ -995,6 +1016,7 @@ void ContentDecryptorDelegate::SetBufferToFreeInTrackingInfo(
bool ContentDecryptorDelegate::DeserializeAudioFrames(
PP_Resource audio_frames,
size_t data_size,
+ media::SampleFormat sample_format,
media::Decryptor::AudioBuffers* frames) {
DCHECK(frames);
EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true);
@@ -1012,6 +1034,13 @@ bool ContentDecryptorDelegate::DeserializeAudioFrames(
const uint8* cur = static_cast<uint8*>(mapper.data());
size_t bytes_left = data_size;
+ const int audio_bytes_per_frame =
+ media::SampleFormatToBytesPerChannel(sample_format) *
+ audio_channel_count_;
+
+ // Allocate space for the channel pointers given to AudioBuffer.
+ std::vector<const uint8*> channel_ptrs(
+ audio_channel_count_, static_cast<const uint8*>(NULL));
do {
int64 timestamp = 0;
int64 frame_size = -1;
@@ -1034,13 +1063,18 @@ bool ContentDecryptorDelegate::DeserializeAudioFrames(
return false;
}
- const uint8* data[] = {cur};
- int frame_count = frame_size / audio_bytes_per_frame_;
+ // Setup channel pointers. AudioBuffer::CopyFrom() will only use the first
+ // one in the case of interleaved data.
+ const int size_per_channel = frame_size / audio_channel_count_;
+ for (int i = 0; i < audio_channel_count_; ++i)
+ channel_ptrs[i] = cur + i * size_per_channel;
+
+ const int frame_count = frame_size / audio_bytes_per_frame;
scoped_refptr<media::AudioBuffer> frame = media::AudioBuffer::CopyFrom(
- audio_sample_format_,
+ sample_format,
audio_channel_count_,
frame_count,
- data,
+ &channel_ptrs[0],
base::TimeDelta::FromMicroseconds(timestamp),
base::TimeDelta::FromMicroseconds(audio_samples_per_second_ /
frame_count));
« no previous file with comments | « content/renderer/pepper/content_decryptor_delegate.h ('k') | content/renderer/pepper/pepper_plugin_instance_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698