Nicolas Dufresne
0f5fc9646e
v4l2codecs: vp8: Allow baseclass from skipping frames
...
In preparation for !1670 , this will allow the base class from skipping frames
that should not be displayed. Previously it would complain about unordered
decoding taking place in the driver.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696 >
2020-10-15 13:15:02 -04:00
Nicolas Dufresne
a3e6d9fc24
v4l2codecs: decoder: Unmark previously pending request
...
requests are executed in order, so while dequeuing sink buffers for previous
request, also mark these request as no longer pending. This will allow reusing
the request later.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696 >
2020-10-15 13:15:02 -04:00
Nicolas Dufresne
2e3bc60422
v4l2codecs: decoder: Properly remove pending requests
...
Pass the pointer instead of NULL in order to find and remove properly any
pending request from the queue. This coding error was leading to use after
free in error and early exit cases.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696 >
2020-10-15 13:14:57 -04:00
Nicolas Dufresne
20785e775e
v4l2slh264dec: Minor cleanup
...
Move few variables in their respective scope.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1563 >
2020-09-10 15:21:57 +00:00
Nicolas Dufresne
cc8e1ca2ac
v4l2slh264dec: Fix B-Frame weight table
...
We where not setting the luma l1 weight table.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1563 >
2020-09-10 15:21:57 +00:00
Seungha Yang
deaa29bd96
codecs: vp8decoder: Sync up with h264decoder implementation
...
Pass GstVideoCodecFrame with GstVp8Picture to new_picture() and
output_picture() methods for subclass to be able to reference
it directly.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1458 >
2020-07-23 15:48:05 -04:00
Seungha Yang
c78fe6bfb0
v4l2codecs: vp8dec: Remove white space
...
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1458 >
2020-07-23 18:57:02 +00:00
Seungha Yang
87b150c42a
v4l2codecs: h264dec: Remove outdated comment
...
... and unnecessary user data clear on GstVideoCodecFrame
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1457 >
2020-07-23 18:07:58 +09:00
Seungha Yang
96b9000289
v4l2codecs: h264dec: Fix leak on decoding failure
...
Given GstVideoCodecFrame and GstH264Picture should be cleared,
and the return must be GST_FLOW_ERROR, not boolean value.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1457 >
2020-07-23 18:07:11 +09:00
Nicolas Dufresne
bb9fbf0626
v4l2codecs: h264dec: Use the new picture lookup
...
This will avoid having to create a reference chain from CodecFrame
to GstH264Picture to GstV4l2Request.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449 >
2020-07-21 17:18:42 +09:00
Seungha Yang
e921a07715
codecs: h264decoder: Pass GstVideoCodecFrame to output_picture()
...
All subclasses are retrieving list to get target output frame, which
can be done by baseclass. And pass the ownership of the GstH264Picture
to subclass so that subclass can clear implementation dependent resources
before finishing the frame.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449 >
2020-07-21 17:18:42 +09:00
Seungha Yang
7a024a740f
codecs: h264decoder: Don't attach extra ref of GstH264Picture to GstVideoCodecFrame
...
The lifecycle of GstH264Picture is being managed by our DPB
implementation. If it's still required, subclass can do that
by itself in the new_picture() method.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449 >
2020-07-21 17:18:42 +09:00
Nicolas Dufresne
7b3c101ced
v4l2codecs: Enable 32x32 tiled NV12 support
...
This is used by Cedrus driver to support Allwinner VPU, also known as the
sunxi platforms.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1437 >
2020-07-15 13:24:13 +00:00
Nicolas Dufresne
1bef43f9d4
v4l2decoder: Track pending request
...
With the asynchronous slice decoding, we only queue up to 2 slices
per frames. That side effect is that now we are dequeuing bitstream
buffers in both decoding and presentation order. This would lead to
a bitstream buffer from a previous frame being dequeued instead of
the expected last slice buffer and lead to us trying to queue an
already queued bitstream buffer.
We now fix this by tracking pending requests. As request are executed
in decoding order, we marking a request done, we can effectively
dequeue bitstream buffer from all previous request, as they have been
executed already.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
a88e63dd2f
v4l2decoder: Improve debug tracing
...
Add some missing traces and move per-slice operation to TRACE level to
reduce the noise level.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
d5a205cff4
v4l2decoder: Convert request pool to GstQueueArray
...
The decoder is not being access from multiple threads, instead it is
always protected by the streaming lock. For this reason, a
GstAtomicQueue for the request pool is overkill and may even introduce
unneeded overhead. Use a GstQueueArray in replacement, the
GstQueueArray is a good fit since the number of item is predictable and
unlikely to vary at run-time.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
a2eb1b57ff
v4l2slh264dec: Wait on previous pending request in slice mode
...
In slice mode, we'll do one request per slice. In order to recycle
bitstream buffer, and not run-out, wait for the last pending
request to complete and mark it done.
We only wait after having queued the current slice in order to reduce
that potential driver starvation and maintain performance (using dual
buffering).
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
b20c6fe6c4
v4l2slh264dec: Renew bitstream buffer after submitting slice
...
Submitting a slice actually clears the bitstream buffer. Ensure we
have a newly allocated bitstream buffer for the next slice.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
bc1a0323a9
v4l2slh264dec: Factor out bitstream allocation
...
No functional changes.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
779f331bd4
v4l2slh264dec: Add a helper to ensure output buffer
...
In preparation of multi-slice decoding, we will decode multiple
slices into the same buffer. This will ensure we have a buffer to
decode to, queued into the driver.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
d65f7de650
v4l2slh264dec: Factor out request wait
...
This will be reused to wait for previous slices to be complete
when dealing with following slices (in slice decoding mode).
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
176a860169
v4l2slh264dec: Remove double return in submit_bitstream()
...
This is code cleanup, no functional changes.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
1f48e60bde
v4l2slh264dec: Fix typo in debug trace
...
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395 >
2020-07-02 12:21:51 -04:00
Nicolas Dufresne
483539f45c
v4l2slh264dec: Fix reading mode and start code type
...
These two controls are not pointer based, so we don't need to pass any size or
pointer and need to copy the values afterward. This fixes H264 decoding
regression with Hantro and RKVDEC drivers.
Fixes 037730a787
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1330 >
2020-06-09 10:52:44 -04:00
Nicolas Dufresne
d16367f046
v4l2codecs: h264: Add missing break
...
There was a missing break for the 4:4:4 case which would break the sizeimage
calculation. We don't currently have hardware that supports 4:4:4, so this
code wasn't tested. This was detected by Coverity.
CID 1463592 1463591
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1283 >
2020-05-21 20:12:07 +00:00
Nicolas Dufresne
2160239548
v4l2slh264dec: Request large enough bitstream buffer
...
The Cedrus driver would otherwise choose 1KB buffer, which is too small.
This follows what some drivers do, which is simply to use the size a
packed raw image would have. Specifications do not really guaranty any minimum
compression ratio.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268 >
2020-05-19 17:51:11 +00:00
Nicolas Dufresne
037730a787
v4l2slh264dec: Add slice based decoder support
...
This adds support for slice based decoder like the Allwinner/Cedrus driver. In
order to keep things efficient, we hold the sink buffer until we reach the end
of the picture. Note that as we don't know which one is last, we lazy queue the
slices. This effectively introduces one slice latency.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268 >
2020-05-19 17:51:11 +00:00
Nicolas Dufresne
661f0c161e
v4l2codecdec: Fix error handling
...
If none of the format the HW produce is supported, the fiter will be NULL,
which would lead to assertion when trying to release it.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268 >
2020-05-19 17:51:11 +00:00
Nicolas Dufresne
26264163de
v4l2decoder: Add legacy non-multiplanar support
...
The Cedrus driver uses the lagacy buffer type (non-mplane). This automatically
detect and use the right v4l2_buf_type. This also affect code using
v4l2_buffer and v4l2_format structures.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268 >
2020-05-19 17:51:11 +00:00
Nicolas Dufresne
14b0b68354
v4l2codecs: Update kernel headers
...
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268 >
2020-05-19 17:51:11 +00:00
Víctor Manuel Jáquez Leal
d2aae6bb96
codecs: h264decoder: ref pic lists as decode_slice parameters
...
Pass reference picture lists to decode_slice() vmethods
Change gstv4l2codech264dec and gstnvh264dec accordingly.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238 >
2020-05-19 16:57:09 +00:00
Ting-Wei Lan
d10e2381c7
v4l2codecs: Fix compilation error on FreeBSD
...
This commit does the following things to fix compilation on FreeBSD:
1. Add required typedefs to linux/types-compat.h.
2. Remove unnecessary include linux/ioctl.h and replace linux/types.h
with linux/types-compat.h. Both files do not exist on FreeBSD.
3. Check the header including makedev macro. FreeBSD does not have
sys/sysmacros.h, and including it unconditionally causes error.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1259 >
2020-05-11 15:17:31 +00:00
Nicolas Dufresne
5ece17ecbd
v4l2slvp8dec: Flip the meaning of segment_feature_mode
...
In section 9.3.4 a), segment_feature_mode have 0 for absolute and 1 for delta,
while in 19.2, it says the opposite. But the reference code, which usually
rules over the text state that 1 means absolute:
if (hdr->update_data)
{
hdr->abs = bool_get_bit(bool);
And uses it with that meaning to decide weither to override the existing value
or just add the detla. This fixes multiple decoding issues.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245 >
2020-05-05 17:57:08 +00:00
Nicolas Dufresne
11c62eb015
v4l2slvp8dec: Copy header version
...
This field was not copied.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245 >
2020-05-05 17:57:08 +00:00
Nicolas Dufresne
8c56822936
v4l2slvp8dec: Add debugging for reference frames
...
This simply trace the frame number of the references used for decoding.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245 >
2020-05-05 17:57:08 +00:00
Nicolas Dufresne
a449815f95
v4l2slvp8dec: Ensure width/height is always set
...
Our parser strictly read the bitstream. As it's known from DXVA that always
having a valid width/height might be needed, use the cached width/height
instead of the value from the parser. This didn't impact Hantro driver.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245 >
2020-05-05 17:57:08 +00:00
Nicolas Dufresne
ffd74fb5ec
v4l2slvp8dec: Fix debug category name
...
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245 >
2020-05-05 17:57:08 +00:00
Nicolas Dufresne
bf9f82c8c3
v4l2codecs: Factor out plugin registration
...
This introduce a common place for generic functions and factor out the plugin
registration code. This code is nearly identical between implementation.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216 >
2020-04-28 22:53:11 +00:00
Nicolas Dufresne
de2cccaa47
v4l2decoder: Relax width/height return value check
...
The driver adjust the width/height to coded size. This was not an issue for
H264, as the coded size is in the bitstream, but is an issue with VP8.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216 >
2020-04-28 22:53:11 +00:00
Nicolas Dufresne
72c0b3e5ae
v4l2codecs: Add VP8 decoder
...
This is derived from the H264 decoder, some boiler plate will be factored out
in the following commits.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216 >
2020-04-28 22:53:11 +00:00
Seungha Yang
ac850fd25d
v4l2slh264dec: Support avc and avc3 formats
...
h264decoder baseclass provides parsed sps/pps (from codec data) for
subclass. Also, since current implementation is putting start code prefix
manually, the format of stream should not be matter for subclass.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1214 >
2020-04-23 23:38:03 +00:00
Víctor Manuel Jáquez Leal
e96435dfea
v4l2codecs: allocator: use gst_clear_object
...
So tracer can do its job.
2020-04-20 12:23:32 +00:00
Víctor Manuel Jáquez Leal
691fdb85c0
v4l2codecs: fix v4l2codecdevice get type
...
Currently the GType of v4l2codecdevice is hardcoded to zero, but it
rather should be delivered by the GType system.
2020-04-10 21:05:19 +02:00
Nicolas Dufresne
8f0ceba251
v4l2codecs: Fix FD leak during device enumeration
...
This was revealed by Coverity.
CID 1461248
2020-04-08 20:25:44 +00:00
Nicolas Dufresne
f5da12bcf5
v4l2decoder: Fix file descriptor leak
...
A copy paste error was leading to file descriptor leak. This was detected by
Coverity.
CID 1461285
2020-04-07 17:10:08 -04:00
Nicolas Dufresne
4cb871eb53
v4l2codecs: Only build this plugin on Linux
...
This is not useful on any other OSs, it will also avoid potential build
failure as this code uses Linux specific calls.
2020-03-31 09:34:05 -04:00
Nicolas Dufresne
7254a18f0f
v4l2codecs: Add plugin dependency
...
This ensure that the registry cache get updated when a meaningful change is
made in /dev for files named media*.
2020-03-31 09:34:05 -04:00
Nicolas Dufresne
e70993bf43
v4l2codecs: Wait for buffers to come back
...
This code add required mechanism to try and allocate (not implemented yet)
otherwise wait for more buffers. This also comes with mechanism to terminate
the wait on flush or PAUSED_TO_READY transitions.
2020-03-31 09:34:05 -04:00
Nicolas Dufresne
09a9ffcda6
v4l2codecs: Implement flushing sequence
...
This simply consit of cycling through STREAMOFF/STREAMON with stateless
decoders.
2020-03-31 09:34:05 -04:00
Nicolas Dufresne
f69283819a
v4l2codecs: allocator: Add method to wait for more buffers
...
This add function to wait for buffers to get back into the pool along with a
set_flushing() method to allow unblocking this wait.
2020-03-31 09:34:05 -04:00