Commit graph

809 commits

Author SHA1 Message Date
Nicolas Dufresne
d7876e5597 v4l2bufferpool: Fix copy threshold implementation
We cannot allocate new buffer in acquire, otherwise the base class
is not aware and get confused. Instead, copy in _process(). This leads
to crash on finalize.

Fixes regression, see https://bugzilla.gnome.org/show_bug.cgi?id=732912
2014-07-11 13:45:30 -04:00
Nicolas Dufresne
0ac0cbcc0e v4l2allocator: Use qdata instead of parenting to DmabufMemory
Parenting V4l2Memory to DmabufMemory was in conflict with recent
optimization in DmabufMemory to avoid dup(), and didn't work with
memory sharing. Instead, use a qdata and it's destroy notify.

https://bugzilla.gnome.org/show_bug.cgi?id=730441
2014-07-11 09:49:27 +02:00
Nicolas Dufresne
d03bcba3db v4l2bufferpool: Workaround elements not requesting any buffers
This is a workaround for element that don't request buffers when
they should.

https://bugzilla.gnome.org/show_bug.cgi?id=732288
2014-07-10 18:22:10 -04:00
Nicolas Dufresne
12a3bdbd09 v4l2src: Ensure internal pool activation
Before we would hit an assertion "'gst_buffer_pool_is_active (bpool)' failed"
if the internal pool was not used to push buffer downstrea, hence not
given to the baseclass.

https://bugzilla.gnome.org/show_bug.cgi?id=732912
2014-07-09 15:26:12 -04:00
Nicolas Dufresne
0126e75676 v4l2object: Pool might be NULL in decide allocation
If special stride is needed and downstream don't support VideoMeta,
pool might be NULL in order to let the baseclass create a generic
pool­. This would lead to assertion with on Exynos with:

gst-launch-1.0 -v filesrc location=mov ! qtdemux ! h264parse ! \
                    v4l2video8dec ! fakesink

https://bugzilla.gnome.org/show_bug.cgi?id=732707
2014-07-03 15:30:01 -04:00
Nicolas Dufresne
3f15e67923 v4l2bufferpool: Handle FD error during poll
This will ensure we fail earlier if something unrecoverable
happens.
2014-07-03 15:29:54 -04:00
Nicolas Dufresne
652ed3bceb v4l2bufferpool: Wait before polling if queue is empty
In kernel before 3.17, polling during queue underrun would unblock right
away and trigger POLLERR. As we are not handling POLLERR, we would endup
blocking in DQBUF call, which won't be unblocked correctly when going
to NULL state. A deadlock at start caused by locking error in libv4l2 was
also seen before this patch. Instead, we wait until the queue is no longer
empty before polling.

https://bugzilla.gnome.org/show_bug.cgi?id=731015
2014-07-03 15:28:45 -04:00
Tim-Philipp Müller
a016f19de8 v4l2: fix probing and enumeration of stepwise frame sizes
The code enumerating STEPWISE framesizes would start from
(min_w, min_h) and then add (step_w, step_h) to get the
next framesize. However, it should really allow any width
from min_w to max_w with step_w and same for heights.
Secondly, we would add and probe each individual stepped
frame size to the caps as separate structure, which would
lead to hundreds if not thousands of structs ending up in
the probed caps. Use integer ranges with steps instead.

This was particularly noticable with the Raspberry Pi Cam.

https://bugzilla.gnome.org/show_bug.cgi?id=724521
https://bugzilla.gnome.org/show_bug.cgi?id=732458
https://bugzilla.gnome.org/show_bug.cgi?id=726521
2014-07-01 20:23:58 +01:00
Daniel Drake
f9eb4dd206 v4l2object: drop workaround for misbehaving TRY_FMT
This workaround from 2011 was causing 25 S_FMT ioctls to be sent
to my UVC webcam from under gst_v4l2_object_get_caps as it probes
all the formats. In total, this adds up to about 5 seconds of
execution time, or a 10 second delay while starting up cheese.

These ioctls come from a workaround from 2011 where TRY_FMT might
make changes to hardware settings, so S_FMT was used to restore
the original config:
https://bugzilla.gnome.org/show_bug.cgi?id=649067

The driver bug is now assumed fixed. Remove the workaround to fix the
long startup delay.

https://bugzilla.gnome.org/show_bug.cgi?id=732326
2014-07-01 12:36:27 -04:00
Tim-Philipp Müller
f79de9a420 v4l2: fix compiler warnings when compiling with -DG_DISABLE_ASSERT
Compiler complains about uninitialised variables in the impossible
'default' code path in device provider source/sink switch-case.
2014-06-29 17:06:11 +01:00
Olivier Crête
a9c385686a Rename GstDeviceMonitor to GstDeviceProvider 2014-06-26 14:57:36 -04:00
Tim-Philipp Müller
dd165a4b1a pulse, v4l2: update for device "klass" -> "device-class" rename 2014-06-21 01:32:03 +01:00
Nicolas Dufresne
0fb59dbdba v4l2bufferpool: Cleanly handle v4l2_allocator_new failure 2014-06-12 16:41:09 -04:00
Nicolas Dufresne
1648e46f86 v4l2bufferpool: Cleanup poll method and retry on EINTR/EAGAIN
https://bugzilla.gnome.org/show_bug.cgi?id=731015
2014-06-04 15:15:56 -04:00
Julien Isorce
5c07e6b45c v4l2sink: implement gstvideosink.show_frame instead of gstbasesink.render
It allows to show preroll frame. Especially it allows to update the
frame when seeking in PAUSED state.

https://bugzilla.gnome.org/show_bug.cgi?id=722303
2014-05-26 14:07:42 -04:00
Nicolas Dufresne
ea340455ae v4l2sink: Cleanup old pad alloc declaration 2014-05-26 13:43:30 -04:00
Nicolas Dufresne
b3bf4e33d0 v4l2bufferpool: Copy already queued buffer
This is required as during preroll we pass the first buffer twice, hence already
queued. It is also useful, to allow filters replaying a previous rendered buffers.
This will require 1 more buffer in sink if last-sample is enabled, since the last
sample will not be the same as the currently queued buffer.

https://bugzilla.gnome.org/show_bug.cgi?id=722303
2014-05-26 13:43:30 -04:00
Nicolas Dufresne
e2fd7e274e v4l2bufferpool: Port to bufferpool flush_start/stop method
Port the buffer pool to use the new flush_start/flush_stop virtual
methods added to GstBufferPool.

https://bugzilla.gnome.org/show_bug.cgi?id=727611
2014-05-26 13:43:30 -04:00
Nicolas Dufresne
bc002d579f v4l2bufferpool: Don't queue all the buffers before dequeueing first
For output device, we where queuing all the buffers, and then we would
dequeue one. This means we only have 1 buffer for the pipeline, no matter
the size of the queue. Instead, start dequeued when min_latency is reached.
Eventually, this the min_latency should also be affected by control
MIN_BUFFERS_FOR_OUTPUT (use by encoders).
2014-05-25 00:05:56 -04:00
Nicolas Dufresne
ffb7a78798 v4l2object: Simply read back the config to update the query
It's easy to get the min/max outdate when hacking decide allocation. In
order to avoid this, simply read back the choosen value from the config.
2014-05-25 00:05:56 -04:00
Nicolas Dufresne
66519d08b0 v4l2: Cleanup and fix calculation of latency
Calculation of num_buffers (the max latency in buffers) was
up-side-down.  If we can allcoate, then our maximum latency match
pool maximum number of buffers. Also renamed it to max latency. Finally
introduced a min_latency for clarity.
2014-05-25 00:04:44 -04:00
Nicolas Dufresne
2e89f4ecff Revert "v4l2bufferpool: Port to bufferpool flush_start/stop method"
This reverts commit 2e0fb42e86.

Conflicts:
	sys/v4l2/gstv4l2allocator.c
	sys/v4l2/gstv4l2bufferpool.c
	sys/v4l2/gstv4l2videodec.c
2014-05-24 20:00:14 -04:00
Nicolas Dufresne
ba10cb14ea v4l2object: Fix configuration of other_pool and importation case
Fix the choice of min/max, don't override the min/max with own pool selected
size, correct other_pool is_active check, start from other_pool config when
configuring the other pool and finally validate the configuration.
2014-05-24 18:56:32 -04:00
Nicolas Dufresne
4aa5d42184 v4l2object: Use proposed allocator as default 2014-05-24 18:45:30 -04:00
Nicolas Dufresne
aff64af8ad v4l2bufferpool: Fix USERPTR map flags
We need to map READ only for output and write only for capture, we where
doing the opposite. This fixing USERPTR with glimagesink

https://bugzilla.gnome.org/show_bug.cgi?id=730698
2014-05-24 18:43:28 -04:00
Nicolas Dufresne
3a7bd8d479 v4l2bufferpool: Prevent num_queued from going negative 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
57726911f8 v4l2videodec: don't stop if loop returned FLUSHING
The decodeing thread returning flushing isn't an error, we should simply
try starting the task again. If it's actually flushing, it will stop again by itself.
2014-05-24 15:38:53 -04:00
Nicolas Dufresne
3acbd9cb99 v4l2videodec: Handle early task stop 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
a65ab6378d v4l2videodec: Handle gst_pad_start_task() failure 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
1e48ad8fa8 v4l2videodec: Add trace for FLUSH_START/STOP handling 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
c9dcc63eb8 v4l2videodec: Fix use of atomic value 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
45b322c2db v4l2bufferpool: Improve debugging
No need to use obj->element, the pool now have a significant name. Also don't
warn if flushing.
2014-05-24 15:38:53 -04:00
Nicolas Dufresne
03ed348d95 v4l2videodec: Fix handle_frame error handling 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
e70173e28a v4l2bufferpool: Add a trace when _start() is called 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
2cb6b9775c v4l2allocator: Add debug assert to detect calls in the wrong state 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
1f70b21926 v4l2allocator: Reset count when stopped 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
6a07e96734 v4l2allocator: Return a GstFlowReturn instead of boolean in alloc 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
43643b8e26 v4l2object: Don't leak config structure 2014-05-24 15:38:53 -04:00
Nicolas Dufresne
2e0fb42e86 v4l2bufferpool: Port to bufferpool flush_start/stop method 2014-05-24 15:38:53 -04:00
Sebastian Dröge
32d8eb9f80 v4l2bufferpool: Explicitly cast enum "subtype" to its "supertype"
gstv4l2bufferpool.c:608:18: error: implicit conversion from enumeration type
      'enum _GstV4l2BufferPoolAcquireFlags' to different enumeration type
      'GstBufferPoolAcquireFlags' [-Werror,-Wenum-conversion]
  params.flags = GST_V4L2_POOL_ACQUIRE_FLAG_RESURECT;
               ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2014-05-19 11:26:46 +02:00
Nicolas Dufresne
7df99f7469 v4l2videodec: Handle flush while in start_streaming
We need to handle the case where a flush occure while the streaming
thread is being brought up. In this case, the flushing state of the poll
object is cleared. To solve this, we simply set the capture poll to flushing
again, this way we know the thread will exit. The decoder streamlock
is used to synchronize with handle frame.
2014-05-16 21:49:00 -04:00
Nicolas Dufresne
58716e054f v4l2allocator: Don't trace twice the same message 2014-05-16 21:48:29 -04:00
Nicolas Dufresne
077fcbcf15 v4l2: Cleanup M2M properties
M2M devices were sharing the same properties as src and sink. Most of
these made no sense. This patch reduces the number of propeties and
makes io-mode clearer by having capture-io-mode and output-io-mode. This
also accidently fixed a bug in gstv4l2transform io-mode code, where the
capture io-mode could not be set.

https://bugzilla.gnome.org/show_bug.cgi?id=729591
2014-05-15 19:06:52 -04:00
Benjamin Gaignard
0d852cf235 v4l2bufferpool: Update pool limit with hardware requiremenst
If the driver need more buffers than requested by the config,
update the pool min/max values. The minimum value for the pool
could be provided either by the driver or by the pool. This is
best effort for drivers that don't support
CID V4L2_CID_MIN_BUFFERS_FOR_CAPTURE.

https://bugzilla.gnome.org/show_bug.cgi?id=730200
2014-05-15 12:55:33 -04:00
Nicolas Dufresne
541a9670d2 v4l2videodec: Handle start_streaming error
https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:22:04 -04:00
Nicolas Dufresne
bff156bc57 v4l2videodec: Print the flow return causing the loop to leave
https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:21:59 -04:00
Nicolas Dufresne
f384047be3 v4l2videodec: Don't lock the decoder when stopping task
That src pad task may need to take the lock when being pulled
down. takeing that lock can lead to a deadlock.

https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:21:54 -04:00
Nicolas Dufresne
5f10d2b4e2 v4l2transform: Don't leak pool if activation failed
https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:21:48 -04:00
Nicolas Dufresne
a4b5811d22 v4l2: Split flush in start/stop_streaming
This allow calling start streaming later for capture device. Currently it breaks
in dmabuf-import because downstream is holding a buffer that will only be
released after stream-start.

https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:21:44 -04:00
Nicolas Dufresne
c1792de95e v4l2transform: Flush buffer pools on flush stop
https://bugzilla.gnome.org/show_bug.cgi?id=730207
2014-05-15 12:21:40 -04:00