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

Unified Diff: media/filters/fake_video_decoder.cc

Issue 331863004: Revert 276344 "Add callback in VideoDecoder and AudioDecoder to ..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/2049/src/
Patch Set: Created 6 years, 6 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
« no previous file with comments | « media/filters/fake_video_decoder.h ('k') | media/filters/fake_video_decoder_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/fake_video_decoder.cc
===================================================================
--- media/filters/fake_video_decoder.cc (revision 277175)
+++ media/filters/fake_video_decoder.cc (working copy)
@@ -14,8 +14,10 @@
namespace media {
FakeVideoDecoder::FakeVideoDecoder(int decoding_delay,
+ bool supports_get_decode_output,
int max_parallel_decoding_requests)
: decoding_delay_(decoding_delay),
+ supports_get_decode_output_(supports_get_decode_output),
max_parallel_decoding_requests_(max_parallel_decoding_requests),
state_(STATE_UNINITIALIZED),
hold_decode_(false),
@@ -30,8 +32,7 @@
void FakeVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool low_delay,
- const PipelineStatusCB& status_cb,
- const OutputCB& output_cb) {
+ const PipelineStatusCB& status_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(config.IsValidConfig());
DCHECK(held_decode_callbacks_.empty())
@@ -41,10 +42,6 @@
current_config_ = config;
init_cb_.SetCallback(BindToCurrentLoop(status_cb));
- // Don't need BindToCurrentLoop() because |output_cb_| is only called from
- // RunDecodeCallback() which is posted from Decode().
- output_cb_ = output_cb;
-
if (!decoded_frames_.empty()) {
DVLOG(1) << "Decoded frames dropped during reinitialization.";
decoded_frames_.clear();
@@ -67,10 +64,11 @@
DecodeCB wrapped_decode_cb =
BindToCurrentLoop(base::Bind(&FakeVideoDecoder::OnFrameDecoded,
weak_factory_.GetWeakPtr(),
- buffer_size, decode_cb));
+ buffer_size,
+ decode_cb));
if (state_ == STATE_ERROR) {
- wrapped_decode_cb.Run(kDecodeError);
+ wrapped_decode_cb.Run(kDecodeError, scoped_refptr<VideoFrame>());
return;
}
@@ -114,6 +112,15 @@
state_ = STATE_UNINITIALIZED;
}
+scoped_refptr<VideoFrame> FakeVideoDecoder::GetDecodeOutput() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (!supports_get_decode_output_ || decoded_frames_.empty())
+ return NULL;
+ scoped_refptr<VideoFrame> out = decoded_frames_.front();
+ decoded_frames_.pop_front();
+ return out;
+}
+
void FakeVideoDecoder::HoldNextInit() {
DCHECK(thread_checker_.CalledOnValidThread());
init_cb_.HoldCallback();
@@ -171,7 +178,8 @@
state_ = STATE_ERROR;
while (!held_decode_callbacks_.empty()) {
- held_decode_callbacks_.front().Run(kDecodeError);
+ held_decode_callbacks_.front().Run(kDecodeError,
+ scoped_refptr<VideoFrame>());
held_decode_callbacks_.pop_front();
}
decoded_frames_.clear();
@@ -181,14 +189,16 @@
return max_parallel_decoding_requests_;
}
-void FakeVideoDecoder::OnFrameDecoded(int buffer_size,
- const DecodeCB& decode_cb,
- Status status) {
+void FakeVideoDecoder::OnFrameDecoded(
+ int buffer_size,
+ const DecodeCB& decode_cb,
+ Status status,
+ const scoped_refptr<VideoFrame>& video_frame) {
DCHECK(thread_checker_.CalledOnValidThread());
- if (status == kOk)
+ if (status == kOk || status == kNotEnoughData)
total_bytes_decoded_ += buffer_size;
- decode_cb.Run(status);
+ decode_cb.Run(status, video_frame);
}
void FakeVideoDecoder::RunOrHoldDecode(const DecodeCB& decode_cb) {
@@ -207,32 +217,28 @@
if (!reset_cb_.IsNull()) {
DCHECK(decoded_frames_.empty());
- decode_cb.Run(kAborted);
+ decode_cb.Run(kAborted, scoped_refptr<VideoFrame>());
return;
}
// Make sure we leave decoding_delay_ frames in the queue and also frames for
// all pending decode callbacks, except the current one.
- if (decoded_frames_.size() >
- decoding_delay_ + held_decode_callbacks_.size()) {
- output_cb_.Run(decoded_frames_.front());
+ if (decoded_frames_.size() <=
+ decoding_delay_ + held_decode_callbacks_.size() &&
+ state_ != STATE_END_OF_STREAM) {
+ decode_cb.Run(kNotEnoughData, scoped_refptr<VideoFrame>());
+ return;
+ }
+
+ scoped_refptr<VideoFrame> frame;
+ if (decoded_frames_.empty()) {
+ DCHECK_EQ(state_, STATE_END_OF_STREAM);
+ frame = VideoFrame::CreateEOSFrame();
+ } else {
+ frame = decoded_frames_.front();
decoded_frames_.pop_front();
- } else if (state_ == STATE_END_OF_STREAM) {
- // Drain the queue if this was the last request in the stream, otherwise
- // just pop the last frame from the queue.
- if (held_decode_callbacks_.empty()) {
- while (!decoded_frames_.empty()) {
- output_cb_.Run(decoded_frames_.front());
- decoded_frames_.pop_front();
- }
- output_cb_.Run(VideoFrame::CreateEOSFrame());
- } else if (!decoded_frames_.empty()) {
- output_cb_.Run(decoded_frames_.front());
- decoded_frames_.pop_front();
- }
}
-
- decode_cb.Run(kOk);
+ decode_cb.Run(kOk, frame);
}
void FakeVideoDecoder::DoReset() {
« no previous file with comments | « media/filters/fake_video_decoder.h ('k') | media/filters/fake_video_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698