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