Commit graph

849 commits

Author SHA1 Message Date
Guillaume Desmottes
0ee8213ab2 omxvideoenc: adjust stride and slice height from input
Use the stride and slice height information from the first buffer meta
data to adjust the settings of the input port.
This will ensure that the OMX input buffers match the GStreamer ones
and so will save us from having to copy line-by-line each one.

This is also the first step to allow the OMX encoder to receive dmabuf.

Tested on rpi and zynqultrascaleplus.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
07e80c9425 omxvideoenc: delay buffer configuration until component is enabled
No significant change for now. Just delay the input port configuration
of the buffer size related fields (stride, slice height, buffer size)
until the component is activated.
This will allow us to use the actual stride/height of the first input
and so avoid the buffer copying code path in most cases.

Tested on rpi and zynqultrascaleplus.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
0603e442ce omxvideodec/enc: delay allocation after the allocation query
Allocating OMX components buffers in set_format() is too early.
Doing it when receiving the first buffers will allow the element to use
the information from the allocation query and/or the first incoming
buffer to pick to best allocation mode.

Tested on raspberry pi with dynamic resolution changes on decoder and
encoder input.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
90da3c665e omxvideoenc: start src thread in handle_frame()
Makes the code simpler as we no longer need to restart the thread in
gst_omx_video_enc_flush() and It's more symetric which the omxvideodec
implementation.

I'm also going to move the enabling of the OMX component in
handle_frame() and the src pad thread needs to be started after it.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
7916bd53ab omxvideodec: earlier return if downstream_flow_ret is not OK
There is no point to (re)start the src thread if, for example, we are
flushing.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
352184dd09 omxvideodec: factor out enable and disable code
No semantic change, just factor out the code enabling and disabling the
component to their own functions.

Makes the code easier to read as the set_format() method was already
pretty big. Will also allow us to easily change the enabling logic.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
973c6e109a omxvideoenc: factor out enable and disable code
No semantic change, just factor out the code enabling and disabling the
component to their own functions.

Makes the code easier to read as the set_format() method was already
pretty big. Will also allow us to easily change the enabling logic.

https://bugzilla.gnome.org/show_bug.cgi?id=785967
2017-08-08 10:40:47 -04:00
Guillaume Desmottes
7a0949b750 omx: also reset nFilledLen before calling OMX_FillThisBuffer()
The spec states that the buffer passed to OMX_FillThisBuffer() needs to be
empty. Some implementation may check it actually is by checking its
nFilledLen field, so best to reset it as well.

https://bugzilla.gnome.org/show_bug.cgi?id=785623
2017-08-01 11:26:11 -04:00
Julien Isorce
86d9a2c81c omxvideodec: make generic the OMX_UseEGLImage code path
Will be easier to maintain and to make enhancements.

Tested with Tizonia on Desktop.
Also tested with Bellagio to make sure it does not crash when
calling OMX_UseEGLImage and indeed it returns NotImplemented.
Then gst-omx fallback to OMX_UseBuffer if it can and so on.

Also tested on rpi to make sure there is no regression.

https://bugzilla.gnome.org/show_bug.cgi?id=784365
2017-08-01 10:18:21 +01:00
Nicolas Dufresne
64f7f781d8 omxvideodec: Fix segment seek
On segment seek, unlike EOS, we drain, but we cannot expect a flush
later to reset the decoder state. As a side effect, the decoder would
remain in EOS state and ignore any new incoming buffers.

To fix this, we call _flush() inside the _drain() function, and
_finish() becomes what _drain() was before. This way, for _finish() (the
    eos case) we only drain, for _drain() triggered by segment seek or new
caps, we also reset the decoder state so it's ready to accept buffers.

https://bugzilla.gnome.org/show_bug.cgi?id=785237
2017-07-21 11:59:50 -04:00
Guillaume Desmottes
3f5d98a360 omxvideoenc: ensure enough buffers are allocated in the pool
Handle allocation query and ensure enough buffers are allocated in
the negotiated pool. This help preventing buffer starvation in the pipeline.

https://bugzilla.gnome.org/show_bug.cgi?id=785122
2017-07-19 09:37:37 -04:00
Guillaume Desmottes
136714c6ed omxvideodec: add dmabuf support for output
The zynqultrascaleplus OMX implementation has a custom extension
allowing decoders to output dmabuf and so avoid buffers copy between OMX
and GStreamer.

Make use of this extension when built on the zynqultrascaleplus. The
buffer pool code should be re-usable for other platforms as well.

https://bugzilla.gnome.org/show_bug.cgi?id=784847
2017-07-18 23:46:46 +01:00
Julien Isorce
a9a3087021 config: add OMX.Aratelia.video_decoder.vp8 to Tizonia config
Useful mostly for testing/debugging purpose as this is a software
based encoder (libvpxdec) for which GStreamer provides a direct
wrapper.

https://bugzilla.gnome.org/show_bug.cgi?id=783976
2017-07-18 23:45:11 +01:00
Julien Isorce
1b7d0b8599 omxvideodec: handle IL 1.2 behavior for OMX_SetParameter
It triggers SettingsChanged on the other port and it is up to
the client to decide if it should lead to a port reconfiguration.

Settings are propagated to the other port for fields they have
in common. But this event is only triggered on the other port
if it actually change a setting.

https://bugzilla.gnome.org/show_bug.cgi?id=783976
2017-07-18 23:45:11 +01:00
Julien Isorce
709d91ea2b config: set rank to 0 for Tizonia's mp3 decoder
Should have been 0 from the initial commit
eed49b4231
2017-07-18 23:45:11 +01:00
Julien Isorce
af18e81fef omxvideodec: fix file permissions
Introduced by ebc9b4903c
2017-07-18 23:45:11 +01:00
Julien Isorce
7b114b131f omxvideodec: fix buffer leak when eglimage setup fails
Can happen if gst_buffer_pool_acquire_buffer succeeds but
gst_buffer_n_memory (buffer) is not exactly 1.

In theory this should not happen because the decoder requests
EGLImage(RGBA) but better to fix any leak on corner cases.

https://bugzilla.gnome.org/show_bug.cgi?id=784365
2017-07-17 17:11:34 +01:00
Satya Prakash Gupta
5e6c3f170f omx: Possible Memory leak in gst_caps_from_string
https://bugzilla.gnome.org/show_bug.cgi?id=784978
2017-07-17 16:46:29 +03:00
Satya Prakash Gupta
45eaf9cfc6 omxvideoenc: Fix deadlock in error case when draining
https://bugzilla.gnome.org/show_bug.cgi?id=784972
2017-07-17 15:39:02 +03:00
Satya Prakash Gupta
9db720f13e omxaudioenc: Fix deadlock in error case when draining
https://bugzilla.gnome.org/show_bug.cgi?id=784967
2017-07-17 15:38:17 +03:00
Guillaume Desmottes
4488ab97af build: include OMX_IndexExt and OMX_ComponentExt if present
These files may be used by OMX implementation to define custom extensions.
Include them if present as we are already doing with OMX_VideoExt.h

https://bugzilla.gnome.org/show_bug.cgi?id=784847
2017-07-13 14:41:58 +01:00
Jan Schmidt
fe9cdb9b19 omxh264enc: Re-add periodicty-idr property for backward compat
Retain backwards compatibility by adding a duplicate
property for periodicty-idr

https://bugzilla.gnome.org/show_bug.cgi?id=784370
2017-07-13 16:42:24 +10:00
Guillaume Desmottes
2034b26347 omxh264enc: fix typo in "periodicty-idr" property name
Also fix the 'nick' of the property.

https://bugzilla.gnome.org/show_bug.cgi?id=784370
2017-07-12 16:23:29 -04:00
Julien Isorce
80c6dd46a1 omxvideodec: use OMX_UseBuffer
For example this allows the omx decoder to directly fill the
pixmaps coming from the video sink.

It only avoids a buffer copy when the decoder uses a pool provided
by a downstream element. So let's restrict this usage to situations
where the decoder decides to use a downstream buffer pool.

Tested with Tizonia/OMX.Aratelia.video_decoder.vp8
and with Bellagio/OMX.mesa.video_decoder.avc.

If it fails to setup buffers with OMX_UseBuffer the decoders
fallbacks to usual OMX_AllocateBuffer.

Also it allows to test on desktop the GstOMXBufferPool->other_pool
management which was previously only used in the OMX_UseEGLImage
case, i.e. on Rpi.

https://bugzilla.gnome.org/show_bug.cgi?id=784069
2017-07-12 16:36:03 +01:00
Julien Isorce
e60ac7e1c0 omx: do not always print an error if OMX_{UseBuffer,EGLImage} fails
Let the caller decide to print an error. Because it can be part of
a normal trial path.

https://bugzilla.gnome.org/show_bug.cgi?id=784069
2017-07-12 16:26:36 +01:00
Guillaume Desmottes
9928a881b0 meson: add gstomxmp3enc
Commit 02d493e859 didn't add
gstomxmp3enc.c to meson.

https://bugzilla.gnome.org/show_bug.cgi?id=784848
2017-07-12 15:51:55 +01:00
Julien Isorce
8cd77b04a6 config: add OMX.Aratelia.audio_encoder.mp3 to Tizonia config
Useful mostly for testing/debugging purpose as this is a software
based encoder (libmp3lame) for which GStreamer provides a direct
wrapper.

https://bugzilla.gnome.org/show_bug.cgi?id=782988
2017-07-12 14:29:44 +01:00
Julien Isorce
02d493e859 omx: add gstomxmp3enc
Initial support and only tested with the software based
encoder OMX.Aratelia.audio_encoder.mp3 from Tizonia which
internally uses libmp3lame.

https://bugzilla.gnome.org/show_bug.cgi?id=782988
2017-07-12 14:29:44 +01:00
Guillaume Desmottes
0aa4c9db4e h264dec: add hack to pass profile and level to OMX
This information can be useful to zynqultrascaleplus decoders. They may
use this information to reduce startup latency by configuring itself
before receiving the first frames.

We also have a custom OMX extension allowing the decoder to report the
latency. The profile/level information helps it reporting a more
accurate latency earlier.

https://bugzilla.gnome.org/show_bug.cgi?id=783114
2017-07-11 11:57:50 -04:00
Guillaume Desmottes
1e570fed17 omxh264enc: move profile and level parsing functions to their own files
Will allow to re-use them in the decoder element.

https://bugzilla.gnome.org/show_bug.cgi?id=783114
2017-07-11 11:57:50 -04:00
Gurkirpal Singh
043b417717 meson: Add tizonia option
https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-07-05 17:27:27 -04:00
Gurkirpal Singh
eed49b4231 config: add omxmp3dec config for tizonia
GST_OMX_CONFIG_DIR=$HOME/gst/master/gst-omx/config/tizonia/ \
    gst-launch-1.0 filesrc location=mpthreetest.mp3 ! id3demux ! \
    mpegaudioparse ! omxmp3dec ! audioconvert ! pulsesink

v2: [Nicolas] Use template to create gstomx.conf using pkg-config

v3: [Nicolas] Ignore only config/tizonia/gstomx.conf

v4: [Nicolas] Add "/" for single occurence

https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-07-05 17:27:27 -04:00
Gurkirpal Singh
065878a5d4 omx: always ignore OMX_ErrorPortUnpopulated
It is safe to ignore it always. Tizonia notifies this error to pass
some khronos conformance tests. Problem is that gst-omx saves this
error in comp->last_error and then gst_omx_port_set_enabled early
error out which fails the pipeline.

https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-07-05 17:27:27 -04:00
Gurkirpal Singh
fc1a8229b0 omx: guard some omx enums with IL version
Some enums that existed in 1.1.2 just do not exit in 1.2.0
See https://www.khronos.org/registry/OpenMAX-IL/specs/OpenMAX_IL_1_2_0_Specification_redline.pdf

https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-07-05 17:27:27 -04:00
Gurkirpal Singh
ae14bb362a configure.ac: add tizonia target for --with-omx-target flag.
This will check for tizilheaders.pc which adds path to omx-il
headers its cflags. Can be installed all together with the 1.2 headers
with package tizilheaders if not building from sources:
https://github.com/tizonia/tizonia-openmax-il

It is also adviced to remove libomxil-bellagio-dev package because
it installs headers /usr/include directly, ex: /usr/include/OMX_Video.h.

https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-07-05 17:27:27 -04:00
Julien Isorce
c7e66b473f omxaudioenc: update local port_def after reopening the component
gst_omx_audio_enc_open will only update GstOMXAudioEnc->port->port_def.

Note that the component is reopen only if the flag
GST_OMX_HACK_NO_COMPONENT_RECONFIGURE is set.

https://bugzilla.gnome.org/show_bug.cgi?id=782418
2017-07-05 10:48:56 +01:00
Julien Isorce
786a2617b2 omxvideoenc: update local port_def after reopening the component
gst_omx_video_enc_open will only update GstOMXVideoEnc->port->port_def.

Note that the component is reopen only if the flag
GST_OMX_HACK_NO_COMPONENT_RECONFIGURE is set.

https://bugzilla.gnome.org/show_bug.cgi?id=782418
2017-07-05 10:48:52 +01:00
Sejun Park
ebc9b4903c omxvideodec: update local port_def after reopening the component
gst_omx_video_dec_open will only update GstOMXVideoDec->port->port_def.

Note that the component is reopen only if the flag
GST_OMX_HACK_NO_COMPONENT_RECONFIGURE is set.

https://bugzilla.gnome.org/show_bug.cgi?id=782418
2017-07-05 10:23:01 +01:00
Guillaume Desmottes
a3805116df omxvideodec: increase the minimum number of allocated buffers
Ensure that enough buffers are allocated by adding up component's own
minimal plus the number of buffers requested by downstream.
This should prevent buffers starvation problem if downstream elements
are holding some of the buffers they required.

Also simplify the check on the maximum on buffers. What we actually care
about is to make sure the pool can hold the minimum of required buffers.

https://bugzilla.gnome.org/show_bug.cgi?id=784479
2017-07-03 11:05:24 -04:00
Guillaume Desmottes
8e0dc1d89d omxh264enc: raise a warning if AVCIntraPeriod is not supported
Some platforms may not implement OMX_IndexConfigVideoAVCIntraPeriod and
use OMX_IndexParamVideoAvc instead to configure the GOP pattern.
So raise a warning instead of an error if this API is not implemented.

https://bugzilla.gnome.org/show_bug.cgi?id=784379
2017-07-03 10:22:20 -04:00
Guillaume Desmottes
ebeae6d869 omxh264enc: add 'b-frames' property
Add a property to control the number of B-frames produced by the
encoder using the OMX_VIDEO_PARAM_AVCTYPE OMX API.

https://bugzilla.gnome.org/show_bug.cgi?id=784379
2017-07-03 10:22:20 -04:00
Guillaume Desmottes
1fbb8a3fb8 omxh264enc: fix typo in 'set_avc_intra_period'
https://bugzilla.gnome.org/show_bug.cgi?id=784379
2017-07-03 10:22:20 -04:00
Guillaume Desmottes
2be1214cab add 'zynqultrascaleplus' as OMX target
Adding support for the 'Zynq UltraScale+' as a new OMX target.

See https://www.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html
for details about the platform.

https://bugzilla.gnome.org/show_bug.cgi?id=783097
2017-07-03 10:15:17 -04:00
Julien Isorce
65b3a2769d config: add OMX.mesa.video_decoder.{avc,mpeg2} for Bellagio config
Install libomxil-bellagio0 and make sure mesa has been built with
--enable-omx. Check there is /usr/lib/libomxil-bellagio0/libomx_mesa.so
then run omxregister-bellagio to regenerate $XDG_DATA_HOME/.omxregister

Then omxh264dec and omxmpeg2dec should load.

https://bugzilla.gnome.org/show_bug.cgi?id=782926
2017-06-29 23:40:18 +01:00
Julien Isorce
c692328521 configure.ac: move omx features check after target selection
Does not change anything, except this will be useful for future commits.
Indeed some targets provide a .pc file where to look for the omx headers.

https://bugzilla.gnome.org/show_bug.cgi?id=782800
2017-06-29 23:32:16 +01:00
Guillaume Desmottes
752544841d omxh264dec: remove 'parsed=true' from sink pad
The decoder only requires to receive one frame per buffer which is
already enforced with 'alignment=au'. There is no need to require to
have a parser upstream.

Allow to run "encode ! decode" pipeline without having a parser.

https://bugzilla.gnome.org/show_bug.cgi?id=784344
2017-06-29 15:46:14 -04:00
Guillaume Desmottes
1fa2ea274f omxh264enc: set profile/level using OMX_VIDEO_PARAM_AVCTYPE as well
The OMX specification defines two API to set the AVC profile and level:
using OMX_VIDEO_PARAM_PROFILELEVELTYPE and OMX_VIDEO_PARAM_AVCTYPE.

We were already supporting the former but not the latter. We are now
setting both so implementation don't have to rely on a specific one.

https://bugzilla.gnome.org/show_bug.cgi?id=783862
2017-06-29 15:39:56 -04:00
Guillaume Desmottes
0dbe604209 omxh264enc: factor out update_param_profile_level()
https://bugzilla.gnome.org/show_bug.cgi?id=783862
2017-06-29 15:39:56 -04:00
Guillaume Desmottes
af207f8956 omxh264enc: factor out string to profile/level enum conversion
https://bugzilla.gnome.org/show_bug.cgi?id=783862
2017-06-29 15:39:56 -04:00
Guillaume Desmottes
424776ba5e omxh264enc: use OMX_IndexConfigBrcmVideoIntraPeriod on pi
The OMX_VIDEO_CONFIG_AVCINTRAPERIOD.nPFrames setting isn't of any use on
the raspbery pi. Instead it uses a custom extension to define the I
frame period.

https://bugzilla.gnome.org/show_bug.cgi?id=783829
2017-06-28 17:05:46 -04:00