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

Unified Diff: media/filters/opus_audio_decoder.cc

Issue 259453003: Introduce AudioDiscardHelper. Refactor audio decoders to use it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments. Created 6 years, 8 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: media/filters/opus_audio_decoder.cc
diff --git a/media/filters/opus_audio_decoder.cc b/media/filters/opus_audio_decoder.cc
index 5ddc244ce952c46a18f81f9d099bc6c5e245b4ee..bbdcb3f575db482967be471d56df5d80f69b3c86 100644
--- a/media/filters/opus_audio_decoder.cc
+++ b/media/filters/opus_audio_decoder.cc
@@ -10,7 +10,7 @@
#include "base/sys_byteorder.h"
#include "media/base/audio_buffer.h"
#include "media/base/audio_decoder_config.h"
-#include "media/base/audio_timestamp_helper.h"
+#include "media/base/audio_discard_helper.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/buffers.h"
#include "media/base/decoder_buffer.h"
@@ -26,11 +26,6 @@ static uint16 ReadLE16(const uint8* data, size_t data_size, int read_offset) {
return base::ByteSwapToLE16(value);
}
-static int TimeDeltaToAudioFrames(base::TimeDelta time_delta,
- int frame_rate) {
- return std::ceil(time_delta.InSecondsF() * frame_rate);
-}
-
// The Opus specification is part of IETF RFC 6716:
// http://tools.ietf.org/html/rfc6716
@@ -251,8 +246,6 @@ OpusAudioDecoder::OpusAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
: task_runner_(task_runner),
opus_decoder_(NULL),
- last_input_timestamp_(kNoTimestamp()),
- frames_to_discard_(0),
start_input_timestamp_(kNoTimestamp()) {}
void OpusAudioDecoder::Initialize(const AudioDecoderConfig& config,
@@ -316,34 +309,20 @@ void OpusAudioDecoder::DecodeBuffer(
// Make sure we are notified if http://crbug.com/49709 returns. Issue also
// occurs with some damaged files.
- if (input->timestamp() == kNoTimestamp() &&
- output_timestamp_helper_->base_timestamp() == kNoTimestamp()) {
+ if (input->timestamp() == kNoTimestamp()) {
DLOG(ERROR) << "Received a buffer without timestamps!";
decode_cb.Run(kDecodeError, NULL);
return;
}
- if (last_input_timestamp_ != kNoTimestamp() &&
- input->timestamp() != kNoTimestamp() &&
- input->timestamp() < last_input_timestamp_) {
- base::TimeDelta diff = input->timestamp() - last_input_timestamp_;
- DLOG(ERROR) << "Input timestamps are not monotonically increasing! "
- << " ts " << input->timestamp().InMicroseconds() << " us"
- << " diff " << diff.InMicroseconds() << " us";
- decode_cb.Run(kDecodeError, NULL);
- return;
- }
-
// Apply the necessary codec delay.
if (start_input_timestamp_ == kNoTimestamp())
start_input_timestamp_ = input->timestamp();
- if (last_input_timestamp_ == kNoTimestamp() &&
+ if (!discard_helper_->initialized() &&
input->timestamp() == start_input_timestamp_) {
- frames_to_discard_ = config_.codec_delay();
+ discard_helper_->Reset(config_.codec_delay());
}
- last_input_timestamp_ = input->timestamp();
-
scoped_refptr<AudioBuffer> output_buffer;
if (!Decode(input, &output_buffer)) {
@@ -439,8 +418,7 @@ bool OpusAudioDecoder::ConfigureDecoder() {
return false;
}
- output_timestamp_helper_.reset(
- new AudioTimestampHelper(config_.samples_per_second()));
+ discard_helper_.reset(new AudioDiscardHelper(config_.samples_per_second()));
start_input_timestamp_ = kNoTimestamp();
return true;
}
@@ -453,10 +431,8 @@ void OpusAudioDecoder::CloseDecoder() {
}
void OpusAudioDecoder::ResetTimestampState() {
- output_timestamp_helper_->SetBaseTimestamp(kNoTimestamp());
- last_input_timestamp_ = kNoTimestamp();
- frames_to_discard_ = TimeDeltaToAudioFrames(config_.seek_preroll(),
- config_.samples_per_second());
+ discard_helper_->Reset(
+ discard_helper_->TimeDeltaToFrames(config_.seek_preroll()));
wolenetz 2014/04/29 00:22:44 nit: disallow negative seek_preroll() from resetti
DaleCurtis 2014/04/29 00:28:59 Check added in ConfigureDecoder() to ensure seek_p
DaleCurtis 2014/04/29 00:38:14 Actually not, since IsValidConfig() already verifi
}
bool OpusAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& input,
@@ -492,54 +468,16 @@ bool OpusAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& input,
return false;
}
- if (output_timestamp_helper_->base_timestamp() == kNoTimestamp() &&
- !input->end_of_stream()) {
- DCHECK(input->timestamp() != kNoTimestamp());
- output_timestamp_helper_->SetBaseTimestamp(input->timestamp());
- }
-
// Trim off any extraneous allocation.
DCHECK_LE(frames_decoded, output_buffer->get()->frame_count());
const int trim_frames = output_buffer->get()->frame_count() - frames_decoded;
if (trim_frames > 0)
output_buffer->get()->TrimEnd(trim_frames);
- // Handle frame discard and trimming.
- int frames_to_output = frames_decoded;
- if (frames_decoded > frames_to_discard_) {
- if (frames_to_discard_ > 0) {
- output_buffer->get()->TrimStart(frames_to_discard_);
- frames_to_output -= frames_to_discard_;
- frames_to_discard_ = 0;
- }
- if (input->discard_padding().InMicroseconds() > 0) {
- int discard_padding = TimeDeltaToAudioFrames(
- input->discard_padding(), config_.samples_per_second());
- if (discard_padding < 0 || discard_padding > frames_to_output) {
- DVLOG(1) << "Invalid file. Incorrect discard padding value.";
- return false;
- }
- output_buffer->get()->TrimEnd(discard_padding);
- frames_to_output -= discard_padding;
- } else {
- DCHECK_EQ(input->discard_padding().InMicroseconds(), 0);
- }
- } else {
- frames_to_discard_ -= frames_to_output;
- frames_to_output = 0;
- }
-
- // Discard the buffer to indicate we need more data.
- if (!frames_to_output) {
+ // Handles discards and timestamping. Discard the buffer if more data needed.
+ if (!discard_helper_->ProcessBuffers(input, *output_buffer))
*output_buffer = NULL;
- return true;
- }
- // Assign timestamp and duration to the buffer.
- output_buffer->get()->set_timestamp(output_timestamp_helper_->GetTimestamp());
- output_buffer->get()->set_duration(
- output_timestamp_helper_->GetFrameDuration(frames_to_output));
- output_timestamp_helper_->AddFrames(frames_to_output);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698