Commit graph

3655 commits

Author SHA1 Message Date
He Junyan
617dba3869 plugins: utils: rename build_template_caps_by_codec.
Rename the function build_template_caps_by_codec() to the name of
build_template_raw_caps_by_codec(). It can be used to collect all
raw video formats for encode's sink and decode's src.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/354>
2020-07-23 20:27:00 +02:00
Víctor Manuel Jáquez Leal
e962069dbe vaapidecode: merge common profiles before setting size range
The synthetic profiles, such as H264 baseline, H265 intra, etc. are
added at the end of processing all available VA profiles. This
generated an non-optimal caps for negotiation, since the synthetic
profiles don't have frame size ranges.

This patch adds those possible synthetic profiles when the associated
profile is processed, with its frame size ranges.

Now allowed sink caps are simpler.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/363>
2020-07-23 19:29:19 +02:00
He Junyan
2da3314534 plugin: util: Add the missing DMA buffer input in template caps.
We pass the wrong parameter to gst_vaapi_build_caps_from_formats()
and lose the DMA feature in caps.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/362>
2020-07-21 22:07:49 +08:00
He Junyan
f82850c6d3 libs: decoder: H265: Add MAIN_12 profile supporting.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/359>
2020-07-20 16:26:32 +00:00
He Junyan
7d3a19bace video-format: Add P012_LE format.
It can be used as HEVC YUV_4:2:0 12bits stream's decoder output, and
also can be used as the input format for encoding HEVC YUV_4:2:0 12bits
stream.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/359>
2020-07-20 16:26:32 +00:00
He Junyan
26afaab523 plugin: decode: correct ensure_allowed_sinkpad_caps's caps.
The decode allowed caps returned by ensure_allowed_sinkpad_caps()
contains all profiles of the whole VAAPI, like:
  image/jpeg, width=(int)[ 0, 1638 4 ], height=(int)[ 0, 16384 ];
  video/mpeg, mpegversion=(int)2, profile=(string){ simple, main },
  width=(int)[ 0, 2048 ], height=(int)[ 0, 2048 ]; video/x-h264,
  profile=(string){ main, high, constrained-baseline }, width=(int)[ 0,
  4096 ], height=(int)[ 0, 4096 ]; video/x-h264, profile=(string){
  constrained-high, progressive-high, baseline }; video/x-h265,
  profile=(string){ main, main-intra }, width=(int)[ 0, 8192 ],
  height=(int)[ 0, 8192 ]; video/x-vp8, width=(int)[ 0, 4096 ],
  height=(int)[ 0, 4096 ]; video/x-wmv, wmvversion=(int)3,
  format=(string)WVC1, profile=(string)advanced, width=(int)[ 0, 3840 ],
  height=(int)[ 0, 3840 ]; video/x-wmv, wmvversion=(int)3,
  profile=(string){ simple, main }, width=(int)[ 0, 3840 ],
  height=(int)[ 0, 3840 ]

Which is verbose and may have latent problems. It should only contains
the profiles belong to its codec type. For example, h265 should only
return:
  video/x-h265, profile=(string){ main, main-intra },
  width=(int)[ 0, 8192 ], height=(int)[ 0, 8192 ]

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/361>
2020-07-17 12:09:32 +08:00
Víctor Manuel Jáquez Leal
f1c44411f3 vaapidecodebin: don't force NV12 since P010_10LE is now possible
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/360>
2020-07-13 11:23:36 +02:00
He Junyan
b1832223ff libs: profile: The VP9 profiles' name should be just "0,1,2,3"
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/357>
2020-07-12 20:34:31 +08:00
Víctor Manuel Jáquez Leal
2a93455137 vaapidecode: Remove NO_SURFACE error handling
Since surfaces are not bounded to decoding context it makes no sense
to keep the surface semaphore. This patch removes the handling of
this error.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/353>
2020-07-09 18:13:48 +02:00
Víctor Manuel Jáquez Leal
a4c4314be6 Revert "vaapidecode: drop non-keyframe in reverse playback"
Since the number of surfaces are not bounded to decoder context,
this hack is no longer needed.

This reverts commit 19c0c8a973.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/353>
2020-07-09 16:06:23 +00:00
He Junyan
ac3e8c7c40 libs: decoder: context: remove surfaces binding from context.
The vaCreateContext do not need to specify the surfaces for the
context creation now. So we do not need to bind any surface to the
context anymore. Surfaces should be the resource belong to display
and just be used in encoder/decoder context.

The previous manner has big limitation for decoder. The context's
surface number is decided by dpb size. All the surfaces in dpb will
be attached to a gstbuffer and be pushed to down stream, and the
decoder need to wait down stream free the surface and go on if not
enough surface available. For more and more use cases, this causes
deadlock. For example,

gst-launch-1.0 filesrc location=a.h264 ! h264parse ! vaapih264dec
! x264enc ! filesink location=./output.h264

will cause deadlock and make the whole pipeline hang.
the x264enc encoder need to cache more than dpb size surfaces.

The best solution is seperating the surfaces number and the dpb size.
dpb and dpb size shoule be virtual concepts maintained by the decoder.
And let the surfaces_pool in context maintain the re-use of all surfaces.

For encoder, the situation is better, all the surfaces are just used
as reference frame and no need to be pushed to down stream. We can
just reserve and set the capacity of the surfaces_pool to meet the
request.

Fix: #147
Fix: #88

Co-Author: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/353>
2020-07-09 16:06:23 +00:00
Tim-Philipp Müller
60c183331a meson: set release date from .doap file for releases
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/355>
2020-07-08 17:50:51 +01:00
Víctor Manuel Jáquez Leal
d8f0e1b01f plugins: use VA allocator by default on raw caps
Instead of using dmabuf allocator in source pad, when raw video caps
are negotiated, it uses VA allocator as before, since it is stable
in more use cases, for example transcoding, and more backend drivers.

Dmabuf allocator is only used when dmabuf caps feature is negotiated.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/352>
2020-07-08 11:17:38 +00:00
Víctor Manuel Jáquez Leal
13d090b566 vaapisink: rank it as secondary
iHD doesn't provide a full implemention for rendering surfaces and
i965 has problems in wayland. And I suspect this path is followed
by other driver implementations.

This patch demotes the rank of vaapisink to secondary, so it will
not be autoplugged avoiding bad experience of users.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/336>
2020-07-08 10:48:40 +00:00
Víctor Manuel Jáquez Leal
b387081a4d libs: decoder: h264, h265: in context at least 16 reference surfaces
Registering only stream's DBP size number of surfaces for decoding VA
surfaces brings issues for certain streams. This change register all
possible number of reference surfaces in a stream, which is 16.

Fixes: #94
2020-07-07 17:47:23 +02:00
He Junyan
aa7370943d plugins: encode: h265: Add profile,level,tier to output caps.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/350>
2020-07-05 14:00:39 +00:00
He Junyan
0932a450d3 libs: encoder: h265: init tier to GST_VAAPI_TIER_H265_UNKNOWN.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/350>
2020-07-05 14:00:39 +00:00
He Junyan
70800a8319 libs: encoder: h265: fix a bug to get get_profile_tier_level.
0 is a valid value for h265 tier.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/350>
2020-07-05 14:00:39 +00:00
He Junyan
abea5e81c8 libs: encoder: h265: no need to check the high compression tune.
The h265 encoder just support tune mode:
  (0): none             - None
  (3): low-power        - Low power mode
So, no need to check and set the high compression parameters.

And by the way, the current ensure_tuning_high_compression manner
of choosing the hightest profile idc as the best compression profile
is not correct. Unlike h264, in h265 the higher profile idc number
does not mean it has more compression tools, and so it has better
compression performance. It may even be un-compatible with the lower
profile idc. For example, the SCREEN_CONTENT_CODING profile with idc
9 is not compatible with 3D_MAIN profile with idc 8.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/348>
2020-07-03 15:28:40 +00:00
Tim-Philipp Müller
19903e1afc Back to development 2020-07-03 02:04:14 +01:00
Tim-Philipp Müller
f6771f9bf3 Release 1.17.2 2020-07-03 00:36:40 +01:00
Thibault Saunier
1c3facd215 docs: Mark parent classes as plugin API 2020-06-23 10:20:46 -04:00
Mathieu Duponchelle
d914f23268 meson: mark plugins cache target as always stale 2020-06-23 00:07:57 +02:00
Thibault Saunier
eb7152bdef doc: Stop documenting properties from parents 2020-06-22 11:07:09 -04:00
Tim-Philipp Müller
74ac6ed91f Back to development 2020-06-20 00:28:35 +01:00
Tim-Philipp Müller
41bf465196 Release 1.17.1 2020-06-19 19:27:13 +01:00
Tim-Philipp Müller
bf7d4bda49 Update plugin docs and add more plugins
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/344>
2020-06-19 15:21:56 +01:00
Michael Olbrich
4b2f7a188d libs: wayland: display: only handle the first output
Right now, all outputs are handled. The means that the registry object for
all but the last are leaked. As a result the sizes are not used correctly.

With two outputs, at first the mode and physical size of the second output
are used. If the first output changes the mode, then the physical size of
the second output is used in combination with the resolution of the first
output. The resulting pixel aspect ratio is incorrect.

There seems to be no way to determine on which output the window is shown,
so just use the first one to get consistent results.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/341>
2020-06-17 14:56:18 +00:00
He Junyan
72c4a161c0 plugins: pluginbase: Do not destroy display when _close()
When the element's state changes to NULL, it can still receive
queries, such as the image formats. The display is needed in such
queries but not well protected for MT safe.
For example, ensure_allowed_raw_caps() may still use the display
while it is disposed by gst_vaapi_plugin_base_close() because of
the state change.

We can keep the display until the element is destroyed. When the
state changes to NULL, and then changes to PAUSED again, the display
can be correctly set(if type changes), or leave untouched.

Fix: #260
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/343>
2020-06-11 18:32:58 +08:00
Víctor Manuel Jáquez Leal
1c5f32b5cd libs: context: use correct printing modifier
GstVaapiID is an alias of gsize, thus its modifier is platform
dependant.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/340>
2020-06-09 21:25:40 +02:00
Mathieu Duponchelle
e6e377c720 plugins: uddate gst_type_mark_as_plugin_api() calls 2020-06-06 00:42:46 +02:00
He Junyan
854fdcb695 libs: encoder: h265: Enable tile in VA command.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:28:20 +08:00
He Junyan
cefd1a665f libs: encoder: h265: Add ensure_tile to calculate tiles.
We need consider tiles and slices together, separate tiles uniformly
and then assign slices uniformly to each tiles.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:28:12 +08:00
He Junyan
32db615685 libs: display: add a quirk for iHD driver tile encoding.
The iHD driver has a requirement that one slice can not span tiles
when tile is enabled, which is not required by hevc spec.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:28:06 +08:00
He Junyan
dbed28d419 libs: encoder: h265: Add tile info to bitstream.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:28:01 +08:00
He Junyan
71db357284 libs: encoder: h265: promote level if tile is enabled.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:27:42 +08:00
He Junyan
812c9fdea7 libs: encoder: h265: Add num-tile-cols/rows properties.
These properties are used for support of tile encoding. We just
support uniform mode of tile encoding, that is, separating picture
equally by (num-tile-cols X num-tile-rows).
According to HEVC spec A1, the max number of tiles in column is 20
and in rows is 22, so add two constant definitions.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:27:36 +08:00
He Junyan
bc1c97c755 libs: encoder: h265: extract slice creation from add_slice_headers
extract slice creation details from add_slice_headers, and let the
add_slice_headers just focuses on calculating slice start address
and CTU number.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:27:26 +08:00
He Junyan
6c76e81cb6 libs: encoder: Add a helper function to check the tile support.
Encoding by tiles separation now is a very common feature for all
relative new codecs, such as HEVC, AV1, and VP9. Just make this
check as a common helper function of the encoder base class.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/294>
2020-06-05 19:27:11 +08:00
He Junyan
85bc355019 libs: decoder: H265: Add SCC_MAIN_444_10 profile support.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
2020-06-05 09:51:19 +00:00
He Junyan
5f92699a4b libs: decoder: update reference list for SCC.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
2020-06-05 09:51:19 +00:00
He Junyan
c956d91807 libs: decoder: H265: Fill picture and slice SCC parameters.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
2020-06-05 09:51:19 +00:00
He Junyan
1d9b2cab42 libs: util: H265: recognize the SCC profiles.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
2020-06-05 09:51:19 +00:00
He Junyan
9067d902e2 libs: profile: Add screen extended main/main10/main444 define.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
2020-06-05 09:51:19 +00:00
He Junyan
8486f82d98 libs: encoder: h265: Add support for MAIN 4:2:2 10 profile.
Using YUY2 as the input of the encoder can generate main 4:2:2 bit
streams and using Y210 as the input of the encoder can generate main
4:2:2 10 bit streams.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/334>
2020-06-05 08:42:35 +00:00
He Junyan
5c67bdaf63 libs: encoder: h265: Use correct index for SubWidthC and SubHeightC.
We need to use the chroma_format_idc as the index for getting the
SubWidthC and SubHeightC values as the spec 6.1(table 6-1) defines.
The wrong SubWidthC or SubHeightC make us calculate a wrong right
or bottom offset for crop size and generate garbage in output.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/334>
2020-06-05 08:42:35 +00:00
He Junyan
a2063083a5 libs: encoder: h265: Fix chrome idc for 444 10 bits
GST_VAAPI_CHROMA_TYPE_YUV444_10BPP should also set chroma_format_idc
to 3 as GST_VAAPI_CHROMA_TYPE_YUV444 does.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/334>
2020-06-05 08:42:35 +00:00
Thibault Saunier
45c2f82746 doc: Require hotdoc >= 0.11.0 2020-06-03 18:50:10 -04:00
Thibault Saunier
8e400a5634 doc: Fix wrong link to GstVideoDirectionMethod 2020-06-03 18:50:10 -04:00
Thibault Saunier
41fee777a6 docs: Update plugin cache with the new format
And fix the default URL which should not be inside quotes.
2020-06-03 17:38:10 -04:00