| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/common/gpu/media/gpu_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/gpu_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 for (size_t i = 0; i < deferred_messages_copy.size(); ++i) | 49 for (size_t i = 0; i < deferred_messages_copy.size(); ++i) |
| 50 OnMessageReceived(*deferred_messages_copy[i]); | 50 OnMessageReceived(*deferred_messages_copy[i]); |
| 51 STLDeleteElements(&deferred_messages_copy); | 51 STLDeleteElements(&deferred_messages_copy); |
| 52 } | 52 } |
| 53 | 53 |
| 54 bool GpuVideoDecodeAccelerator::DeferMessageIfNeeded( | 54 bool GpuVideoDecodeAccelerator::DeferMessageIfNeeded( |
| 55 const IPC::Message& msg, bool* deferred) { | 55 const IPC::Message& msg, bool* deferred) { |
| 56 // Only consider deferring for message types that need it. | 56 // Only consider deferring for message types that need it. |
| 57 switch (msg.type()) { | 57 switch (msg.type()) { |
| 58 case AcceleratedVideoDecoderMsg_Decode::ID: | 58 case AcceleratedVideoDecoderMsg_Decode::ID: |
| 59 case AcceleratedVideoDecoderMsg_AssignGLESBuffers::ID: | 59 case AcceleratedVideoDecoderMsg_AssignPictureBuffers::ID: |
| 60 case AcceleratedVideoDecoderMsg_ReusePictureBuffer::ID: | 60 case AcceleratedVideoDecoderMsg_ReusePictureBuffer::ID: |
| 61 case AcceleratedVideoDecoderMsg_Flush::ID: | 61 case AcceleratedVideoDecoderMsg_Flush::ID: |
| 62 case AcceleratedVideoDecoderMsg_Reset::ID: | 62 case AcceleratedVideoDecoderMsg_Reset::ID: |
| 63 case AcceleratedVideoDecoderMsg_Destroy::ID: | 63 case AcceleratedVideoDecoderMsg_Destroy::ID: |
| 64 break; | 64 break; |
| 65 default: | 65 default: |
| 66 return false; | 66 return false; |
| 67 } | 67 } |
| 68 | 68 |
| 69 gpu::ReadWriteTokens tokens; | 69 gpu::ReadWriteTokens tokens; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 82 bool GpuVideoDecodeAccelerator::OnMessageReceived(const IPC::Message& msg) { | 82 bool GpuVideoDecodeAccelerator::OnMessageReceived(const IPC::Message& msg) { |
| 83 bool deferred = false; | 83 bool deferred = false; |
| 84 if (!DeferMessageIfNeeded(msg, &deferred)) | 84 if (!DeferMessageIfNeeded(msg, &deferred)) |
| 85 return false; | 85 return false; |
| 86 if (deferred) | 86 if (deferred) |
| 87 return true; | 87 return true; |
| 88 | 88 |
| 89 bool handled = true; | 89 bool handled = true; |
| 90 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAccelerator, msg) | 90 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAccelerator, msg) |
| 91 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Decode, OnDecode) | 91 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Decode, OnDecode) |
| 92 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_AssignGLESBuffers, | 92 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_AssignPictureBuffers, |
| 93 OnAssignGLESBuffers) | 93 OnAssignPictureBuffers) |
| 94 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_ReusePictureBuffer, | 94 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_ReusePictureBuffer, |
| 95 OnReusePictureBuffer) | 95 OnReusePictureBuffer) |
| 96 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Flush, OnFlush) | 96 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Flush, OnFlush) |
| 97 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Reset, OnReset) | 97 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Reset, OnReset) |
| 98 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Destroy, OnDestroy) | 98 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Destroy, OnDestroy) |
| 99 IPC_MESSAGE_UNHANDLED(handled = false) | 99 IPC_MESSAGE_UNHANDLED(handled = false) |
| 100 IPC_END_MESSAGE_MAP() | 100 IPC_END_MESSAGE_MAP() |
| 101 return handled; | 101 return handled; |
| 102 } | 102 } |
| 103 | 103 |
| 104 void GpuVideoDecodeAccelerator::OnChannelConnected(int32 peer_pid) { | 104 void GpuVideoDecodeAccelerator::OnChannelConnected(int32 peer_pid) { |
| 105 // TODO(vmr): Do we have to react on channel connections? | 105 // TODO(vmr): Do we have to react on channel connections? |
| 106 } | 106 } |
| 107 | 107 |
| 108 void GpuVideoDecodeAccelerator::OnChannelError() { | 108 void GpuVideoDecodeAccelerator::OnChannelError() { |
| 109 // TODO(vmr): Do we have to react on channel errors? | 109 // TODO(vmr): Do we have to react on channel errors? |
| 110 } | 110 } |
| 111 | 111 |
| 112 void GpuVideoDecodeAccelerator::ProvidePictureBuffers( | 112 void GpuVideoDecodeAccelerator::ProvidePictureBuffers( |
| 113 uint32 requested_num_of_buffers, | 113 uint32 requested_num_of_buffers, const gfx::Size& dimensions) { |
| 114 const gfx::Size& dimensions, | |
| 115 media::VideoDecodeAccelerator::MemoryType type) { | |
| 116 if (!Send(new AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers( | 114 if (!Send(new AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers( |
| 117 host_route_id_, requested_num_of_buffers, dimensions, type))) { | 115 host_route_id_, requested_num_of_buffers, dimensions))) { |
| 118 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers) " | 116 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers) " |
| 119 << "failed"; | 117 << "failed"; |
| 120 } | 118 } |
| 121 } | 119 } |
| 122 | 120 |
| 123 void GpuVideoDecodeAccelerator::DismissPictureBuffer( | 121 void GpuVideoDecodeAccelerator::DismissPictureBuffer( |
| 124 int32 picture_buffer_id) { | 122 int32 picture_buffer_id) { |
| 125 // Notify client that picture buffer is now unused. | 123 // Notify client that picture buffer is now unused. |
| 126 if (!Send(new AcceleratedVideoDecoderHostMsg_DismissPictureBuffer( | 124 if (!Send(new AcceleratedVideoDecoderHostMsg_DismissPictureBuffer( |
| 127 host_route_id_, picture_buffer_id))) { | 125 host_route_id_, picture_buffer_id))) { |
| 128 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_DismissPictureBuffer) " | 126 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_DismissPictureBuffer) " |
| 129 << "failed"; | 127 << "failed"; |
| 130 } | 128 } |
| 131 } | 129 } |
| 132 | 130 |
| 133 void GpuVideoDecodeAccelerator::PictureReady( | 131 void GpuVideoDecodeAccelerator::PictureReady( |
| 134 const media::Picture& picture) { | 132 const media::Picture& picture) { |
| 135 if (!Send(new AcceleratedVideoDecoderHostMsg_PictureReady( | 133 if (!Send(new AcceleratedVideoDecoderHostMsg_PictureReady( |
| 136 host_route_id_, | 134 host_route_id_, |
| 137 picture.picture_buffer_id(), | 135 picture.picture_buffer_id(), |
| 138 picture.bitstream_buffer_id(), | 136 picture.bitstream_buffer_id()))) { |
| 139 picture.visible_size(), | |
| 140 picture.decoded_size()))) { | |
| 141 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_PictureReady) failed"; | 137 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_PictureReady) failed"; |
| 142 } | 138 } |
| 143 } | 139 } |
| 144 | 140 |
| 145 void GpuVideoDecodeAccelerator::NotifyEndOfStream() { | 141 void GpuVideoDecodeAccelerator::NotifyEndOfStream() { |
| 146 Send(new AcceleratedVideoDecoderHostMsg_EndOfStream(host_route_id_)); | 142 Send(new AcceleratedVideoDecoderHostMsg_EndOfStream(host_route_id_)); |
| 147 } | 143 } |
| 148 | 144 |
| 149 void GpuVideoDecodeAccelerator::NotifyError( | 145 void GpuVideoDecodeAccelerator::NotifyError( |
| 150 media::VideoDecodeAccelerator::Error error) { | 146 media::VideoDecodeAccelerator::Error error) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 170 #endif // defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) | 166 #endif // defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) |
| 171 } | 167 } |
| 172 | 168 |
| 173 void GpuVideoDecodeAccelerator::OnDecode( | 169 void GpuVideoDecodeAccelerator::OnDecode( |
| 174 const gpu::ReadWriteTokens&, /* tokens */ | 170 const gpu::ReadWriteTokens&, /* tokens */ |
| 175 base::SharedMemoryHandle handle, int32 id, int32 size) { | 171 base::SharedMemoryHandle handle, int32 id, int32 size) { |
| 176 DCHECK(video_decode_accelerator_.get()); | 172 DCHECK(video_decode_accelerator_.get()); |
| 177 video_decode_accelerator_->Decode(media::BitstreamBuffer(id, handle, size)); | 173 video_decode_accelerator_->Decode(media::BitstreamBuffer(id, handle, size)); |
| 178 } | 174 } |
| 179 | 175 |
| 180 void GpuVideoDecodeAccelerator::OnAssignGLESBuffers( | 176 void GpuVideoDecodeAccelerator::OnAssignPictureBuffers( |
| 181 const gpu::ReadWriteTokens& /* tokens */, | 177 const gpu::ReadWriteTokens& /* tokens */, |
| 182 const std::vector<int32>& buffer_ids, | 178 const std::vector<int32>& buffer_ids, |
| 183 const std::vector<uint32>& texture_ids, | 179 const std::vector<uint32>& texture_ids, |
| 184 const std::vector<gfx::Size>& sizes) { | 180 const std::vector<gfx::Size>& sizes) { |
| 185 DCHECK(stub_ && stub_->scheduler()); // Ensure already Initialize()'d. | 181 DCHECK(stub_ && stub_->scheduler()); // Ensure already Initialize()'d. |
| 186 gpu::gles2::GLES2Decoder* command_decoder = stub_->scheduler()->decoder(); | 182 gpu::gles2::GLES2Decoder* command_decoder = stub_->scheduler()->decoder(); |
| 187 | 183 |
| 188 std::vector<media::GLESBuffer> buffers; | 184 std::vector<media::PictureBuffer> buffers; |
| 189 for (uint32 i = 0; i < buffer_ids.size(); ++i) { | 185 for (uint32 i = 0; i < buffer_ids.size(); ++i) { |
| 190 uint32 service_texture_id; | 186 uint32 service_texture_id; |
| 191 if (!command_decoder->GetServiceTextureId( | 187 if (!command_decoder->GetServiceTextureId( |
| 192 texture_ids[i], &service_texture_id)) { | 188 texture_ids[i], &service_texture_id)) { |
| 193 // TODO(vrk): Send an error for invalid GLES buffers. | 189 // TODO(vrk): Send an error for invalid GLES buffers. |
| 194 LOG(DFATAL) << "Failed to translate texture!"; | 190 LOG(DFATAL) << "Failed to translate texture!"; |
| 195 return; | 191 return; |
| 196 } | 192 } |
| 197 buffers.push_back(media::GLESBuffer( | 193 buffers.push_back(media::PictureBuffer( |
| 198 buffer_ids[i], sizes[i], service_texture_id)); | 194 buffer_ids[i], sizes[i], service_texture_id)); |
| 199 } | 195 } |
| 200 video_decode_accelerator_->AssignGLESBuffers(buffers); | 196 video_decode_accelerator_->AssignPictureBuffers(buffers); |
| 201 } | 197 } |
| 202 | 198 |
| 203 void GpuVideoDecodeAccelerator::OnReusePictureBuffer( | 199 void GpuVideoDecodeAccelerator::OnReusePictureBuffer( |
| 204 const gpu::ReadWriteTokens& /* tokens */, | 200 const gpu::ReadWriteTokens& /* tokens */, |
| 205 int32 picture_buffer_id) { | 201 int32 picture_buffer_id) { |
| 206 DCHECK(video_decode_accelerator_.get()); | 202 DCHECK(video_decode_accelerator_.get()); |
| 207 video_decode_accelerator_->ReusePictureBuffer(picture_buffer_id); | 203 video_decode_accelerator_->ReusePictureBuffer(picture_buffer_id); |
| 208 } | 204 } |
| 209 | 205 |
| 210 void GpuVideoDecodeAccelerator::OnFlush( | 206 void GpuVideoDecodeAccelerator::OnFlush( |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 | 243 |
| 248 void GpuVideoDecodeAccelerator::NotifyResetDone() { | 244 void GpuVideoDecodeAccelerator::NotifyResetDone() { |
| 249 if (!Send(new AcceleratedVideoDecoderHostMsg_ResetDone(host_route_id_))) | 245 if (!Send(new AcceleratedVideoDecoderHostMsg_ResetDone(host_route_id_))) |
| 250 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_ResetDone) failed"; | 246 LOG(ERROR) << "Send(AcceleratedVideoDecoderHostMsg_ResetDone) failed"; |
| 251 } | 247 } |
| 252 | 248 |
| 253 bool GpuVideoDecodeAccelerator::Send(IPC::Message* message) { | 249 bool GpuVideoDecodeAccelerator::Send(IPC::Message* message) { |
| 254 DCHECK(sender_); | 250 DCHECK(sender_); |
| 255 return sender_->Send(message); | 251 return sender_->Send(message); |
| 256 } | 252 } |
| OLD | NEW |