| Index: media/filters/vpx_video_decoder.cc
|
| diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
|
| index 894f8712c70fbf8c27efdd20f3c82d898ab86910..51995924b8225368627e33b8ef1311ff7295f254 100644
|
| --- a/media/filters/vpx_video_decoder.cc
|
| +++ b/media/filters/vpx_video_decoder.cc
|
| @@ -215,7 +215,8 @@ VpxVideoDecoder::~VpxVideoDecoder() {
|
|
|
| void VpxVideoDecoder::Initialize(const VideoDecoderConfig& config,
|
| bool low_delay,
|
| - const PipelineStatusCB& status_cb) {
|
| + const PipelineStatusCB& status_cb,
|
| + const OutputCB& output_cb) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(config.IsValidConfig());
|
| DCHECK(!config.is_encrypted());
|
| @@ -229,6 +230,7 @@ void VpxVideoDecoder::Initialize(const VideoDecoderConfig& config,
|
| // Success!
|
| config_ = config;
|
| state_ = kNormal;
|
| + output_cb_ = output_cb;
|
| status_cb.Run(PIPELINE_OK);
|
| }
|
|
|
| @@ -314,13 +316,13 @@ void VpxVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
|
| decode_cb_ = BindToCurrentLoop(decode_cb);
|
|
|
| if (state_ == kError) {
|
| - base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL);
|
| + base::ResetAndReturn(&decode_cb_).Run(kDecodeError);
|
| return;
|
| }
|
|
|
| // Return empty frames if decoding has finished.
|
| if (state_ == kDecodeFinished) {
|
| - base::ResetAndReturn(&decode_cb_).Run(kOk, VideoFrame::CreateEOSFrame());
|
| + base::ResetAndReturn(&decode_cb_).Run(kOk);
|
| return;
|
| }
|
|
|
| @@ -352,24 +354,22 @@ void VpxVideoDecoder::DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer) {
|
| // Transition to kDecodeFinished on the first end of stream buffer.
|
| if (state_ == kNormal && buffer->end_of_stream()) {
|
| state_ = kDecodeFinished;
|
| - base::ResetAndReturn(&decode_cb_).Run(kOk, VideoFrame::CreateEOSFrame());
|
| + output_cb_.Run(VideoFrame::CreateEOSFrame());
|
| + base::ResetAndReturn(&decode_cb_).Run(kOk);
|
| return;
|
| }
|
|
|
| scoped_refptr<VideoFrame> video_frame;
|
| if (!VpxDecode(buffer, &video_frame)) {
|
| state_ = kError;
|
| - base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL);
|
| + base::ResetAndReturn(&decode_cb_).Run(kDecodeError);
|
| return;
|
| }
|
|
|
| - // If we didn't get a frame we need more data.
|
| - if (!video_frame.get()) {
|
| - base::ResetAndReturn(&decode_cb_).Run(kNotEnoughData, NULL);
|
| - return;
|
| - }
|
| + base::ResetAndReturn(&decode_cb_).Run(kOk);
|
|
|
| - base::ResetAndReturn(&decode_cb_).Run(kOk, video_frame);
|
| + if (video_frame)
|
| + output_cb_.Run(video_frame);
|
| }
|
|
|
| bool VpxVideoDecoder::VpxDecode(const scoped_refptr<DecoderBuffer>& buffer,
|
|
|