| Index: content/common/gpu/media/omx_video_decode_accelerator_unittest.cc
|
| diff --git a/content/common/gpu/media/omx_video_decode_accelerator_unittest.cc b/content/common/gpu/media/omx_video_decode_accelerator_unittest.cc
|
| index 6a6d35ca579cd717ee421df6bb05a90a82069a64..5591f2f8e2513aa4e2294b1c57b891bccf32383e 100644
|
| --- a/content/common/gpu/media/omx_video_decode_accelerator_unittest.cc
|
| +++ b/content/common/gpu/media/omx_video_decode_accelerator_unittest.cc
|
| @@ -421,7 +421,6 @@ class EglRenderingVDAClient : public VideoDecodeAccelerator::Client {
|
| virtual void NotifyEndOfBitstreamBuffer(int32 bitstream_buffer_id);
|
| virtual void NotifyFlushDone();
|
| virtual void NotifyResetDone();
|
| - virtual void NotifyDestroyDone();
|
| virtual void NotifyError(VideoDecodeAccelerator::Error error);
|
|
|
| // Simple getters for inspecting the state of the Client.
|
| @@ -432,7 +431,7 @@ class EglRenderingVDAClient : public VideoDecodeAccelerator::Client {
|
| EGLDisplay egl_display() { return rendering_helper_->egl_display(); }
|
| EGLContext egl_context() { return rendering_helper_->egl_context(); }
|
| double frames_per_second();
|
| - bool decoder_deleted() { return !decoder_.get(); }
|
| + bool decoder_deleted() { return !decoder_; }
|
|
|
| private:
|
| typedef std::map<int, media::GLESBuffer*> PictureBufferById;
|
| @@ -456,7 +455,7 @@ class EglRenderingVDAClient : public VideoDecodeAccelerator::Client {
|
| size_t encoded_data_next_pos_to_decode_;
|
| int next_bitstream_buffer_id_;
|
| ClientStateNotification* note_;
|
| - scoped_ptr<OmxVideoDecodeAccelerator> decoder_;
|
| + scoped_refptr<OmxVideoDecodeAccelerator> decoder_;
|
| int delete_decoder_state_;
|
| ClientState state_;
|
| VideoDecodeAccelerator::Error error_;
|
| @@ -485,17 +484,17 @@ EglRenderingVDAClient::EglRenderingVDAClient(RenderingHelper* rendering_helper,
|
| }
|
|
|
| EglRenderingVDAClient::~EglRenderingVDAClient() {
|
| - CHECK(!decoder_.get());
|
| + CHECK(decoder_deleted());
|
| STLDeleteValues(&picture_buffers_by_id_);
|
| SetState(CS_DESTROYED);
|
| }
|
|
|
| void EglRenderingVDAClient::CreateDecoder() {
|
| - CHECK(!decoder_.get());
|
| - decoder_.reset(new OmxVideoDecodeAccelerator(this));
|
| + CHECK(decoder_deleted());
|
| + decoder_ = new OmxVideoDecodeAccelerator(this);
|
| decoder_->SetEglState(egl_display(), egl_context());
|
| SetState(CS_DECODER_SET);
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
|
|
| // Configure the decoder.
|
| @@ -514,7 +513,7 @@ void EglRenderingVDAClient::ProvidePictureBuffers(
|
| uint32 requested_num_of_buffers,
|
| const gfx::Size& dimensions,
|
| VideoDecodeAccelerator::MemoryType type) {
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| CHECK_EQ(type, VideoDecodeAccelerator::PICTUREBUFFER_MEMORYTYPE_GL_TEXTURE);
|
| std::vector<media::GLESBuffer> buffers;
|
| @@ -550,7 +549,7 @@ void EglRenderingVDAClient::PictureReady(const media::Picture& picture) {
|
| // We shouldn't be getting pictures delivered after Reset has completed.
|
| DCHECK_LT(state_, CS_RESET);
|
|
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| last_frame_delivered_ticks_ = base::TimeTicks::Now();
|
|
|
| @@ -587,25 +586,20 @@ void EglRenderingVDAClient::NotifyEndOfBitstreamBuffer(
|
| }
|
|
|
| void EglRenderingVDAClient::NotifyFlushDone() {
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| SetState(CS_FLUSHED);
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| decoder_->Reset();
|
| }
|
|
|
| void EglRenderingVDAClient::NotifyResetDone() {
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| SetState(CS_RESET);
|
| - if (!decoder_.get())
|
| - return;
|
| - decoder_->Destroy();
|
| -}
|
| -
|
| -void EglRenderingVDAClient::NotifyDestroyDone() {
|
| - SetState(CS_DESTROYED);
|
| + if (!decoder_deleted())
|
| + DeleteDecoder();
|
| }
|
|
|
| void EglRenderingVDAClient::NotifyError(VideoDecodeAccelerator::Error error) {
|
| @@ -622,12 +616,17 @@ static bool LookingAtNAL(const std::string& encoded, size_t pos) {
|
| void EglRenderingVDAClient::SetState(ClientState new_state) {
|
| note_->Notify(new_state);
|
| state_ = new_state;
|
| - if (new_state == delete_decoder_state_)
|
| + if (new_state == delete_decoder_state_) {
|
| + CHECK(!decoder_deleted());
|
| DeleteDecoder();
|
| + }
|
| }
|
|
|
| void EglRenderingVDAClient::DeleteDecoder() {
|
| - decoder_.reset();
|
| + if (decoder_deleted())
|
| + return;
|
| + decoder_->Destroy();
|
| + decoder_ = NULL;
|
| // Cascade through the rest of the states to simplify test code below.
|
| for (int i = state_ + 1; i < CS_MAX; ++i)
|
| SetState(static_cast<ClientState>(i));
|
| @@ -651,7 +650,7 @@ void EglRenderingVDAClient::GetRangeForNextNALUs(
|
| }
|
|
|
| void EglRenderingVDAClient::DecodeNextNALUs() {
|
| - if (!decoder_.get())
|
| + if (decoder_deleted())
|
| return;
|
| if (encoded_data_next_pos_to_decode_ == encoded_data_->size()) {
|
| decoder_->Flush();
|
| @@ -813,10 +812,8 @@ TEST_P(OmxVideoDecodeAcceleratorTest, TestSimpleDecode) {
|
| rendering_thread.Stop();
|
| };
|
|
|
| -// TODO(fischman): Remove DISABLED_ prefix when ~OVDA can tear down OMX
|
| -// synchronously (http://crosbug.com/p/4869).
|
| INSTANTIATE_TEST_CASE_P(
|
| - DISABLED_TearDownTiming, OmxVideoDecodeAcceleratorTest,
|
| + TearDownTiming, OmxVideoDecodeAcceleratorTest,
|
| ::testing::Values(
|
| MakeTuple(1, 1, CS_DECODER_SET), MakeTuple(1, 1, CS_INITIALIZED),
|
| MakeTuple(1, 1, CS_FLUSHED), MakeTuple(1, 1, CS_RESET),
|
| @@ -832,10 +829,10 @@ INSTANTIATE_TEST_CASE_P(
|
| INSTANTIATE_TEST_CASE_P(
|
| DecodeVariations, OmxVideoDecodeAcceleratorTest,
|
| ::testing::Values(
|
| - MakeTuple(1, 1, CS_DESTROYED), MakeTuple(1, 3, CS_DESTROYED),
|
| - MakeTuple(2, 1, CS_DESTROYED), MakeTuple(3, 1, CS_DESTROYED),
|
| - MakeTuple(5, 1, CS_DESTROYED), MakeTuple(8, 1, CS_DESTROYED),
|
| - MakeTuple(15, 1, CS_DESTROYED)));
|
| + MakeTuple(1, 1, CS_RESET), MakeTuple(1, 3, CS_RESET),
|
| + MakeTuple(2, 1, CS_RESET), MakeTuple(3, 1, CS_RESET),
|
| + MakeTuple(5, 1, CS_RESET), MakeTuple(8, 1, CS_RESET),
|
| + MakeTuple(15, 1, CS_RESET)));
|
|
|
| // TODO(fischman, vrk): add more tests! In particular:
|
| // - Test life-cycle: Seek/Stop/Pause/Play/RePlay for a single decoder.
|
|
|