summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 01:00:04 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-18 01:00:04 +0000
commit75d635c78f301925930e7e29139ff74fd4c46e02 (patch)
tree91e56bf699345d71f3182b251fb91e4a141185b2
parentda200edb64edd5b27b4a3627f3b8a78241c94f46 (diff)
downloadchromium_src-75d635c78f301925930e7e29139ff74fd4c46e02.zip
chromium_src-75d635c78f301925930e7e29139ff74fd4c46e02.tar.gz
chromium_src-75d635c78f301925930e7e29139ff74fd4c46e02.tar.bz2
Revert 177550
> Tighten up media::DecoderBuffer API contract for end of stream buffers. > > Folks shouldn't be calling methods on end of stream buffers since the definition is undefined. > > Review URL: https://codereview.chromium.org/11993002 TBR=scherkus@chromium.org Review URL: https://codereview.chromium.org/11926010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@177556 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--media/base/data_buffer.h2
-rw-r--r--media/base/decoder_buffer.cc22
-rw-r--r--media/base/decoder_buffer.h13
-rw-r--r--media/base/stream_parser_buffer.cc4
-rw-r--r--media/filters/ffmpeg_audio_decoder.cc9
-rw-r--r--media/filters/ffmpeg_demuxer_unittest.cc2
-rw-r--r--media/filters/ffmpeg_video_decoder.cc32
7 files changed, 22 insertions, 62 deletions
diff --git a/media/base/data_buffer.h b/media/base/data_buffer.h
index 5c02dd6..76215c8 100644
--- a/media/base/data_buffer.h
+++ b/media/base/data_buffer.h
@@ -17,8 +17,6 @@ namespace media {
//
// Unlike DecoderBuffer, allocations are assumed to be allocated with the
// default memory allocator (i.e., new uint8[]).
-//
-// NOTE: It is illegal to call any method when IsEndOfStream() is true.
class MEDIA_EXPORT DataBuffer : public base::RefCountedThreadSafe<DataBuffer> {
public:
// Allocates buffer of size |buffer_size| >= 0.
diff --git a/media/base/decoder_buffer.cc b/media/base/decoder_buffer.cc
index 03f9bbb..a07ffac 100644
--- a/media/base/decoder_buffer.cc
+++ b/media/base/decoder_buffer.cc
@@ -48,47 +48,38 @@ scoped_refptr<DecoderBuffer> DecoderBuffer::CreateEOSBuffer() {
}
base::TimeDelta DecoderBuffer::GetTimestamp() const {
- DCHECK(!IsEndOfStream());
return timestamp_;
}
void DecoderBuffer::SetTimestamp(const base::TimeDelta& timestamp) {
- DCHECK(!IsEndOfStream());
timestamp_ = timestamp;
}
base::TimeDelta DecoderBuffer::GetDuration() const {
- DCHECK(!IsEndOfStream());
return duration_;
}
void DecoderBuffer::SetDuration(const base::TimeDelta& duration) {
- DCHECK(!IsEndOfStream());
duration_ = duration;
}
const uint8* DecoderBuffer::GetData() const {
- DCHECK(!IsEndOfStream());
return data_.get();
}
uint8* DecoderBuffer::GetWritableData() const {
- DCHECK(!IsEndOfStream());
return data_.get();
}
int DecoderBuffer::GetDataSize() const {
- DCHECK(!IsEndOfStream());
return size_;
}
const DecryptConfig* DecoderBuffer::GetDecryptConfig() const {
- DCHECK(!IsEndOfStream());
return decrypt_config_.get();
}
void DecoderBuffer::SetDecryptConfig(scoped_ptr<DecryptConfig> decrypt_config) {
- DCHECK(!IsEndOfStream());
decrypt_config_ = decrypt_config.Pass();
}
@@ -96,17 +87,4 @@ bool DecoderBuffer::IsEndOfStream() const {
return data_ == NULL;
}
-std::string DecoderBuffer::AsHumanReadableString() {
- if (IsEndOfStream()) {
- return "end of stream";
- }
-
- std::ostringstream s;
- s << "timestamp: " << timestamp_.InMicroseconds()
- << " duration: " << duration_.InMicroseconds()
- << " size: " << size_
- << " encrypted: " << (decrypt_config_ != NULL);
- return s.str();
-}
-
} // namespace media
diff --git a/media/base/decoder_buffer.h b/media/base/decoder_buffer.h
index c23e88f..7cb496b 100644
--- a/media/base/decoder_buffer.h
+++ b/media/base/decoder_buffer.h
@@ -5,8 +5,6 @@
#ifndef MEDIA_BASE_DECODER_BUFFER_H_
#define MEDIA_BASE_DECODER_BUFFER_H_
-#include <string>
-
#include "base/memory/aligned_memory.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -25,8 +23,6 @@ class DecryptConfig;
// allocated using FFmpeg with particular alignment and padding requirements.
//
// Also includes decoder specific functionality for decryption.
-//
-// NOTE: It is illegal to call any method when IsEndOfStream() is true.
class MEDIA_EXPORT DecoderBuffer
: public base::RefCountedThreadSafe<DecoderBuffer> {
public:
@@ -47,10 +43,8 @@ class MEDIA_EXPORT DecoderBuffer
// padded and aligned as necessary. |data| must not be NULL and |size| >= 0.
static scoped_refptr<DecoderBuffer> CopyFrom(const uint8* data, int size);
- // Create a DecoderBuffer indicating we've reached end of stream.
- //
- // Calling any method other than IsEndOfStream() on the resulting buffer
- // is disallowed.
+ // Create a DecoderBuffer indicating we've reached end of stream. GetData()
+ // and GetWritableData() will return NULL and GetDataSize() will return 0.
static scoped_refptr<DecoderBuffer> CreateEOSBuffer();
base::TimeDelta GetTimestamp() const;
@@ -70,9 +64,6 @@ class MEDIA_EXPORT DecoderBuffer
// If there's no data in this buffer, it represents end of stream.
bool IsEndOfStream() const;
- // Returns a human-readable string describing |*this|.
- std::string AsHumanReadableString();
-
protected:
friend class base::RefCountedThreadSafe<DecoderBuffer>;
diff --git a/media/base/stream_parser_buffer.cc b/media/base/stream_parser_buffer.cc
index 1814382..13e649e 100644
--- a/media/base/stream_parser_buffer.cc
+++ b/media/base/stream_parser_buffer.cc
@@ -35,9 +35,7 @@ StreamParserBuffer::StreamParserBuffer(const uint8* data, int data_size,
is_keyframe_(is_keyframe),
decode_timestamp_(kNoTimestamp()),
config_id_(kInvalidConfigId) {
- if (data) {
- SetDuration(kNoTimestamp());
- }
+ SetDuration(kNoTimestamp());
}
StreamParserBuffer::~StreamParserBuffer() {
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index 941f79c..941bd43 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -351,13 +351,8 @@ void FFmpegAudioDecoder::RunDecodeLoop(
bool skip_eos_append) {
AVPacket packet;
av_init_packet(&packet);
- if (input->IsEndOfStream()) {
- packet.data = NULL;
- packet.size = 0;
- } else {
- packet.data = const_cast<uint8*>(input->GetData());
- packet.size = input->GetDataSize();
- }
+ packet.data = const_cast<uint8*>(input->GetData());
+ packet.size = input->GetDataSize();
// Each audio packet may contain several frames, so we must call the decoder
// until we've exhausted the packet. Regardless of the packet size we always
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
index 72b64ae..d1c2c04 100644
--- a/media/filters/ffmpeg_demuxer_unittest.cc
+++ b/media/filters/ffmpeg_demuxer_unittest.cc
@@ -45,6 +45,8 @@ static void EosOnReadDone(bool* got_eos_buffer,
EXPECT_EQ(status, DemuxerStream::kOk);
if (buffer->IsEndOfStream()) {
*got_eos_buffer = true;
+ EXPECT_TRUE(!buffer->GetData());
+ EXPECT_EQ(buffer->GetDataSize(), 0);
return;
}
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index 0459833..d7bbf82 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -309,7 +309,7 @@ void FFmpegVideoDecoder::DecodeBuffer(
}
// Any successful decode counts!
- if (!buffer->IsEndOfStream() && buffer->GetDataSize() > 0) {
+ if (buffer->GetDataSize()) {
PipelineStatistics statistics;
statistics.video_bytes_decoded = buffer->GetDataSize();
statistics_cb_.Run(statistics);
@@ -336,27 +336,22 @@ bool FFmpegVideoDecoder::Decode(
scoped_refptr<VideoFrame>* video_frame) {
DCHECK(video_frame);
- // Reset frame to default values.
- avcodec_get_frame_defaults(av_frame_);
-
// Create a packet for input data.
// Due to FFmpeg API changes we no longer have const read-only pointers.
AVPacket packet;
av_init_packet(&packet);
- if (buffer->IsEndOfStream()) {
- packet.data = NULL;
- packet.size = 0;
- } else {
- packet.data = const_cast<uint8*>(buffer->GetData());
- packet.size = buffer->GetDataSize();
+ packet.data = const_cast<uint8*>(buffer->GetData());
+ packet.size = buffer->GetDataSize();
- // Let FFmpeg handle presentation timestamp reordering.
- codec_context_->reordered_opaque = buffer->GetTimestamp().InMicroseconds();
+ // Let FFmpeg handle presentation timestamp reordering.
+ codec_context_->reordered_opaque = buffer->GetTimestamp().InMicroseconds();
- // This is for codecs not using get_buffer to initialize
- // |av_frame_->reordered_opaque|
- av_frame_->reordered_opaque = codec_context_->reordered_opaque;
- }
+ // Reset frame to default values.
+ avcodec_get_frame_defaults(av_frame_);
+
+ // This is for codecs not using get_buffer to initialize
+ // |av_frame_->reordered_opaque|
+ av_frame_->reordered_opaque = codec_context_->reordered_opaque;
int frame_decoded = 0;
int result = avcodec_decode_video2(codec_context_,
@@ -365,7 +360,10 @@ bool FFmpegVideoDecoder::Decode(
&packet);
// Log the problem if we can't decode a video frame and exit early.
if (result < 0) {
- LOG(ERROR) << "Error decoding video: " << buffer->AsHumanReadableString();
+ LOG(ERROR) << "Error decoding a video frame with timestamp: "
+ << buffer->GetTimestamp().InMicroseconds() << " us, duration: "
+ << buffer->GetDuration().InMicroseconds() << " us, packet size: "
+ << buffer->GetDataSize() << " bytes";
*video_frame = NULL;
return false;
}