[Android WebView] Fix webview perf bot switchover to use org.chromium.webview_shell...
[chromium-blink-merge.git] / content / common / gpu / media / v4l2_video_decode_accelerator.h
blob3dfd8606b82445706beed09b2ec7f3484cc52185
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
3 // found in the LICENSE file.
4 //
5 // This file contains an implementation of VideoDecodeAccelerator
6 // that utilizes hardware video decoders, which expose Video4Linux 2 API
7 // (http://linuxtv.org/downloads/v4l-dvb-apis/).
9 #ifndef CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_
10 #define CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_
12 #include <queue>
13 #include <vector>
15 #include "base/callback_forward.h"
16 #include "base/memory/linked_ptr.h"
17 #include "base/memory/ref_counted.h"
18 #include "base/memory/scoped_ptr.h"
19 #include "base/synchronization/waitable_event.h"
20 #include "base/threading/thread.h"
21 #include "content/common/content_export.h"
22 #include "content/common/gpu/media/v4l2_device.h"
23 #include "media/base/limits.h"
24 #include "media/base/video_decoder_config.h"
25 #include "media/video/picture.h"
26 #include "media/video/video_decode_accelerator.h"
27 #include "ui/gfx/geometry/size.h"
28 #include "ui/gl/gl_bindings.h"
30 namespace media {
31 class H264Parser;
32 } // namespace media
34 namespace content {
35 // This class handles video accelerators directly through a V4L2 device exported
36 // by the hardware blocks.
38 // The threading model of this class is driven by the fact that it needs to
39 // interface two fundamentally different event queues -- the one Chromium
40 // provides through MessageLoop, and the one driven by the V4L2 devices which
41 // is waited on with epoll(). There are three threads involved in this class:
43 // * The child thread, which is the main GPU process thread which calls the
44 // media::VideoDecodeAccelerator entry points. Calls from this thread
45 // generally do not block (with the exception of Initialize() and Destroy()).
46 // They post tasks to the decoder_thread_, which actually services the task
47 // and calls back when complete through the
48 // media::VideoDecodeAccelerator::Client interface.
49 // * The decoder_thread_, owned by this class. It services API tasks, through
50 // the *Task() routines, as well as V4L2 device events, through
51 // ServiceDeviceTask(). Almost all state modification is done on this thread
52 // (this doesn't include buffer (re)allocation sequence, see below).
53 // * The device_poll_thread_, owned by this class. All it does is epoll() on
54 // the V4L2 in DevicePollTask() and schedule a ServiceDeviceTask() on the
55 // decoder_thread_ when something interesting happens.
56 // TODO(sheu): replace this thread with an TYPE_IO decoder_thread_.
58 // Note that this class has (almost) no locks, apart from the pictures_assigned_
59 // WaitableEvent. Everything (apart from buffer (re)allocation) is serviced on
60 // the decoder_thread_, so there are no synchronization issues.
61 // ... well, there are, but it's a matter of getting messages posted in the
62 // right order, not fiddling with locks.
63 // Buffer creation is a two-step process that is serviced partially on the
64 // Child thread, because we need to wait for the client to provide textures
65 // for the buffers we allocate. We cannot keep the decoder thread running while
66 // the client allocates Pictures for us, because we need to REQBUFS first to get
67 // the required number of output buffers from the device and that cannot be done
68 // unless we free the previous set of buffers, leaving the decoding in a
69 // inoperable state for the duration of the wait for Pictures. So to prevent
70 // subtle races (esp. if we get Reset() in the meantime), we block the decoder
71 // thread while we wait for AssignPictureBuffers from the client.
72 class CONTENT_EXPORT V4L2VideoDecodeAccelerator
73 : public media::VideoDecodeAccelerator {
74 public:
75 V4L2VideoDecodeAccelerator(
76 EGLDisplay egl_display,
77 EGLContext egl_context,
78 const base::WeakPtr<Client>& io_client_,
79 const base::Callback<bool(void)>& make_context_current,
80 const scoped_refptr<V4L2Device>& device,
81 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
82 ~V4L2VideoDecodeAccelerator() override;
84 // media::VideoDecodeAccelerator implementation.
85 // Note: Initialize() and Destroy() are synchronous.
86 bool Initialize(media::VideoCodecProfile profile,
87 Client* client) override;
88 void Decode(const media::BitstreamBuffer& bitstream_buffer) override;
89 void AssignPictureBuffers(
90 const std::vector<media::PictureBuffer>& buffers) override;
91 void ReusePictureBuffer(int32 picture_buffer_id) override;
92 void Flush() override;
93 void Reset() override;
94 void Destroy() override;
95 bool CanDecodeOnIOThread() override;
97 static media::VideoDecodeAccelerator::SupportedProfiles
98 GetSupportedProfiles();
100 private:
101 // These are rather subjectively tuned.
102 enum {
103 kInputBufferCount = 8,
104 // TODO(posciak): determine input buffer size based on level limits.
105 // See http://crbug.com/255116.
106 // Input bitstream buffer size for up to 1080p streams.
107 kInputBufferMaxSizeFor1080p = 1024 * 1024,
108 // Input bitstream buffer size for up to 4k streams.
109 kInputBufferMaxSizeFor4k = 4 * kInputBufferMaxSizeFor1080p,
110 // Number of output buffers to use for each VDA stage above what's required
111 // by the decoder (e.g. DPB size, in H264). We need
112 // media::limits::kMaxVideoFrames to fill up the GpuVideoDecode pipeline,
113 // and +1 for a frame in transit.
114 kDpbOutputBufferExtraCount = media::limits::kMaxVideoFrames + 1,
117 // Internal state of the decoder.
118 enum State {
119 kUninitialized, // Initialize() not yet called.
120 kInitialized, // Initialize() returned true; ready to start decoding.
121 kDecoding, // DecodeBufferInitial() successful; decoding frames.
122 kResetting, // Presently resetting.
123 kAfterReset, // After Reset(), ready to start decoding again.
124 kChangingResolution, // Performing resolution change, all remaining
125 // pre-change frames decoded and processed.
126 kError, // Error in kDecoding state.
129 enum BufferId {
130 kFlushBufferId = -2 // Buffer id for flush buffer, queued by FlushTask().
133 // Auto-destruction reference for BitstreamBuffer, for message-passing from
134 // Decode() to DecodeTask().
135 struct BitstreamBufferRef;
137 // Auto-destruction reference for EGLSync (for message-passing).
138 struct EGLSyncKHRRef;
140 // Record for decoded pictures that can be sent to PictureReady.
141 struct PictureRecord;
143 // Record for input buffers.
144 struct InputRecord {
145 InputRecord();
146 ~InputRecord();
147 bool at_device; // held by device.
148 void* address; // mmap() address.
149 size_t length; // mmap() length.
150 off_t bytes_used; // bytes filled in the mmap() segment.
151 int32 input_id; // triggering input_id as given to Decode().
154 // Record for output buffers.
155 struct OutputRecord {
156 OutputRecord();
157 ~OutputRecord();
158 bool at_device; // held by device.
159 bool at_client; // held by client.
160 EGLImageKHR egl_image; // EGLImageKHR for the output buffer.
161 EGLSyncKHR egl_sync; // sync the compositor's use of the EGLImage.
162 int32 picture_id; // picture buffer id as returned to PictureReady().
163 bool cleared; // Whether the texture is cleared and safe to render
164 // from. See TextureManager for details.
168 // Decoding tasks, to be run on decode_thread_.
171 // Enqueue a BitstreamBuffer to decode. This will enqueue a buffer to the
172 // decoder_input_queue_, then queue a DecodeBufferTask() to actually decode
173 // the buffer.
174 void DecodeTask(const media::BitstreamBuffer& bitstream_buffer);
176 // Decode from the buffers queued in decoder_input_queue_. Calls
177 // DecodeBufferInitial() or DecodeBufferContinue() as appropriate.
178 void DecodeBufferTask();
179 // Advance to the next fragment that begins a frame.
180 bool AdvanceFrameFragment(const uint8* data, size_t size, size_t* endpos);
181 // Schedule another DecodeBufferTask() if we're behind.
182 void ScheduleDecodeBufferTaskIfNeeded();
184 // Return true if we should continue to schedule DecodeBufferTask()s after
185 // completion. Store the amount of input actually consumed in |endpos|.
186 bool DecodeBufferInitial(const void* data, size_t size, size_t* endpos);
187 bool DecodeBufferContinue(const void* data, size_t size);
189 // Accumulate data for the next frame to decode. May return false in
190 // non-error conditions; for example when pipeline is full and should be
191 // retried later.
192 bool AppendToInputFrame(const void* data, size_t size);
193 // Flush data for one decoded frame.
194 bool FlushInputFrame();
196 // Service I/O on the V4L2 devices. This task should only be scheduled from
197 // DevicePollTask(). If |event_pending| is true, one or more events
198 // on file descriptor are pending.
199 void ServiceDeviceTask(bool event_pending);
200 // Handle the various device queues.
201 void Enqueue();
202 void Dequeue();
203 // Handle incoming events.
204 void DequeueEvents();
205 // Enqueue a buffer on the corresponding queue.
206 bool EnqueueInputRecord();
207 bool EnqueueOutputRecord();
209 // Process a ReusePictureBuffer() API call. The API call create an EGLSync
210 // object on the main (GPU process) thread; we will record this object so we
211 // can wait on it before reusing the buffer.
212 void ReusePictureBufferTask(int32 picture_buffer_id,
213 scoped_ptr<EGLSyncKHRRef> egl_sync_ref);
215 // Flush() task. Child thread should not submit any more buffers until it
216 // receives the NotifyFlushDone callback. This task will schedule an empty
217 // BitstreamBufferRef (with input_id == kFlushBufferId) to perform the flush.
218 void FlushTask();
219 // Notify the client of a flush completion, if required. This should be
220 // called any time a relevant queue could potentially be emptied: see
221 // function definition.
222 void NotifyFlushDoneIfNeeded();
224 // Reset() task. This task will schedule a ResetDoneTask() that will send
225 // the NotifyResetDone callback, then set the decoder state to kResetting so
226 // that all intervening tasks will drain.
227 void ResetTask();
228 // ResetDoneTask() will set the decoder state back to kAfterReset, so
229 // subsequent decoding can continue.
230 void ResetDoneTask();
232 // Device destruction task.
233 void DestroyTask();
235 // Attempt to start/stop device_poll_thread_.
236 bool StartDevicePoll();
237 // If |keep_input_state| is true, don't reset input state; used during
238 // resolution change.
239 bool StopDevicePoll(bool keep_input_state);
241 void StartResolutionChangeIfNeeded();
242 void FinishResolutionChange();
244 // Try to get output format and visible size, detected after parsing the
245 // beginning of the stream. Sets |again| to true if more parsing is needed.
246 // |visible_size| could be nullptr and ignored.
247 bool GetFormatInfo(struct v4l2_format* format,
248 gfx::Size* visible_size,
249 bool* again);
250 // Create output buffers for the given |format| and |visible_size|.
251 bool CreateBuffersForFormat(const struct v4l2_format& format,
252 const gfx::Size& visible_size);
254 // Try to get |visible_size|. Return visible size, or, if querying it is not
255 // supported or produces invalid size, return |coded_size| instead.
256 gfx::Size GetVisibleSize(const gfx::Size& coded_size);
259 // Device tasks, to be run on device_poll_thread_.
262 // The device task.
263 void DevicePollTask(bool poll_device);
266 // Safe from any thread.
269 // Error notification (using PostTask() to child thread, if necessary).
270 void NotifyError(Error error);
272 // Set the decoder_state_ to kError and notify the client (if necessary).
273 void SetErrorState(Error error);
276 // Other utility functions. Called on decoder_thread_, unless
277 // decoder_thread_ is not yet started, in which case the child thread can call
278 // these (e.g. in Initialize() or Destroy()).
281 // Create the buffers we need.
282 bool CreateInputBuffers();
283 bool CreateOutputBuffers();
285 // Set input and output formats before starting decode.
286 bool SetupFormats();
289 // Methods run on child thread.
292 // Destroy buffers.
293 void DestroyInputBuffers();
294 // In contrast to DestroyInputBuffers, which is called only from destructor,
295 // we call DestroyOutputBuffers also during playback, on resolution change.
296 // Even if anything fails along the way, we still want to go on and clean
297 // up as much as possible, so return false if this happens, so that the
298 // caller can error out on resolution change.
299 bool DestroyOutputBuffers();
300 void ResolutionChangeDestroyBuffers();
302 // Send decoded pictures to PictureReady.
303 void SendPictureReady();
305 // Callback that indicates a picture has been cleared.
306 void PictureCleared();
308 // This method determines whether a resolution change event processing
309 // is indeed required by returning true iff:
310 // - width or height of the new format is different than previous format; or
311 // - V4L2_CID_MIN_BUFFERS_FOR_CAPTURE has changed.
312 bool IsResolutionChangeNecessary();
314 // Our original calling task runner for the child thread.
315 scoped_refptr<base::SingleThreadTaskRunner> child_task_runner_;
317 // Task runner of the IO thread.
318 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
320 // WeakPtr<> pointing to |this| for use in posting tasks from the decoder or
321 // device worker threads back to the child thread. Because the worker threads
322 // are members of this class, any task running on those threads is guaranteed
323 // that this object is still alive. As a result, tasks posted from the child
324 // thread to the decoder or device thread should use base::Unretained(this),
325 // and tasks posted the other way should use |weak_this_|.
326 base::WeakPtr<V4L2VideoDecodeAccelerator> weak_this_;
328 // To expose client callbacks from VideoDecodeAccelerator.
329 // NOTE: all calls to these objects *MUST* be executed on
330 // child_task_runner_.
331 scoped_ptr<base::WeakPtrFactory<Client> > client_ptr_factory_;
332 base::WeakPtr<Client> client_;
333 // Callbacks to |io_client_| must be executed on |io_task_runner_|.
334 base::WeakPtr<Client> io_client_;
337 // Decoder state, owned and operated by decoder_thread_.
338 // Before decoder_thread_ has started, the decoder state is managed by
339 // the child (main) thread. After decoder_thread_ has started, the decoder
340 // thread should be the only one managing these.
343 // This thread services tasks posted from the VDA API entry points by the
344 // child thread and device service callbacks posted from the device thread.
345 base::Thread decoder_thread_;
346 // Decoder state machine state.
347 State decoder_state_;
348 // BitstreamBuffer we're presently reading.
349 scoped_ptr<BitstreamBufferRef> decoder_current_bitstream_buffer_;
350 // The V4L2Device this class is operating upon.
351 scoped_refptr<V4L2Device> device_;
352 // FlushTask() and ResetTask() should not affect buffers that have been
353 // queued afterwards. For flushing or resetting the pipeline then, we will
354 // delay these buffers until after the flush or reset completes.
355 int decoder_delay_bitstream_buffer_id_;
356 // Input buffer we're presently filling.
357 int decoder_current_input_buffer_;
358 // We track the number of buffer decode tasks we have scheduled, since each
359 // task execution should complete one buffer. If we fall behind (due to
360 // resource backpressure, etc.), we'll have to schedule more to catch up.
361 int decoder_decode_buffer_tasks_scheduled_;
362 // Picture buffers held by the client.
363 int decoder_frames_at_client_;
364 // Are we flushing?
365 bool decoder_flushing_;
366 // Got a notification from driver that it reached resolution change point
367 // in the stream.
368 bool resolution_change_pending_;
369 // Got a reset request while we were performing resolution change.
370 bool resolution_change_reset_pending_;
371 // Input queue for decoder_thread_: BitstreamBuffers in.
372 std::queue<linked_ptr<BitstreamBufferRef> > decoder_input_queue_;
373 // For H264 decode, hardware requires that we send it frame-sized chunks.
374 // We'll need to parse the stream.
375 scoped_ptr<media::H264Parser> decoder_h264_parser_;
376 // Set if the decoder has a pending incomplete frame in an input buffer.
377 bool decoder_partial_frame_pending_;
380 // Hardware state and associated queues. Since decoder_thread_ services
381 // the hardware, decoder_thread_ owns these too.
382 // output_buffer_map_, free_output_buffers_ and output_planes_count_ are an
383 // exception during the buffer (re)allocation sequence, when the
384 // decoder_thread_ is blocked briefly while the Child thread manipulates
385 // them.
388 // Completed decode buffers.
389 std::queue<int> input_ready_queue_;
391 // Input buffer state.
392 bool input_streamon_;
393 // Input buffers enqueued to device.
394 int input_buffer_queued_count_;
395 // Input buffers ready to use, as a LIFO since we don't care about ordering.
396 std::vector<int> free_input_buffers_;
397 // Mapping of int index to input buffer record.
398 std::vector<InputRecord> input_buffer_map_;
400 // Output buffer state.
401 bool output_streamon_;
402 // Output buffers enqueued to device.
403 int output_buffer_queued_count_;
404 // Output buffers ready to use, as a FIFO since we want oldest-first to hide
405 // synchronization latency with GL.
406 std::queue<int> free_output_buffers_;
407 // Mapping of int index to output buffer record.
408 std::vector<OutputRecord> output_buffer_map_;
409 // Required size of DPB for decoding.
410 int output_dpb_size_;
412 // Number of planes (i.e. separate memory buffers) for output.
413 size_t output_planes_count_;
415 // Pictures that are ready but not sent to PictureReady yet.
416 std::queue<PictureRecord> pending_picture_ready_;
418 // The number of pictures that are sent to PictureReady and will be cleared.
419 int picture_clearing_count_;
421 // Used by the decoder thread to wait for AssignPictureBuffers to arrive
422 // to avoid races with potential Reset requests.
423 base::WaitableEvent pictures_assigned_;
425 // Output picture coded size.
426 gfx::Size coded_size_;
428 // Output picture visible size.
429 gfx::Size visible_size_;
432 // The device polling thread handles notifications of V4L2 device changes.
435 // The thread.
436 base::Thread device_poll_thread_;
439 // Other state, held by the child (main) thread.
442 // Make our context current before running any EGL entry points.
443 base::Callback<bool(void)> make_context_current_;
445 // EGL state
446 EGLDisplay egl_display_;
447 EGLContext egl_context_;
449 // The codec we'll be decoding for.
450 media::VideoCodecProfile video_profile_;
451 // Chosen output format.
452 uint32_t output_format_fourcc_;
454 // The WeakPtrFactory for |weak_this_|.
455 base::WeakPtrFactory<V4L2VideoDecodeAccelerator> weak_this_factory_;
457 DISALLOW_COPY_AND_ASSIGN(V4L2VideoDecodeAccelerator);
460 } // namespace content
462 #endif // CONTENT_COMMON_GPU_MEDIA_V4L2_VIDEO_DECODE_ACCELERATOR_H_