• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/).
8 // Note: ported from Chromium commit head: 85fdf90
9 // Note: image processor is not ported.
10 
11 #ifndef MEDIA_GPU_V4L2_VIDEO_DECODE_ACCELERATOR_H_
12 #define MEDIA_GPU_V4L2_VIDEO_DECODE_ACCELERATOR_H_
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 #include <list>
18 #include <memory>
19 #include <queue>
20 #include <vector>
21 
22 #include "base/callback_forward.h"
23 #include "base/macros.h"
24 #include "base/memory/linked_ptr.h"
25 #include "base/memory/ref_counted.h"
26 #include "base/synchronization/waitable_event.h"
27 #include "base/threading/thread.h"
28 #include "picture.h"
29 #include "size.h"
30 #include "v4l2_device.h"
31 #include "video_decode_accelerator.h"
32 
33 namespace media {
34 
35 class H264Parser;
36 
37 // This class handles video accelerators directly through a V4L2 device exported
38 // by the hardware blocks.
39 //
40 // The threading model of this class is driven by the fact that it needs to
41 // interface two fundamentally different event queues -- the one Chromium
42 // provides through MessageLoop, and the one driven by the V4L2 devices which
43 // is waited on with epoll().  There are three threads involved in this class:
44 //
45 // * The child thread, which is the main GPU process thread which calls the
46 //   VideoDecodeAccelerator entry points.  Calls from this thread
47 //   generally do not block (with the exception of Initialize() and Destroy()).
48 //   They post tasks to the decoder_thread_, which actually services the task
49 //   and calls back when complete through the
50 //   VideoDecodeAccelerator::Client interface.
51 // * The decoder_thread_, owned by this class.  It services API tasks, through
52 //   the *Task() routines, as well as V4L2 device events, through
53 //   ServiceDeviceTask().  Almost all state modification is done on this thread
54 //   (this doesn't include buffer (re)allocation sequence, see below).
55 // * The device_poll_thread_, owned by this class.  All it does is epoll() on
56 //   the V4L2 in DevicePollTask() and schedule a ServiceDeviceTask() on the
57 //   decoder_thread_ when something interesting happens.
58 //   TODO(sheu): replace this thread with an TYPE_IO decoder_thread_.
59 //
60 // Note that this class has (almost) no locks, apart from the pictures_assigned_
61 // WaitableEvent. Everything (apart from buffer (re)allocation) is serviced on
62 // the decoder_thread_, so there are no synchronization issues.
63 // ... well, there are, but it's a matter of getting messages posted in the
64 // right order, not fiddling with locks.
65 // Buffer creation is a two-step process that is serviced partially on the
66 // Child thread, because we need to wait for the client to provide textures
67 // for the buffers we allocate. We cannot keep the decoder thread running while
68 // the client allocates Pictures for us, because we need to REQBUFS first to get
69 // the required number of output buffers from the device and that cannot be done
70 // unless we free the previous set of buffers, leaving the decoding in a
71 // inoperable state for the duration of the wait for Pictures. So to prevent
72 // subtle races (esp. if we get Reset() in the meantime), we block the decoder
73 // thread while we wait for AssignPictureBuffers from the client.
74 //
75 // V4L2VideoDecodeAccelerator may use image processor to convert the output.
76 // There are three cases:
77 // Flush: V4L2VDA should wait until image processor returns all processed
78 //   frames.
79 // Reset: V4L2VDA doesn't need to wait for image processor. When image processor
80 //   returns an old frame, drop it.
81 // Resolution change: V4L2VDA destroy image processor when destroying output
82 //   buffrers. We cannot drop any frame during resolution change. So V4L2VDA
83 //   should destroy output buffers after image processor returns all the frames.
84 class V4L2VideoDecodeAccelerator
85     : public VideoDecodeAccelerator {
86  public:
87   V4L2VideoDecodeAccelerator(
88       const scoped_refptr<V4L2Device>& device);
89   ~V4L2VideoDecodeAccelerator() override;
90 
91   // VideoDecodeAccelerator implementation.
92   // Note: Initialize() and Destroy() are synchronous.
93   bool Initialize(const Config& config, Client* client) override;
94   void Decode(const BitstreamBuffer& bitstream_buffer) override;
95   void AssignPictureBuffers(const std::vector<PictureBuffer>& buffers) override;
96   void ImportBufferForPicture(
97       int32_t picture_buffer_id,
98       VideoPixelFormat pixel_format,
99       const NativePixmapHandle& native_pixmap_handle) override;
100   void ReusePictureBuffer(int32_t picture_buffer_id) override;
101   void Flush() override;
102   void Reset() override;
103   void Destroy() override;
104   bool TryToSetupDecodeOnSeparateThread(
105       const base::WeakPtr<Client>& decode_client,
106       const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner)
107       override;
108 
109   static VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles();
110 
111  private:
112   // These are rather subjectively tuned.
113   enum {
114     kInputBufferCount = 8,
115     // TODO(posciak): determine input buffer size based on level limits.
116     // See http://crbug.com/255116.
117     // Input bitstream buffer size for up to 1080p streams.
118     kInputBufferMaxSizeFor1080p = 1024 * 1024,
119     // Input bitstream buffer size for up to 4k streams.
120     kInputBufferMaxSizeFor4k = 4 * kInputBufferMaxSizeFor1080p,
121     // This is originally from media/base/limits.h in Chromium.
122     kMaxVideoFrames = 4,
123     // Number of output buffers to use for each VDA stage above what's required
124     // by the decoder (e.g. DPB size, in H264).  We need
125     // limits::kMaxVideoFrames to fill up the GpuVideoDecode pipeline,
126     // and +1 for a frame in transit.
127     kDpbOutputBufferExtraCount = kMaxVideoFrames + 1,
128     // Number of extra output buffers if image processor is used.
129     kDpbOutputBufferExtraCountForImageProcessor = 1,
130   };
131 
132   // Internal state of the decoder.
133   enum State {
134     kUninitialized,  // Initialize() not yet called.
135     kInitialized,    // Initialize() returned true; ready to start decoding.
136     kDecoding,       // DecodeBufferInitial() successful; decoding frames.
137     kResetting,      // Presently resetting.
138     // Performing resolution change and waiting for image processor to return
139     // all frames.
140     kChangingResolution,
141     // Requested new PictureBuffers via ProvidePictureBuffers(), awaiting
142     // AssignPictureBuffers().
143     kAwaitingPictureBuffers,
144     kError,  // Error in kDecoding state.
145   };
146 
147   enum OutputRecordState {
148     kFree,         // Ready to be queued to the device.
149     kAtDevice,     // Held by device.
150     kAtProcessor,  // Held by image processor.
151     kAtClient,     // Held by client of V4L2VideoDecodeAccelerator.
152   };
153 
154   enum BufferId {
155     kFlushBufferId = -2  // Buffer id for flush buffer, queued by FlushTask().
156   };
157 
158   // Auto-destruction reference for BitstreamBuffer, for message-passing from
159   // Decode() to DecodeTask().
160   struct BitstreamBufferRef;
161 
162   // Record for decoded pictures that can be sent to PictureReady.
163   struct PictureRecord {
164     PictureRecord(bool cleared, const Picture& picture);
165     ~PictureRecord();
166     bool cleared;     // Whether the texture is cleared and safe to render from.
167     Picture picture;  // The decoded picture.
168   };
169 
170   // Record for input buffers.
171   struct InputRecord {
172     InputRecord();
173     ~InputRecord();
174     bool at_device;    // held by device.
175     void* address;     // mmap() address.
176     size_t length;     // mmap() length.
177     off_t bytes_used;  // bytes filled in the mmap() segment.
178     int32_t input_id;  // triggering input_id as given to Decode().
179   };
180 
181   // Record for output buffers.
182   struct OutputRecord {
183     OutputRecord();
184     OutputRecord(OutputRecord&&) = default;
185     ~OutputRecord();
186     OutputRecordState state;
187     int32_t picture_id;     // picture buffer id as returned to PictureReady().
188     bool cleared;           // Whether the texture is cleared and safe to render
189                             // from. See TextureManager for details.
190     // Output fds of the processor. Used only when OutputMode is IMPORT.
191     std::vector<base::ScopedFD> processor_output_fds;
192   };
193 
194   //
195   // Decoding tasks, to be run on decode_thread_.
196   //
197 
198   // Task to finish initialization on decoder_thread_.
199   void InitializeTask();
200 
201   // Enqueue a BitstreamBuffer to decode.  This will enqueue a buffer to the
202   // decoder_input_queue_, then queue a DecodeBufferTask() to actually decode
203   // the buffer.
204   void DecodeTask(const BitstreamBuffer& bitstream_buffer);
205 
206   // Decode from the buffers queued in decoder_input_queue_.  Calls
207   // DecodeBufferInitial() or DecodeBufferContinue() as appropriate.
208   void DecodeBufferTask();
209   // Advance to the next fragment that begins a frame.
210   bool AdvanceFrameFragment(const uint8_t* data, size_t size, size_t* endpos);
211   // Schedule another DecodeBufferTask() if we're behind.
212   void ScheduleDecodeBufferTaskIfNeeded();
213 
214   // Return true if we should continue to schedule DecodeBufferTask()s after
215   // completion.  Store the amount of input actually consumed in |endpos|.
216   bool DecodeBufferInitial(const void* data, size_t size, size_t* endpos);
217   bool DecodeBufferContinue(const void* data, size_t size);
218 
219   // Accumulate data for the next frame to decode.  May return false in
220   // non-error conditions; for example when pipeline is full and should be
221   // retried later.
222   bool AppendToInputFrame(const void* data, size_t size);
223   // Flush data for one decoded frame.
224   bool FlushInputFrame();
225 
226   // Allocate V4L2 buffers and assign them to |buffers| provided by the client
227   // via AssignPictureBuffers() on decoder thread.
228   void AssignPictureBuffersTask(const std::vector<PictureBuffer>& buffers);
229 
230   // Use buffer backed by dmabuf file descriptors in |dmabuf_fds| for the
231   // OutputRecord associated with |picture_buffer_id|, taking ownership of the
232   // file descriptors.
233   void ImportBufferForPictureTask(int32_t picture_buffer_id,
234                                   std::vector<base::ScopedFD> dmabuf_fds);
235 
236   // Service I/O on the V4L2 devices.  This task should only be scheduled from
237   // DevicePollTask().  If |event_pending| is true, one or more events
238   // on file descriptor are pending.
239   void ServiceDeviceTask(bool event_pending);
240   // Handle the various device queues.
241   void Enqueue();
242   void Dequeue();
243   // Dequeue one input buffer. Return true if success.
244   bool DequeueInputBuffer();
245   // Dequeue one output buffer. Return true if success.
246   bool DequeueOutputBuffer();
247 
248   // Return true if there is a resolution change event pending.
249   bool DequeueResolutionChangeEvent();
250 
251   // Enqueue a buffer on the corresponding queue.
252   bool EnqueueInputRecord();
253   bool EnqueueOutputRecord();
254 
255   // Process a ReusePictureBuffer() API call.  The API call create an EGLSync
256   // object on the main (GPU process) thread; we will record this object so we
257   // can wait on it before reusing the buffer.
258   void ReusePictureBufferTask(int32_t picture_buffer_id);
259 
260   // Flush() task.  Child thread should not submit any more buffers until it
261   // receives the NotifyFlushDone callback.  This task will schedule an empty
262   // BitstreamBufferRef (with input_id == kFlushBufferId) to perform the flush.
263   void FlushTask();
264   // Notify the client of a flush completion, if required.  This should be
265   // called any time a relevant queue could potentially be emptied: see
266   // function definition.
267   void NotifyFlushDoneIfNeeded();
268   // Returns true if VIDIOC_DECODER_CMD is supported.
269   bool IsDecoderCmdSupported();
270   // Send V4L2_DEC_CMD_START to the driver. Return true if success.
271   bool SendDecoderCmdStop();
272 
273   // Reset() task.  Drop all input buffers. If V4L2VDA is not doing resolution
274   // change or waiting picture buffers, call FinishReset.
275   void ResetTask();
276   // This will schedule a ResetDoneTask() that will send the NotifyResetDone
277   // callback, then set the decoder state to kResetting so that all intervening
278   // tasks will drain.
279   void FinishReset();
280   void ResetDoneTask();
281 
282   // Device destruction task.
283   void DestroyTask();
284 
285   // Start |device_poll_thread_|.
286   bool StartDevicePoll();
287 
288   // Stop |device_poll_thread_|.
289   bool StopDevicePoll();
290 
291   bool StopInputStream();
292   bool StopOutputStream();
293 
294   void StartResolutionChange();
295   void FinishResolutionChange();
296 
297   // Try to get output format and visible size, detected after parsing the
298   // beginning of the stream. Sets |again| to true if more parsing is needed.
299   // |visible_size| could be nullptr and ignored.
300   bool GetFormatInfo(struct v4l2_format* format,
301                      Size* visible_size,
302                      bool* again);
303   // Create output buffers for the given |format| and |visible_size|.
304   bool CreateBuffersForFormat(const struct v4l2_format& format,
305                               const Size& visible_size);
306 
307   // Try to get |visible_size|. Return visible size, or, if querying it is not
308   // supported or produces invalid size, return |coded_size| instead.
309   Size GetVisibleSize(const Size& coded_size);
310 
311   //
312   // Device tasks, to be run on device_poll_thread_.
313   //
314 
315   // The device task.
316   void DevicePollTask(bool poll_device);
317 
318   //
319   // Safe from any thread.
320   //
321 
322   // Error notification (using PostTask() to child thread, if necessary).
323   void NotifyError(Error error);
324 
325   // Set the decoder_state_ to kError and notify the client (if necessary).
326   void SetErrorState(Error error);
327 
328   //
329   // Other utility functions.  Called on decoder_thread_, unless
330   // decoder_thread_ is not yet started, in which case the child thread can call
331   // these (e.g. in Initialize() or Destroy()).
332   //
333 
334   // Create the buffers we need.
335   bool CreateInputBuffers();
336   bool CreateOutputBuffers();
337 
338   // Destroy buffers.
339   void DestroyInputBuffers();
340   // In contrast to DestroyInputBuffers, which is called only on destruction,
341   // we call DestroyOutputBuffers also during playback, on resolution change.
342   // Even if anything fails along the way, we still want to go on and clean
343   // up as much as possible, so return false if this happens, so that the
344   // caller can error out on resolution change.
345   bool DestroyOutputBuffers();
346 
347   // Set input and output formats before starting decode.
348   bool SetupFormats();
349 
350   //
351   // Methods run on child thread.
352   //
353 
354   // Send decoded pictures to PictureReady.
355   void SendPictureReady();
356 
357   // Callback that indicates a picture has been cleared.
358   void PictureCleared();
359 
360   // Our original calling task runner for the child thread.
361   scoped_refptr<base::SingleThreadTaskRunner> child_task_runner_;
362 
363   // Task runner Decode() and PictureReady() run on.
364   scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner_;
365 
366   // WeakPtr<> pointing to |this| for use in posting tasks from the decoder or
367   // device worker threads back to the child thread.  Because the worker threads
368   // are members of this class, any task running on those threads is guaranteed
369   // that this object is still alive.  As a result, tasks posted from the child
370   // thread to the decoder or device thread should use base::Unretained(this),
371   // and tasks posted the other way should use |weak_this_|.
372   base::WeakPtr<V4L2VideoDecodeAccelerator> weak_this_;
373 
374   // To expose client callbacks from VideoDecodeAccelerator.
375   // NOTE: all calls to these objects *MUST* be executed on
376   // child_task_runner_.
377   std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_;
378   base::WeakPtr<Client> client_;
379   // Callbacks to |decode_client_| must be executed on |decode_task_runner_|.
380   base::WeakPtr<Client> decode_client_;
381 
382   //
383   // Decoder state, owned and operated by decoder_thread_.
384   // Before decoder_thread_ has started, the decoder state is managed by
385   // the child (main) thread.  After decoder_thread_ has started, the decoder
386   // thread should be the only one managing these.
387   //
388 
389   // This thread services tasks posted from the VDA API entry points by the
390   // child thread and device service callbacks posted from the device thread.
391   base::Thread decoder_thread_;
392   // Decoder state machine state.
393   State decoder_state_;
394 
395   Config::OutputMode output_mode_;
396 
397   // BitstreamBuffer we're presently reading.
398   std::unique_ptr<BitstreamBufferRef> decoder_current_bitstream_buffer_;
399   // The V4L2Device this class is operating upon.
400   scoped_refptr<V4L2Device> device_;
401   // FlushTask() and ResetTask() should not affect buffers that have been
402   // queued afterwards.  For flushing or resetting the pipeline then, we will
403   // delay these buffers until after the flush or reset completes.
404   int decoder_delay_bitstream_buffer_id_;
405   // Input buffer we're presently filling.
406   int decoder_current_input_buffer_;
407   // We track the number of buffer decode tasks we have scheduled, since each
408   // task execution should complete one buffer.  If we fall behind (due to
409   // resource backpressure, etc.), we'll have to schedule more to catch up.
410   int decoder_decode_buffer_tasks_scheduled_;
411   // Picture buffers held by the client.
412   int decoder_frames_at_client_;
413 
414   // Are we flushing?
415   bool decoder_flushing_;
416   // True if VIDIOC_DECODER_CMD is supported.
417   bool decoder_cmd_supported_;
418   // True if flushing is waiting for last output buffer. After
419   // VIDIOC_DECODER_CMD is sent to the driver, this flag will be set to true to
420   // wait for the last output buffer. When this flag is true, flush done will
421   // not be sent. After an output buffer that has the flag V4L2_BUF_FLAG_LAST is
422   // received, this is set to false.
423   bool flush_awaiting_last_output_buffer_;
424 
425   // Got a reset request while we were performing resolution change or waiting
426   // picture buffers.
427   bool reset_pending_;
428   // Input queue for decoder_thread_: BitstreamBuffers in.
429   std::queue<linked_ptr<BitstreamBufferRef>> decoder_input_queue_;
430   // For H264 decode, hardware requires that we send it frame-sized chunks.
431   // We'll need to parse the stream.
432   std::unique_ptr<H264Parser> decoder_h264_parser_;
433   // Set if the decoder has a pending incomplete frame in an input buffer.
434   bool decoder_partial_frame_pending_;
435 
436   //
437   // Hardware state and associated queues.  Since decoder_thread_ services
438   // the hardware, decoder_thread_ owns these too.
439   // output_buffer_map_, free_output_buffers_ and output_planes_count_ are an
440   // exception during the buffer (re)allocation sequence, when the
441   // decoder_thread_ is blocked briefly while the Child thread manipulates
442   // them.
443   //
444 
445   // Completed decode buffers.
446   std::queue<int> input_ready_queue_;
447 
448   // Input buffer state.
449   bool input_streamon_;
450   // Input buffers enqueued to device.
451   int input_buffer_queued_count_;
452   // Input buffers ready to use, as a LIFO since we don't care about ordering.
453   std::vector<int> free_input_buffers_;
454   // Mapping of int index to input buffer record.
455   std::vector<InputRecord> input_buffer_map_;
456 
457   // Output buffer state.
458   bool output_streamon_;
459   // Output buffers enqueued to device.
460   int output_buffer_queued_count_;
461   // Output buffers ready to use, as a FIFO since we want oldest-first to hide
462   // synchronization latency with GL.
463   std::list<int> free_output_buffers_;
464   // Mapping of int index to output buffer record.
465   std::vector<OutputRecord> output_buffer_map_;
466   // Required size of DPB for decoding.
467   int output_dpb_size_;
468 
469   // Number of planes (i.e. separate memory buffers) for output.
470   size_t output_planes_count_;
471 
472   // Pictures that are ready but not sent to PictureReady yet.
473   std::queue<PictureRecord> pending_picture_ready_;
474 
475   // The number of pictures that are sent to PictureReady and will be cleared.
476   int picture_clearing_count_;
477 
478   // Output picture coded size.
479   Size coded_size_;
480 
481   // Output picture visible size.
482   Size visible_size_;
483 
484   //
485   // The device polling thread handles notifications of V4L2 device changes.
486   //
487 
488   // The thread.
489   base::Thread device_poll_thread_;
490 
491   //
492   // Other state, held by the child (main) thread.
493   //
494 
495   // The codec we'll be decoding for.
496   VideoCodecProfile video_profile_;
497   // Chosen input format for video_profile_.
498   uint32_t input_format_fourcc_;
499   // Chosen output format.
500   uint32_t output_format_fourcc_;
501 
502   // Input format V4L2 fourccs this class supports.
503   static const uint32_t supported_input_fourccs_[];
504 
505   // The WeakPtrFactory for |weak_this_|.
506   base::WeakPtrFactory<V4L2VideoDecodeAccelerator> weak_this_factory_;
507 
508   DISALLOW_COPY_AND_ASSIGN(V4L2VideoDecodeAccelerator);
509 };
510 
511 }  // namespace media
512 
513 #endif  // MEDIA_GPU_V4L2_VIDEO_DECODE_ACCELERATOR_H_
514