| Index: media/filters/omx_video_decoder.cc
|
| diff --git a/media/filters/omx_video_decoder.cc b/media/filters/omx_video_decoder.cc
|
| deleted file mode 100644
|
| index b185965c1d0c586761850192d06ea46bf9c327a4..0000000000000000000000000000000000000000
|
| --- a/media/filters/omx_video_decoder.cc
|
| +++ /dev/null
|
| @@ -1,250 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "media/filters/omx_video_decoder.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback.h"
|
| -#include "base/message_loop.h"
|
| -#include "media/base/callback.h"
|
| -#include "media/base/filter_host.h"
|
| -#include "media/base/limits.h"
|
| -#include "media/ffmpeg/ffmpeg_common.h"
|
| -#include "media/video/omx_video_decode_engine.h"
|
| -
|
| -namespace media {
|
| -
|
| -OmxVideoDecoder::OmxVideoDecoder(
|
| - MessageLoop* message_loop,
|
| - VideoDecodeContext* context)
|
| - : message_loop_(message_loop),
|
| - decode_engine_(new OmxVideoDecodeEngine()),
|
| - decode_context_(context) {
|
| - DCHECK(decode_engine_.get());
|
| - memset(&info_, 0, sizeof(info_));
|
| -}
|
| -
|
| -OmxVideoDecoder::~OmxVideoDecoder() {
|
| - // TODO(hclam): Make sure OmxVideoDecodeEngine is stopped.
|
| -}
|
| -
|
| -void OmxVideoDecoder::Initialize(DemuxerStream* demuxer_stream,
|
| - FilterCallback* callback,
|
| - StatisticsCallback* stats_callback) {
|
| - if (MessageLoop::current() != message_loop_) {
|
| - message_loop_->PostTask(
|
| - FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &OmxVideoDecoder::Initialize,
|
| - make_scoped_refptr(demuxer_stream),
|
| - callback, stats_callback));
|
| - return;
|
| - }
|
| -
|
| - DCHECK_EQ(message_loop_, MessageLoop::current());
|
| - DCHECK(!demuxer_stream_);
|
| - DCHECK(!initialize_callback_.get());
|
| -
|
| - initialize_callback_.reset(callback);
|
| - statistics_callback_.reset(stats_callback);
|
| - demuxer_stream_ = demuxer_stream;
|
| -
|
| - // We require bit stream converter for openmax hardware decoder.
|
| - demuxer_stream->EnableBitstreamConverter();
|
| -
|
| - AVStream* av_stream = demuxer_stream->GetAVStream();
|
| - if (!av_stream) {
|
| - VideoCodecInfo info = {0};
|
| - OnInitializeComplete(info);
|
| - return;
|
| - }
|
| -
|
| - pts_stream_.Initialize(GetFrameDuration(av_stream));
|
| -
|
| - int width = av_stream->codec->coded_width;
|
| - int height = av_stream->codec->coded_height;
|
| - if (width > Limits::kMaxDimension ||
|
| - height > Limits::kMaxDimension ||
|
| - (width * height) > Limits::kMaxCanvas) {
|
| - VideoCodecInfo info = {0};
|
| - OnInitializeComplete(info);
|
| - return;
|
| - }
|
| -
|
| - VideoDecoderConfig config(CodecIDToVideoCodec(av_stream->codec->codec_id),
|
| - width, height,
|
| - av_stream->r_frame_rate.num,
|
| - av_stream->r_frame_rate.den,
|
| - av_stream->codec->extradata,
|
| - av_stream->codec->extradata_size);
|
| - decode_engine_->Initialize(message_loop_, this, NULL, config);
|
| -}
|
| -
|
| -void OmxVideoDecoder::OnInitializeComplete(const VideoCodecInfo& info) {
|
| - // TODO(scherkus): Dedup this from FFmpegVideoDecoder::OnInitializeComplete.
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(initialize_callback_.get());
|
| -
|
| - info_ = info;
|
| - AutoCallbackRunner done_runner(initialize_callback_.release());
|
| -
|
| - if (info.success) {
|
| - media_format_.SetAsInteger(MediaFormat::kWidth,
|
| - info.stream_info.surface_width);
|
| - media_format_.SetAsInteger(MediaFormat::kHeight,
|
| - info.stream_info.surface_height);
|
| - media_format_.SetAsInteger(
|
| - MediaFormat::kSurfaceType,
|
| - static_cast<int>(info.stream_info.surface_type));
|
| - media_format_.SetAsInteger(
|
| - MediaFormat::kSurfaceFormat,
|
| - static_cast<int>(info.stream_info.surface_format));
|
| - } else {
|
| - host()->SetError(PIPELINE_ERROR_DECODE);
|
| - }
|
| -}
|
| -
|
| -void OmxVideoDecoder::Stop(FilterCallback* callback) {
|
| - if (MessageLoop::current() != message_loop_) {
|
| - message_loop_->PostTask(FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &OmxVideoDecoder::Stop,
|
| - callback));
|
| - return;
|
| - }
|
| -
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(!uninitialize_callback_.get());
|
| -
|
| - uninitialize_callback_.reset(callback);
|
| - decode_engine_->Uninitialize();
|
| -}
|
| -
|
| -void OmxVideoDecoder::OnUninitializeComplete() {
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(uninitialize_callback_.get());
|
| -
|
| - AutoCallbackRunner done_runner(uninitialize_callback_.release());
|
| -
|
| - // TODO(jiesun): Destroy the decoder context.
|
| -}
|
| -
|
| -void OmxVideoDecoder::Flush(FilterCallback* callback) {
|
| - if (MessageLoop::current() != message_loop_) {
|
| - message_loop_->PostTask(FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &OmxVideoDecoder::Flush,
|
| - callback));
|
| - return;
|
| - }
|
| -
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(!flush_callback_.get());
|
| -
|
| - flush_callback_.reset(callback);
|
| -
|
| - decode_engine_->Flush();
|
| -}
|
| -
|
| -
|
| -void OmxVideoDecoder::OnFlushComplete() {
|
| - DCHECK(flush_callback_.get());
|
| -
|
| - AutoCallbackRunner done_runner(flush_callback_.release());
|
| -
|
| - pts_stream_.Flush();
|
| -}
|
| -
|
| -void OmxVideoDecoder::Seek(base::TimeDelta time, const FilterStatusCB& cb) {
|
| - if (MessageLoop::current() != message_loop_) {
|
| - message_loop_->PostTask(FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &OmxVideoDecoder::Seek,
|
| - time,
|
| - cb));
|
| - return;
|
| - }
|
| -
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(seek_cb_.is_null());
|
| -
|
| - pts_stream_.Seek(time);
|
| - seek_cb_ = cb;
|
| - decode_engine_->Seek();
|
| -}
|
| -
|
| -void OmxVideoDecoder::OnSeekComplete() {
|
| - DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| - DCHECK(!seek_cb_.is_null());
|
| -
|
| - ResetAndRunCB(&seek_cb_, PIPELINE_OK);
|
| -}
|
| -
|
| -void OmxVideoDecoder::OnError() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -void OmxVideoDecoder::OnFormatChange(VideoStreamInfo stream_info) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void OmxVideoDecoder::ProduceVideoSample(scoped_refptr<Buffer> buffer) {
|
| - DCHECK_EQ(message_loop_, MessageLoop::current());
|
| -
|
| - // Issue more demux.
|
| - demuxer_stream_->Read(base::Bind(&OmxVideoDecoder::DemuxCompleteTask, this));
|
| -}
|
| -
|
| -void OmxVideoDecoder::ConsumeVideoFrame(scoped_refptr<VideoFrame> frame,
|
| - const PipelineStatistics& statistics) {
|
| - DCHECK_EQ(message_loop_, MessageLoop::current());
|
| - statistics_callback_->Run(statistics);
|
| -
|
| - if (frame.get()) {
|
| - pts_stream_.UpdatePtsAndDuration(frame.get());
|
| -
|
| - frame->SetTimestamp(pts_stream_.current_pts());
|
| - frame->SetDuration(pts_stream_.current_duration());
|
| - }
|
| -
|
| - VideoFrameReady(frame);
|
| -}
|
| -
|
| -void OmxVideoDecoder::ProduceVideoFrame(scoped_refptr<VideoFrame> frame) {
|
| - DCHECK(decode_engine_.get());
|
| - message_loop_->PostTask(
|
| - FROM_HERE,
|
| - NewRunnableMethod(decode_engine_.get(),
|
| - &VideoDecodeEngine::ProduceVideoFrame, frame));
|
| -}
|
| -
|
| -bool OmxVideoDecoder::ProvidesBuffer() {
|
| - DCHECK(info_.success);
|
| - return info_.provides_buffers;
|
| -}
|
| -
|
| -const MediaFormat& OmxVideoDecoder::media_format() {
|
| - return media_format_;
|
| -}
|
| -
|
| -void OmxVideoDecoder::DemuxCompleteTask(Buffer* buffer) {
|
| - // We simply delicate the buffer to the right message loop.
|
| - scoped_refptr<Buffer> ref_buffer = buffer;
|
| - DCHECK(decode_engine_.get());
|
| - message_loop_->PostTask(
|
| - FROM_HERE,
|
| - NewRunnableMethod(this,
|
| - &OmxVideoDecoder::ConsumeVideoSample, ref_buffer));
|
| -}
|
| -
|
| -void OmxVideoDecoder::ConsumeVideoSample(scoped_refptr<Buffer> buffer) {
|
| - if (buffer.get())
|
| - pts_stream_.EnqueuePts(buffer.get());
|
| - decode_engine_->ConsumeVideoSample(buffer);
|
| -}
|
| -
|
| -} // namespace media
|
| -
|
| -// Disable refcounting for the decode engine because it only lives on the
|
| -// video decoder thread.
|
| -DISABLE_RUNNABLE_METHOD_REFCOUNT(media::VideoDecodeEngine);
|
|
|