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

Side by Side Diff: content/renderer/media/android/audio_decoder_android.cc

Issue 164023007: Correctly handle any number of channels in WebAudio file decoder on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/android/audio_decoder_android.h" 5 #include "content/renderer/media/android/audio_decoder_android.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <limits.h> 9 #include <limits.h>
10 #include <sys/mman.h> 10 #include <sys/mman.h>
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 blink::WebAudioBus* destination_bus, 398 blink::WebAudioBus* destination_bus,
399 size_t number_of_frames, 399 size_t number_of_frames,
400 unsigned number_of_channels, 400 unsigned number_of_channels,
401 double file_sample_rate) { 401 double file_sample_rate) {
402 destination_bus->initialize(number_of_channels, 402 destination_bus->initialize(number_of_channels,
403 number_of_frames, 403 number_of_frames,
404 file_sample_rate); 404 file_sample_rate);
405 405
406 int16_t pipe_data[PIPE_BUF / sizeof(int16_t)]; 406 int16_t pipe_data[PIPE_BUF / sizeof(int16_t)];
407 size_t decoded_frames = 0; 407 size_t decoded_frames = 0;
408 size_t current_sample_in_frame = 0;
408 ssize_t nread; 409 ssize_t nread;
409 410
410 while ((nread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data)))) > 411 while ((nread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data)))) >
411 0) { 412 0) {
412 size_t samples_in_pipe = nread / sizeof(int16_t); 413 size_t samples_in_pipe = nread / sizeof(int16_t);
413 for (size_t m = 0; m < samples_in_pipe; m += number_of_channels) { 414
415 // The pipe may not contain a whole number of frames. This is
416 // especially true if the number of channels is greater than
417 // 2. Thus, keep track of which sample in a frame is being
418 // processed, so we handle the boundary at the end of the pipe
419 // correctly.
420 for (size_t m = 0; m < samples_in_pipe; ++m) {
414 if (decoded_frames >= number_of_frames) 421 if (decoded_frames >= number_of_frames)
415 break; 422 break;
416 423
417 for (size_t k = 0; k < number_of_channels; ++k) { 424 destination_bus->channelData(current_sample_in_frame)[decoded_frames] =
418 int16_t sample = pipe_data[m + k]; 425 ConvertSampleToFloat(pipe_data[m]);
419 destination_bus->channelData(k)[decoded_frames] = 426 ++current_sample_in_frame;
420 ConvertSampleToFloat(sample); 427
428 if (current_sample_in_frame >= number_of_channels) {
429 current_sample_in_frame = 0;
430 ++decoded_frames;
421 } 431 }
422 ++decoded_frames;
423 } 432 }
424 } 433 }
425 434
426 // number_of_frames is only an estimate. Resize the buffer with the 435 // number_of_frames is only an estimate. Resize the buffer with the
427 // actual number of received frames. 436 // actual number of received frames.
428 if (decoded_frames < number_of_frames) 437 if (decoded_frames < number_of_frames)
429 destination_bus->resizeSmaller(decoded_frames); 438 destination_bus->resizeSmaller(decoded_frames);
430 } 439 }
431 440
432 // The number of frames is unknown, so keep reading and buffering 441 // The number of frames is unknown, so keep reading and buffering
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 BufferAndCopyPcmDataToBus(input_fd, 574 BufferAndCopyPcmDataToBus(input_fd,
566 destination_bus, 575 destination_bus,
567 number_of_channels, 576 number_of_channels,
568 file_sample_rate); 577 file_sample_rate);
569 } 578 }
570 579
571 return true; 580 return true;
572 } 581 }
573 582
574 } // namespace content 583 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698