Commit graph

401 commits

Author SHA1 Message Date
Hou Qi
e037391364 v4l2object: Avoid colorimetry mismatch for streams with invalid colorimetry
video-info sets gst colorimetry to default value when colorimetry in caps
is unparsable or invalid. Then v4l2object uses this gst colorimetry to do
mapping with v4l2 colorimetry. This may cause colorimetry mismatch when
check mapped gst colorimetry with that read from caps directly.

To fix this, need to correct gst colorimetry as that parsed from video-info
when check gst_v4l2_video_colorimetry_matches().

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/917>
2021-03-24 08:40:52 +08:00
Hou Qi
4c6ff9fb58 v4l2object: Add support for hdr10 stream playback
Colorimetry of hdr10 video is bt2100-pq with transfer as
GST_VIDEO_TRANSFER_SMPTE2084. So map GST_VIDEO_TRANSFER_SMPTE2084
to V4L2_XFER_FUNC_SMPTE2084 to support hdr10 stream playback.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/888>
2021-03-22 09:15:54 +08:00
Philipp Zabel
78dec1e403 v4l2object: handle GST_VIDEO_TRANSFER_BT601
V4L2 makes no difference between the BT.601 and BT.709 transfer
functions [1], but GStreamer does since 1.18 [2].

Adapt gst_v4l2_object_get_colorspace() and
gst_v4l2_object_set_format_full().

[1] https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/colorspaces-details.html#colorspace-smpte-170m-v4l2-colorspace-smpte170m
[2] https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/724

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/856>
2021-03-12 16:57:50 +00:00
Lucas Stach
1b1ad32b90 v4l2object: prefer NV12 over I420
Considering NV12 an 'odd' format is a historical artifact. This format
is now quite common, and usually preferable to I420 due to more memory
friendly access patterns.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/857>
2021-02-19 13:12:54 -05:00
Bing Song
b87db31fbe v4l2object: Need keep same transfer as input caps.
GST_VIDEO_TRANSFER_BT2020_12 and GST_VIDEO_TRANSFER_BT2020_10 will
be mapped to V4L2_XFER_FUNC_709. Need check input caps when map
V4L2_XFER_FUNC_709 back to GST_VIDEO_TRANSFER_BT2020_12 and
GST_VIDEO_TRANSFER_BT2020_10

Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/816
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/841>
2021-01-18 04:26:04 +00:00
Hou Qi
386b785e48 v4l2object: Map correct video format for RGBA
Map V4L2_PIX_FMT_RGBA32 pixel format to GST_VIDEO_FORMAT_RGBA instead of
GST_VIDEO_FORMAT_RGB video format to support RGBA.

Fixes #823

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/848>
2021-01-11 09:05:05 +08:00
Hou Qi
ff1dd307f2 v4l2object: Use active resolution during fallback colorspace probe
For legacy drivers that don't implement ENUM_FRAMESIZE, use active
resolution to probe colorspace. This can improve the accuracy of the
result when the colorspace depends on the resolution. This fixes a
wrong colorspace issue on board with vendor bsp at resolution 2560x1440.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/830>
2020-12-14 09:15:18 +08:00
Bing Song
8a0a7d932a v4l2: caps negotiate wrong as interlace feature
gst_caps_simplify() will move interlace format before normal video
format. It will cause caps negotiate prefer interlaced caps which
isn't expected. Seperate normal caps and interlaced caps and then
merge it will keep prefer progress video format.
Add ARGB/BGRA for interlaced caps.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/802

Part-of <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/813>

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/813>
2020-11-16 15:12:28 +00:00
Havard Graff
ed01e165b5 v4l2object: plug memory-leak
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/718>
2020-09-10 01:29:53 +00:00
Víctor Manuel Jáquez Leal
078560e70a v4l2: use GstV4l2Error in gst_v4l2_open()
gst_v4l2_open() is called by gst_v4l2_device_provider_probe_device(),
where the GstV4l2Object is created without an associated GstElement.

If gst_v4l2_open() fails, it raises a bus message, but without an
element, a precondition check fails on
gst_element_message_full_with_details() generating a crash if running
with fatal-warnings debug mode.

GstV4l2Error is a helper to raise error bus messages when it is
appropiated. This patch changes the direct bus messages to this
helper, and the elements will actually send the error message.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/694>
2020-08-11 01:44:17 +00:00
Nicolas Dufresne
85b9893e96 v4l2object: Only offer inactive pools and if needed
Avoid offering a pool if it's not needed or if it's still active.
This works around the fact the we only have one pool in V4L2.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/651>
2020-06-28 13:40:30 +00:00
Mathieu Duponchelle
f63299ff2f plugins: uddate gst_type_mark_as_plugin_api() calls 2020-06-06 00:42:25 +02:00
Mathieu Duponchelle
37c619f995 plugins: Use gst_type_mark_as_plugin_api() for all non-element plugin types 2020-06-03 22:44:09 -04:00
Guillaume Desmottes
d1501f0952 v4l2: add alternate interlace mode
When using this mode each frame is split in two fields, each one being
transferred using its own buffer.
This is implemented with the V4L2_FIELD_ALTERNATE field format in v4l2.

This mode is enabled using a caps filter such as
"v4l2src ! video/x-raw\(format:Interlaced\)"

Here are the main changes related to this feature:

- use the INTERLACED caps feature with this mode.

- in this mode both fields of a given frame have the same sequence/offset
so adjust the algorithm checking for lost field/frame accordingly.

- double pool's min number of buffers as each frame requires 2 buffers.

Fix #504
Co-authored-by: Zeeshan Ali <zeenix@collabora.co.uk>
2020-03-25 12:42:12 +01:00
Guillaume Desmottes
0834ef15ce v4l2: display field when setting or trying format
Ease debugging interlacing pipelines.
2020-03-25 12:14:41 +01:00
Guillaume Desmottes
8a69e26f16 v4l2: pass v4l2object to GST_V4L2_MIN_BUFFERS()
Will be used to double the number of buffers in alternate interlace
mode.
2020-03-25 12:14:41 +01:00
Guillaume Desmottes
00893baef9 v4l2: use GST_VIDEO_INFO_FIELD_HEIGHT()
Use GST_VIDEO_INFO_FIELD_HEIGHT() instead of GST_VIDEO_INFO_HEIGHT()
when we actually want the field height rather than the frame height.
So far both are equals but that won't longer be the case when
implementing alternate interlace mode.
2020-03-25 12:14:41 +01:00
Guillaume Desmottes
48a7381602 v4l2: map GST_VIDEO_FORMAT_BGR15
The GstVideoFormat to v4l2 conversion was missing for BGR15.
2020-02-05 18:22:20 +05:30
Guillaume Desmottes
0f907205de v4l2: fix crash on invalid caps
gst_v4l2_object_set_format_full() was returning FALSE without setting
an error. Caller code (gst_v4l2src_fixate()) was then derefing a
NULL pointer when trying to handle the error.
2020-02-05 18:22:20 +05:30
Nicolas Dufresne
23089e9cc3 v4l2object: Workaround bad TRY_FMT colorimetry implementation
libv4l2 reset the colorpace to 0 and does not do any request to the
driver. This yields an invalid colorspace which currently cause a
negotiation failure. This workaround by ignoring bad values during the
TRY_FMT step.
2019-11-18 18:29:48 +00:00
Guillaume Desmottes
e9c10713a3 v4l2object: update match_buffer_layout() debug messages
It's no longer used only to try importing buffers.
2019-11-05 14:54:40 +05:30
Guillaume Desmottes
91002389b9 v4l2object: try matching buffer layout from downstream
Ask v4l2 to produce buffers matching the buffer layout requested
downstream.
2019-11-05 14:54:40 +05:30
Guillaume Desmottes
31c753a3fb v4l2object: factor out gst_v4l2_object_match_buffer_layout()
No semantic change.
2019-11-05 14:52:22 +05:30
Guillaume Desmottes
a92000ebb9 v4l2object: add support for vertical padding when importing buffers
We were already supporting horizontal padding by setting bytesperline to
the buffer stride but not vertical one.

We are now updating the format height with the padded height and crop to
the actual video resolution if needed.
2019-11-02 12:47:43 +01:00
Guillaume Desmottes
07930aea73 v4l2object: fix debug message if driver rejects stride
The 'want' and 'got' strides were inversed.
2019-11-02 12:47:43 +01:00
Guillaume Desmottes
3a05ef4798 v4l2: improve logs when importing buffers
Log strides and offsets from upstream.

Also fix a typo.
2019-11-02 12:47:43 +01:00
HuQian
9dcb626e3a is a typo here? gstv4l2object.c 2019-10-12 15:26:40 +00:00
Aaron Boxer
46989dca96 documentation: fix a number of typos 2019-10-05 22:38:11 +00:00
Philipp Zabel
2b1658fca2 v4l2object: add support for ABGR, xBGR, RGBA, and RGBx formats
Map them to the new V4L2_PIX_FMT_{BGRA32,BGRX32,RGBA32,RGBX32} pixel
formats.
2019-09-25 10:44:13 +02:00
Damian Hobson-Garcia
a493bcd549 v4l2object: Orphan buffer pool on object_stop if supported
Use V4L2 buffer orphaning, on recent kernels so that
the device can be restarted immediately with
a new buffer pool during renogatiation.
2019-06-03 19:09:24 +00:00
Mathieu Duponchelle
f554369ed5 doc: remove xml from comments 2019-05-29 22:20:40 +02:00
Thibault Saunier
38c5ba90b3 doc: Fix some docstrings 2019-05-13 17:00:00 -04:00
Philipp Zabel
40db843efd v4l2object: use opRGB colorspace and xfer func defines
AdobeRGB defines have been renamed to opRGB in the kernel headers,
use the new names.
2019-04-05 16:01:55 +00:00
Mauro Carvalho Chehab
dc7bd48326 v4l2: accept Bayer as possible input/output for V4L2 codecs
A V4L2 transform codec may input/output data on Bayer format.

Add support for that.
2019-02-26 13:59:46 +00:00
Guillaume Desmottes
dab84b14dd v4l2: Avoid code duplication
The function gst_v4l2_object_add_interlace_mode() has repeating code so
it's best use a loop instead. That will make it easy and simple to add
additional interlace modes in a following patch.
2018-12-17 15:30:47 +00:00
Zeeshan Ali
40fee8eeeb v4l2: Make use of gst_video_interlace_mode_to_string()
Instead of a custom map to translate the interlace modes to strings, let's
make use of the base API provided.
2018-12-17 15:30:47 +00:00
Nicolas Dufresne
dbaca549ab v4l2object: Read driver selected interlace mode
If there was no interlace-mode field in the caps. Read back the value
selected by the driver. This way, if the driver does not support
progressive, then it will automatically negotiate the returned mode
unless this mode is not supported by GStreamer.

This method was already used for colorimetry. Just like colorimetry, the
interlace mode is not longer probed by v4l2src dues to performance
issues.

Fixes #511
2018-11-07 19:29:51 -05:00
Song Bing
1dc6881a13 v4l2videodec: Add HEVC decoder support
https://bugzilla.gnome.org/show_bug.cgi?id=771686
2018-09-13 20:48:09 -04:00
Ezequiel Garcia
944debd3db v4l2: Add FWHT codec support
The recently added vicodec (virtual codec) V4L driver
uses the Fast Walsh-Hadamard Transform for encoding
and decoding.

Add support for it.
2018-09-13 20:48:09 -04:00
Nicolas Dufresne
43c5db3c72 v4l2object: Fix indentation 2018-09-12 20:49:41 -04:00
Nicolas Dufresne
4d0f5f056e v4l2object: Protect against zero PAR num/demu
This fixes an assertion when the driver implement CROPCAP but does
not set the PAR.
2018-09-12 20:49:41 -04:00
Nicolas Dufresne
66351255f7 v4l2object: Only offer MMAP/DMABUF pool
The propose allocation was offering a pool even in DMABUF_IMPORT or
USERPTR mode. These pool are internal only.
2018-08-31 15:44:02 -04:00
Nicolas Dufresne
1c729be537 v4l2object: Add a method to try and import buffers
This method will check if a buffer, base on it's video meta,
can be imported. It will also try and adapt the request stride
in case this is the only that miss-match.

https://bugzilla.gnome.org/show_bug.cgi?id=583890
2018-08-27 13:41:30 -04:00
Nicolas Dufresne
24368c1162 v4l2object: Only allow DMABuf export for STREAMING device
DMABuf exportation requires mmap, which requires STREAMING
capabilities.

https://bugzilla.gnome.org/show_bug.cgi?id=583890
2018-08-27 13:41:30 -04:00
Philipp Zabel
00143ca554 v4l2object: complete colorspace info in debug log
The desired colorimetry is logged with all parameters (colorpsace,
range, matrix, and transfer function), but of the values actually
set by the driver, only colorspace is logged. Complete the debug
log message to display all colorimetry parameters:

  Desired colorspace is 8:1:1:1
  Got format of 640x480, format YU12, nb planes 1, colorspace 8

->

  Desired colorspace is 8:1:1:1
  Got format of 640x480, format YU12, nb planes 1, colorspace 8:0:0:0

https://bugzilla.gnome.org/show_bug.cgi?id=796940
2018-08-21 12:01:41 -04:00
Philipp Zabel
91dd9c1929 v4l2object: fix typo in comment
https://bugzilla.gnome.org/show_bug.cgi?id=796940
2018-08-21 12:01:41 -04:00
Philipp Zabel
02d3f9748b v4l2object: improve colorspace handling for JPEG sources
gstjpegdec sets 1:4:0:0 colorimetry (full range BT.601 YCbCr encoding
with unknown primaries and unknown transfer function). This currently
gets translated to bt601 or bt709 depending on resolution.
Both cases result in a negotiation failure:

    ERROR: from element /GstPipeline:pipeline0/v4l2video0convert:v4l2video0convert0: Device '/dev/video0' does not support 1:4:0:0 colorimetry

Improve the guessing game by selecting JPEG colorimetry (JPEG colorspace
with sRGB transfer function) under these specific conditions, and loosen
the matching so that 1:4:0:0 input gets accepted if the device is
actually configured to 1:4:7:1 (V4L2_PIX_FMT_JPEG default).

https://bugzilla.gnome.org/show_bug.cgi?id=796940
2018-08-21 12:01:41 -04:00
Philipp Zabel
9595fd08e3 v4l2object: stop V4L2 from zeroing extended colorimetry for non-mplane
Setting the priv field to a magic value stops V4L2 core from zeroing
the extended colorimetry fields quantization, ycbcr_enc, and xfer_func
for non-mplane queues.

https://bugzilla.gnome.org/show_bug.cgi?id=796940
2018-08-21 12:01:41 -04:00
Zeeshan Ali
af27ecae3f v4l2: Remove a trailing whitespace
Otherwise, the latest gst-indent check doesn't pass.
2018-08-19 15:39:16 +02:00
Iñigo Huguet
3f360e8f15 v4l2src: fix first input used is always used next times
The input from an v4l2 device that was used the first time was
remembered for next times, and set again always the pipeline is
set to READY state. This was making that users wasn't able to
select a different input without having to create a new pipeline.

This patch makes that v4l2src element forget previous used input
when going to NULL state, so it will check again for the current
selected input when going again to READY state. Users can change
to NULL state, select a new input with a VIDIOC_S_INPUT ioctl
and change to PLAYING again.

https://bugzilla.gnome.org/show_bug.cgi?id=796908
2018-08-02 08:00:44 -04:00