| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // This file contains an implementation of VideoDecodeAccelerator | 5 // This file contains an implementation of VideoDecodeAccelerator |
| 6 // that utilizes hardware video decoders, which expose Video4Linux 2 API | 6 // that utilizes hardware video decoders, which expose Video4Linux 2 API |
| 7 // (http://linuxtv.org/downloads/v4l-dvb-apis/). | 7 // (http://linuxtv.org/downloads/v4l-dvb-apis/). |
| 8 | 8 |
| 9 #ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ | 9 #ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ |
| 10 #define CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ | 10 #define CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 off_t bytes_used; // bytes filled in the mmap() segment. | 148 off_t bytes_used; // bytes filled in the mmap() segment. |
| 149 int32 input_id; // triggering input_id as given to Decode(). | 149 int32 input_id; // triggering input_id as given to Decode(). |
| 150 }; | 150 }; |
| 151 | 151 |
| 152 // Record for output buffers. | 152 // Record for output buffers. |
| 153 struct OutputRecord { | 153 struct OutputRecord { |
| 154 OutputRecord(); | 154 OutputRecord(); |
| 155 ~OutputRecord(); | 155 ~OutputRecord(); |
| 156 bool at_device; // held by device. | 156 bool at_device; // held by device. |
| 157 bool at_client; // held by client. | 157 bool at_client; // held by client. |
| 158 int fds[2]; // file descriptors for each plane. | |
| 159 EGLImageKHR egl_image; // EGLImageKHR for the output buffer. | 158 EGLImageKHR egl_image; // EGLImageKHR for the output buffer. |
| 160 EGLSyncKHR egl_sync; // sync the compositor's use of the EGLImage. | 159 EGLSyncKHR egl_sync; // sync the compositor's use of the EGLImage. |
| 161 int32 picture_id; // picture buffer id as returned to PictureReady(). | 160 int32 picture_id; // picture buffer id as returned to PictureReady(). |
| 162 bool cleared; // Whether the texture is cleared and safe to render | 161 bool cleared; // Whether the texture is cleared and safe to render |
| 163 // from. See TextureManager for details. | 162 // from. See TextureManager for details. |
| 164 }; | 163 }; |
| 165 | 164 |
| 166 // | 165 // |
| 167 // Decoding tasks, to be run on decode_thread_. | 166 // Decoding tasks, to be run on decode_thread_. |
| 168 // | 167 // |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 // caller can error out on resolution change. | 286 // caller can error out on resolution change. |
| 288 bool DestroyOutputBuffers(); | 287 bool DestroyOutputBuffers(); |
| 289 void ResolutionChangeDestroyBuffers(); | 288 void ResolutionChangeDestroyBuffers(); |
| 290 | 289 |
| 291 // Send decoded pictures to PictureReady. | 290 // Send decoded pictures to PictureReady. |
| 292 void SendPictureReady(); | 291 void SendPictureReady(); |
| 293 | 292 |
| 294 // Callback that indicates a picture has been cleared. | 293 // Callback that indicates a picture has been cleared. |
| 295 void PictureCleared(); | 294 void PictureCleared(); |
| 296 | 295 |
| 296 // This method determines whether a resolution change event processing |
| 297 // is indeed required by returning true iff: |
| 298 // - width or height of the new format is different than previous format; or |
| 299 // - V4L2_CID_MIN_BUFFERS_FOR_CAPTURE has changed. |
| 300 bool IsResolutionChangeNecessary(); |
| 301 |
| 297 // Our original calling message loop for the child thread. | 302 // Our original calling message loop for the child thread. |
| 298 scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_; | 303 scoped_refptr<base::MessageLoopProxy> child_message_loop_proxy_; |
| 299 | 304 |
| 300 // Message loop of the IO thread. | 305 // Message loop of the IO thread. |
| 301 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; | 306 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
| 302 | 307 |
| 303 // WeakPtr<> pointing to |this| for use in posting tasks from the decoder or | 308 // WeakPtr<> pointing to |this| for use in posting tasks from the decoder or |
| 304 // device worker threads back to the child thread. Because the worker threads | 309 // device worker threads back to the child thread. Because the worker threads |
| 305 // are members of this class, any task running on those threads is guaranteed | 310 // are members of this class, any task running on those threads is guaranteed |
| 306 // that this object is still alive. As a result, tasks posted from the child | 311 // that this object is still alive. As a result, tasks posted from the child |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 std::queue<linked_ptr<BitstreamBufferRef> > decoder_input_queue_; | 360 std::queue<linked_ptr<BitstreamBufferRef> > decoder_input_queue_; |
| 356 // For H264 decode, hardware requires that we send it frame-sized chunks. | 361 // For H264 decode, hardware requires that we send it frame-sized chunks. |
| 357 // We'll need to parse the stream. | 362 // We'll need to parse the stream. |
| 358 scoped_ptr<media::H264Parser> decoder_h264_parser_; | 363 scoped_ptr<media::H264Parser> decoder_h264_parser_; |
| 359 // Set if the decoder has a pending incomplete frame in an input buffer. | 364 // Set if the decoder has a pending incomplete frame in an input buffer. |
| 360 bool decoder_partial_frame_pending_; | 365 bool decoder_partial_frame_pending_; |
| 361 | 366 |
| 362 // | 367 // |
| 363 // Hardware state and associated queues. Since decoder_thread_ services | 368 // Hardware state and associated queues. Since decoder_thread_ services |
| 364 // the hardware, decoder_thread_ owns these too. | 369 // the hardware, decoder_thread_ owns these too. |
| 365 // output_buffer_map_ and free_output_buffers_ are an exception during the | 370 // output_buffer_map_, free_output_buffers_ and output_planes_count_ are an |
| 366 // buffer (re)allocation sequence, when the decoder_thread_ is blocked briefly | 371 // exception during the buffer (re)allocation sequence, when the |
| 367 // while the Child thread manipulates them. | 372 // decoder_thread_ is blocked briefly while the Child thread manipulates |
| 373 // them. |
| 368 // | 374 // |
| 369 | 375 |
| 370 // Completed decode buffers. | 376 // Completed decode buffers. |
| 371 std::queue<int> input_ready_queue_; | 377 std::queue<int> input_ready_queue_; |
| 372 | 378 |
| 373 // Input buffer state. | 379 // Input buffer state. |
| 374 bool input_streamon_; | 380 bool input_streamon_; |
| 375 // Input buffers enqueued to device. | 381 // Input buffers enqueued to device. |
| 376 int input_buffer_queued_count_; | 382 int input_buffer_queued_count_; |
| 377 // Input buffers ready to use, as a LIFO since we don't care about ordering. | 383 // Input buffers ready to use, as a LIFO since we don't care about ordering. |
| 378 std::vector<int> free_input_buffers_; | 384 std::vector<int> free_input_buffers_; |
| 379 // Mapping of int index to input buffer record. | 385 // Mapping of int index to input buffer record. |
| 380 std::vector<InputRecord> input_buffer_map_; | 386 std::vector<InputRecord> input_buffer_map_; |
| 381 | 387 |
| 382 // Output buffer state. | 388 // Output buffer state. |
| 383 bool output_streamon_; | 389 bool output_streamon_; |
| 384 // Output buffers enqueued to device. | 390 // Output buffers enqueued to device. |
| 385 int output_buffer_queued_count_; | 391 int output_buffer_queued_count_; |
| 386 // Output buffers ready to use, as a FIFO since we want oldest-first to hide | 392 // Output buffers ready to use, as a FIFO since we want oldest-first to hide |
| 387 // synchronization latency with GL. | 393 // synchronization latency with GL. |
| 388 std::queue<int> free_output_buffers_; | 394 std::queue<int> free_output_buffers_; |
| 389 // Mapping of int index to output buffer record. | 395 // Mapping of int index to output buffer record. |
| 390 std::vector<OutputRecord> output_buffer_map_; | 396 std::vector<OutputRecord> output_buffer_map_; |
| 391 // Output pixel format. | 397 // Output pixel format. |
| 392 uint32 output_buffer_pixelformat_; | 398 uint32 output_buffer_pixelformat_; |
| 393 // Required size of DPB for decoding. | 399 // Required size of DPB for decoding. |
| 394 int output_dpb_size_; | 400 int output_dpb_size_; |
| 401 // Stores the number of planes (i.e. separate memory buffers) for output. |
| 402 size_t output_planes_count_; |
| 395 | 403 |
| 396 // Pictures that are ready but not sent to PictureReady yet. | 404 // Pictures that are ready but not sent to PictureReady yet. |
| 397 std::queue<PictureRecord> pending_picture_ready_; | 405 std::queue<PictureRecord> pending_picture_ready_; |
| 398 | 406 |
| 399 // The number of pictures that are sent to PictureReady and will be cleared. | 407 // The number of pictures that are sent to PictureReady and will be cleared. |
| 400 int picture_clearing_count_; | 408 int picture_clearing_count_; |
| 401 | 409 |
| 402 // Used by the decoder thread to wait for AssignPictureBuffers to arrive | 410 // Used by the decoder thread to wait for AssignPictureBuffers to arrive |
| 403 // to avoid races with potential Reset requests. | 411 // to avoid races with potential Reset requests. |
| 404 base::WaitableEvent pictures_assigned_; | 412 base::WaitableEvent pictures_assigned_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 425 | 433 |
| 426 // The codec we'll be decoding for. | 434 // The codec we'll be decoding for. |
| 427 media::VideoCodecProfile video_profile_; | 435 media::VideoCodecProfile video_profile_; |
| 428 | 436 |
| 429 DISALLOW_COPY_AND_ASSIGN(V4L2VideoDecodeAccelerator); | 437 DISALLOW_COPY_AND_ASSIGN(V4L2VideoDecodeAccelerator); |
| 430 }; | 438 }; |
| 431 | 439 |
| 432 } // namespace content | 440 } // namespace content |
| 433 | 441 |
| 434 #endif // CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ | 442 #endif // CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_ |
| OLD | NEW |