| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ | 5 #ifndef MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ |
| 6 #define MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ | 6 #define MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <map> | 10 #include <map> |
| 11 | 11 |
| 12 #include "media/base/pipeline_status.h" | 12 #include "media/base/pipeline_status.h" |
| 13 #include "media/base/video_decoder.h" | 13 #include "media/base/video_decoder.h" |
| 14 #include "media/video/video_decode_accelerator.h" | 14 #include "media/video/video_decode_accelerator.h" |
| 15 | 15 |
| 16 class MessageLoop; | 16 class MessageLoop; |
| 17 template <class T> class scoped_refptr; | 17 template <class T> class scoped_refptr; |
| 18 namespace base { | 18 namespace base { |
| 19 class MessageLoopProxy; | 19 class MessageLoopProxy; |
| 20 class SharedMemory; | 20 class SharedMemory; |
| 21 } | 21 } |
| 22 | 22 |
| 23 namespace media { | 23 namespace media { |
| 24 | 24 |
| 25 class DecoderBuffer; |
| 26 |
| 25 // GPU-accelerated video decoder implementation. Relies on | 27 // GPU-accelerated video decoder implementation. Relies on |
| 26 // AcceleratedVideoDecoderMsg_Decode and friends. | 28 // AcceleratedVideoDecoderMsg_Decode and friends. |
| 27 // All methods internally trampoline to the |message_loop| passed to the ctor. | 29 // All methods internally trampoline to the |message_loop| passed to the ctor. |
| 28 class MEDIA_EXPORT GpuVideoDecoder | 30 class MEDIA_EXPORT GpuVideoDecoder |
| 29 : public VideoDecoder, | 31 : public VideoDecoder, |
| 30 public VideoDecodeAccelerator::Client { | 32 public VideoDecodeAccelerator::Client { |
| 31 public: | 33 public: |
| 32 // Helper interface for specifying factories needed to instantiate a | 34 // Helper interface for specifying factories needed to instantiate a |
| 33 // GpuVideoDecoder. | 35 // GpuVideoDecoder. |
| 34 class MEDIA_EXPORT Factories : public base::RefCountedThreadSafe<Factories> { | 36 class MEDIA_EXPORT Factories : public base::RefCountedThreadSafe<Factories> { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 // enough). | 93 // enough). |
| 92 kDrainingDecoder, | 94 kDrainingDecoder, |
| 93 kDecoderDrained, | 95 kDecoderDrained, |
| 94 }; | 96 }; |
| 95 | 97 |
| 96 // If no demuxer read is in flight and no bitstream buffers are in the | 98 // If no demuxer read is in flight and no bitstream buffers are in the |
| 97 // decoder, kick some off demuxing/decoding. | 99 // decoder, kick some off demuxing/decoding. |
| 98 void EnsureDemuxOrDecode(); | 100 void EnsureDemuxOrDecode(); |
| 99 | 101 |
| 100 // Callback to pass to demuxer_stream_->Read() for receiving encoded bits. | 102 // Callback to pass to demuxer_stream_->Read() for receiving encoded bits. |
| 101 void RequestBufferDecode(const scoped_refptr<Buffer>& buffer); | 103 void RequestBufferDecode(const scoped_refptr<DecoderBuffer>& buffer); |
| 102 | 104 |
| 103 // Enqueue a frame for later delivery (or drop it on the floor if a | 105 // Enqueue a frame for later delivery (or drop it on the floor if a |
| 104 // vda->Reset() is in progress) and trigger out-of-line delivery of the oldest | 106 // vda->Reset() is in progress) and trigger out-of-line delivery of the oldest |
| 105 // ready frame to the client if there is a pending read. A NULL |frame| | 107 // ready frame to the client if there is a pending read. A NULL |frame| |
| 106 // merely triggers delivery, and requires the ready_video_frames_ queue not be | 108 // merely triggers delivery, and requires the ready_video_frames_ queue not be |
| 107 // empty. | 109 // empty. |
| 108 void EnqueueFrameAndTriggerFrameDelivery( | 110 void EnqueueFrameAndTriggerFrameDelivery( |
| 109 const scoped_refptr<VideoFrame>& frame); | 111 const scoped_refptr<VideoFrame>& frame); |
| 110 | 112 |
| 111 // Indicate the picturebuffer can be reused by the decoder. | 113 // Indicate the picturebuffer can be reused by the decoder. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 // Is a demuxer read in flight? | 170 // Is a demuxer read in flight? |
| 169 bool demuxer_read_in_progress_; | 171 bool demuxer_read_in_progress_; |
| 170 | 172 |
| 171 // Shared-memory buffer pool. Since allocating SHM segments requires a | 173 // Shared-memory buffer pool. Since allocating SHM segments requires a |
| 172 // round-trip to the browser process, we keep allocation out of the | 174 // round-trip to the browser process, we keep allocation out of the |
| 173 // steady-state of the decoder. | 175 // steady-state of the decoder. |
| 174 std::vector<SHMBuffer*> available_shm_segments_; | 176 std::vector<SHMBuffer*> available_shm_segments_; |
| 175 | 177 |
| 176 // Book-keeping variables. | 178 // Book-keeping variables. |
| 177 struct BufferPair { | 179 struct BufferPair { |
| 178 BufferPair(SHMBuffer* s, const scoped_refptr<Buffer>& b); | 180 BufferPair(SHMBuffer* s, const scoped_refptr<DecoderBuffer>& b); |
| 179 ~BufferPair(); | 181 ~BufferPair(); |
| 180 SHMBuffer* shm_buffer; | 182 SHMBuffer* shm_buffer; |
| 181 scoped_refptr<Buffer> buffer; | 183 scoped_refptr<DecoderBuffer> buffer; |
| 182 }; | 184 }; |
| 183 std::map<int32, BufferPair> bitstream_buffers_in_decoder_; | 185 std::map<int32, BufferPair> bitstream_buffers_in_decoder_; |
| 184 std::map<int32, PictureBuffer> picture_buffers_in_decoder_; | 186 std::map<int32, PictureBuffer> picture_buffers_in_decoder_; |
| 185 | 187 |
| 186 // The texture target used for decoded pictures. | 188 // The texture target used for decoded pictures. |
| 187 uint32 decoder_texture_target_; | 189 uint32 decoder_texture_target_; |
| 188 | 190 |
| 189 struct BufferTimeData { | 191 struct BufferTimeData { |
| 190 BufferTimeData(int32 bbid, base::TimeDelta ts, base::TimeDelta dur); | 192 BufferTimeData(int32 bbid, base::TimeDelta ts, base::TimeDelta dur); |
| 191 ~BufferTimeData(); | 193 ~BufferTimeData(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 207 | 209 |
| 208 // Indicates decoding error occurred. | 210 // Indicates decoding error occurred. |
| 209 bool error_occured_; | 211 bool error_occured_; |
| 210 | 212 |
| 211 DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoder); | 213 DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoder); |
| 212 }; | 214 }; |
| 213 | 215 |
| 214 } // namespace media | 216 } // namespace media |
| 215 | 217 |
| 216 #endif // MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ | 218 #endif // MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ |
| OLD | NEW |