Commit graph

186 commits

Author SHA1 Message Date
Julien Isorce
eec88a9651 omx{audio,video}{dec,enc}: sequentially disable ports because buffers are not shared
For the history, the parallel disable port has been introduced by:
"00be69f omxvideodec: Disable output port when setting a new format"
and then replicated to videoenc, audiodec and audioenc.

This is only required to do 'parallel' if buffers are shared between ports.
But for decoders and encoders the input and output buffer are of different
nature by definition (bitstream vs images). So they cannot be shared.

Also starting from IL 1.2.0 it is written in the spec that the parallel
disable is not allowed and will return an error. Except when buffers are
shared.

Again here we know in advance that they are not shared so let's always
do a sequential disable.

Tested on Desktop, rpi and zynqultrascaleplus.

https://bugzilla.gnome.org/show_bug.cgi?id=786348
2017-08-17 14:01:27 +01:00
Guillaume Desmottes
f2b0b66e39 omxvideoenc/dec: declare latency on zynqultrascaleplus
The OMX specification doesn't provide any API to expose the latency
introduced by encoders and decoders. We implemented this as a custom
extension as declaring the latency is needed for live pipelines like
video conferencing.

https://bugzilla.gnome.org/show_bug.cgi?id=785125
2017-08-09 17:01:15 -04:00
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
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
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
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
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
Graham Leggett
463929af3e omxvideoenc: Improve debug output when setting codec state due to new codec_data fails
https://bugzilla.gnome.org/show_bug.cgi?id=783657
2017-06-12 09:56:20 +03:00
Guillaume Desmottes
623d2df5a3 videoenc: use GST_ROUND_UP_N() macro
Makes the code much easier to read and understand.

https://bugzilla.gnome.org/show_bug.cgi?id=781409
2017-04-26 15:37:41 +01:00
Sebastian Dröge
812e24b06f omxvideoenc: Fix compiler warning
gstomxvideoenc.c: In function ‘gst_omx_video_enc_fill_buffer’:
  CC       libgstomx_la-gstomxaacdec.lo
gstomxvideoenc.c:1316:27: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 8 has type ‘OMX_U32 {aka long unsigned int}’ [-Wformat=]
     GST_LOG_OBJECT (self, "Matched strides - direct copy %u bytes",
                           ^
         outbuf->omx_buf->nFilledLen);
         ~~~~~~~~~~~~~~~~~~
2017-04-07 14:27:23 +03:00
Jan Schmidt
75d9ec634c omxvideoenc: Add an unimplemented mapping for RGBA formats
Add some pixel formats mappings for 2 RGBA formats. Not yet
implemented in the buffer input code though, so no effect for now.
2017-03-14 03:02:06 +11:00
Jan Schmidt
413f05269c omxvideoenc: Add GST_OMX_HACK_HEIGHT_MULTIPLE_16 for Rpi
The Raspberry Pi encoder produces corrupt output unless
the input height is a multiple of 16. Add a hack that adds
zero padding when needed.
2017-03-14 03:00:49 +11:00
Jan Schmidt
f3a7bce442 omxvideoenc: Add a mapping for OMX_COLOR_FormatYUV420PackedSemiPlanar
The RaspberryPi
2017-03-14 02:42:15 +11:00
Jan Schmidt
c3078dd20c omxvideoenc: Filter out unimplemented formats
Don't announce pixel formats in the caps if they've not been
implemented.
2017-03-14 02:40:24 +11:00
Aurélien Zanelli
0c265c1e0e omxvideoenc: implement GstPreset interface
To allow user to use GstPreset to quickly save and load a set of
parameters.

https://bugzilla.gnome.org/show_bug.cgi?id=767907
2016-06-21 15:02:02 +03:00
Sebastian Dröge
a78756c63f omx: #define OMX_SKIP64BIT on the RPi as required by their API
Also add generic support for OMX_SKIP64BIT to gst-omx, in case other
implementations also #define that for whatever reason.

https://bugzilla.gnome.org/show_bug.cgi?id=766475
2016-06-17 12:06:48 +03:00
Enrique Ocaña González
d1a79d7c59 Properly handle drain requests while flushing
Without this commit the decoder streaming thread stops without ever attending
the drain request, leaving the decoder input thread waiting forever.

https://bugzilla.gnome.org/show_bug.cgi?id=758274
2015-11-18 15:18:02 +02:00
Graham Leggett
703bab6885 omxvideoenc: Add keyframe support for the Rpi, using OMX_IndexConfigBrcmVideoRequestIFrame
https://bugzilla.gnome.org/show_bug.cgi?id=753085
2015-08-27 11:15:29 +03:00
Michal Lazo
bfeab29a39 omxvideoenc: Setup aspect ratio on RPi
Needs firmware from yesterday or newer to work with all possible
aspect ratios. Before that it only supported a fixed list.

https://bugzilla.gnome.org/show_bug.cgi?id=732533
2014-09-01 12:18:58 +03:00
Peng Liu
d3d0a82ba4 omxvideoenc: Implement the hack flag GST_OMX_HACK_NO_COMPONENT_RECONFIGURE
Fix a video encoder stall problem on RPi when changing the aspect ratio.

https://bugzilla.gnome.org/show_bug.cgi?id=732533
2014-08-28 10:45:11 +03:00
Sebastian Dröge
d75334456d omx: Let base classes handle EOS
https://bugzilla.gnome.org//show_bug.cgi?id=734774
2014-08-14 17:36:11 +03:00
Sebastian Dröge
0a60770a28 omxvideoenc: Implement flush() instead of the deprecated reset() 2014-06-29 19:04:54 +02:00
Sebastian Dröge
34577a965d omxvideoenc: Don't forget to unref codec state
CID 1214603
2014-05-19 09:10:07 +02:00
Sebastian Dröge
40869afea7 omxvideoenc: Implement hack for not disabling the output port after set_format until the output format is known
Needed on some OMX implementations, e.g. the one from Atmel. It does
not send the settings-changed event on the output port if it is
disabled.
2014-05-15 13:21:07 +02:00
Sebastian Dröge
bc2990169a omxvideoenc: Set nTickCount to the whole duration of the buffer instead of a wrong calculation 2014-05-10 22:47:21 +02:00
Sebastian Dröge
a04ef276e5 omx: Rename function from _4_ to _for_ for clarity 2014-03-12 12:47:34 +01:00
Christian König
6bf4d9a498 omxvideo: start sharing more code between video decoder and encoder
Identical functionality spread of two different components.
We can't use a common base class because of different inheritance,
but let's try to share the code anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=726024
2014-03-12 12:47:09 +01:00
Christian König
20cfcda4db omxvideoenc: fix a memory leak in gst_omx_video_enc_getcaps
https://bugzilla.gnome.org/show_bug.cgi?id=725826
2014-03-06 20:37:02 +01:00
Christian König
85db124673 omxvideoenc: simplify _find_nearest_frame
Just the same as we did with the decoder. Also give the
function a gst_omx_video_enc prefix to distinct it from
the decoder function.

https://bugzilla.gnome.org/show_bug.cgi?id=724236
2014-03-03 20:12:58 +01:00
Christian König
4e4f093319 omxvideoenc: fix startup race condition
The reset function shouldn't start the src pad
loop if it wasn't started before.

Signed-off-by: Christian König <christian.koenig@amd.com>
2014-03-02 12:08:09 +01:00
Sebastian Dröge
1bf4edf721 omx: Don't handle FLUSHING and NOT_LINKED as errors
Also don't stop the task on NOT_LINKED. We're not a demuxer.
2014-01-25 17:44:57 +01:00
Roman Arutyunyan
5ba55b6c9a gstomxvideoenc: Set bitrate in setcaps
Otherwise it gets lost whenever we configure new caps

https://bugzilla.gnome.org/show_bug.cgi?id=698049
2013-07-01 15:48:47 +02:00
Josep Torra
f3f9330332 omx: Take lock on EOS to update the flow return value
Fixes "GThread-ERROR **: file gthread-posix.c: line 171
(g_mutex_free_posix_impl): error 'Device or resource busy' during
'pthread_mutex_destroy ((pthread_mutex_t *) mutex)'" in _finalize.
2013-05-20 12:06:34 +02:00
jitendra
715b44ea66 omx: Add pads based on element type
This allows to later add sources and sink that only have a srcpad
or sinkpad.

https://bugzilla.gnome.org/show_bug.cgi?id=699754
2013-05-06 16:20:20 +02:00
Tim-Philipp Müller
2cbbab3128 omx: more printf format fixes
Fix printf formats again, so that gst-omx compiles warning-
free on the Raspberry Pi as well. Unfortunately OMX_UINT32
maybe be typedefed to uint32_t or unsigned long, which
doesn't work well with our debugging printf format strings,
so just use %u for those and cast to guint.
2013-04-18 23:10:13 +01:00
jitendra
960590f92f omx: Disable output port before transition to idle state
https://bugzilla.gnome.org/show_bug.cgi?id=698109
2013-04-16 12:46:48 +02:00
Tim-Philipp Müller
0c08d375f4 omx: fix printf formats in debug messages
OMX_U32 is typedefed to an unsigned long,
OMX_TICKS to a 64-bit integer.
2013-04-08 17:02:32 +01:00
Josep Torra
a5778efe16 omx: Clarify that loop task is also paused in EOS 2013-03-16 10:00:24 +01:00
Josep Torra
e16207f3dd omxvideoenec: Don't forget propagate flow return value upstream 2013-03-16 09:59:01 +01:00
Sebastian Dröge
e1f94660f7 omx: Stop output port task after draining 2013-03-15 11:46:34 +01:00
Sebastian Dröge
22dce51dd4 omx: Handle the OMX_EventBufferFlag to detect EOS too 2013-03-14 12:51:54 +01:00
Sebastian Dröge
b9af5f4f31 omxvideoenc: Properly check the nVersion field 2013-03-13 10:21:49 +01:00
Sebastian Dröge
68c8196912 omxvideoenc: RPi returns garbage for OMX_IndexParamVideoBitrate, work around that 2013-03-13 09:38:07 +01:00
Sebastian Dröge
3c13502b75 omxvideoenc: Always allocate output buffers from the loop function 2013-03-11 13:45:04 +01:00
Sebastian Dröge
79a1fed0e0 omxvideoenc: Wait until the Executing state is reached before passing buffers to the component 2013-03-11 11:52:57 +01:00
Sebastian Dröge
f518ce5ed9 omxvideoenc: Disable output port when setting a new format 2013-03-11 10:29:30 +01:00
Sebastian Dröge
65174bbd7f omx: Catch errors when releasing buffers to a port and handle them 2013-03-11 10:04:10 +01:00
Sebastian Dröge
eac2078056 omxvideoenc: Use the correct video codec state when filling an input buffer 2013-03-10 12:09:23 +01:00
Sebastian Dröge
98cf9f6fe2 omxvideoenc: Store correct input state 2013-03-10 12:05:50 +01:00
Sebastian Dröge
fb3b213b3e omxvideoenc: Allocate output buffers as early as possible 2013-03-10 11:31:55 +01:00
Josep Torra
bd071327da omx: Fix deadlock in encoders and add explainatory comments. 2013-03-09 14:14:40 +01:00
Sebastian Dröge
c014b1c9a3 omx: Flush and stop srcpad when configuring new caps 2013-03-08 15:50:20 +01:00
Sebastian Dröge
7a1eaec3b9 omx: Add timeout to the flush operation and move buffer populating to a separate function 2013-03-07 13:57:00 +01:00
Sebastian Dröge
60861f3990 omx: Do number of buffers configuration explicitely 2013-03-07 13:56:44 +01:00
Sebastian Dröge
42937eaea0 omxvideoenc: gst_omx_port_update_port_definition() returns a OMX_ERRORTYPE, not a gboolean 2013-03-01 11:49:53 +01:00
Sebastian Dröge
687a188dad omxvideo{dec,enc}: Don't use the input state if it wasn't set yet 2013-03-01 11:44:17 +01:00
Sebastian Dröge
a53c5638e2 omxvideoenc: Only enable the output port after we know the output format 2013-03-01 11:24:56 +01:00
Sebastian Dröge
1a906da409 omx: Add API for allocating a specific number of buffers and using EGLImages or buffers allocated elsewhere 2013-02-28 11:20:52 +01:00
Sebastian Dröge
e42faae652 omx: Refactor code flow a bit if output port settings have changed 2013-02-27 16:56:02 +01:00
Sebastian Dröge
b12610efd7 omx: Clean up port settings change handling 2013-02-27 15:50:20 +01:00
Josep Torra
b85358aff7 omxvideoenc: prevent a NULL pointer access 2013-02-27 10:21:39 +01:00
Sebastian Dröge
5b45cb0810 omx: Auto-detect the port indizes if possible 2013-02-25 12:42:05 +01:00
Sebastian Dröge
3e090dd83b omx: Refactor querying of component supported caps into its own function 2013-02-25 11:42:38 +01:00
Sebastian Dröge
70368c31cd omx: Refactor waiting for buffers to be released by the component to a separate function 2013-02-25 10:41:12 +01:00
Sebastian Dröge
92c7944499 omxvideoenc: Rename component variable 2013-02-25 09:19:08 +01:00
Josep Torra
71b4573a34 omxvideoenc: remove duplicated line 2013-02-22 16:27:33 +01:00
Sebastian Dröge
219a93bbaf omx: Some minor refactoring and cleanup 2013-02-12 11:49:21 +01:00
Sebastian Dröge
c3bcc43db7 omx: Split enabling/disabling of port into sending the command and waiting for it
This allows to do anything necessary after sending the command to actually let it finish
2013-02-12 11:41:43 +01:00
Sebastian Dröge
39672e70c4 omxvideoenc: Set stride, slice height and buffer size 2013-02-12 11:28:36 +01:00
Sebastian Dröge
044a88f838 omxvideoenc: Properly negotiate OMX color format with the component 2013-02-12 11:03:32 +01:00
Sebastian Dröge
023b542ad5 omxvideoenc: Implement getcaps() vfunc 2013-02-12 11:03:30 +01:00
Sebastian Dröge
be31e7273b omx: Fix some memory leaks and suboptimal locking 2013-01-14 10:36:57 +01:00
Sebastian Dröge
bcb181bd2d omxvideoenc: Don't forget to unmap frame in error cases 2013-01-14 10:36:50 +01:00
Sebastian Dröge
25d5c55764 omxvideoenc: Fix copying of the video frames to the OMX buffers 2013-01-14 10:36:44 +01:00
Sebastian Dröge
1d01c0ebf0 omx: Fix ununsed variable compiler warning 2012-12-20 12:30:05 +01:00
Sebastian Dröge
83b4c1d892 omx: No need to start the srcpad task in ::start() already
It will be started properly after the caps are set.
2012-12-20 12:27:47 +01:00
Sebastian Dröge
f90a6ed9e9 omx: Improve debug output 2012-12-20 12:20:31 +01:00
Sebastian Dröge
7fa4616598 omx: Fix refcount problem with frames being dropped because of decoder bugs 2012-11-12 15:14:09 +01:00
Sebastian Dröge
2481ceb8c4 omx: Update to new GLib thread API 2012-11-12 11:29:48 +01:00
Sebastian Dröge
bced70525a omx: Use open/close vfuncs 2012-10-22 14:34:53 +02:00
Sebastian Dröge
9d0e582484 omx: Handle video meta correctly 2012-10-22 14:28:04 +02:00
Sebastian Dröge
5fdb490f1a omx: Port to video base classes from -base 2012-10-22 14:20:41 +02:00
Sebastian Dröge
e84fee6488 omx: Fix compilation after gst_pad_start_task() API changes 2012-06-20 11:09:13 +01:00
George Kiagiadakis
158775f497 Implement a new custom recursive mutex type and fix locking in callbacks so that in-context calls are allowed.
According to the OMX specification, implementations are allowed to call
callbacks in the context of their function calls. However, our callbacks
take locks and this causes deadlocks if the unerlying OMX implementation
uses this kind of in-context calls.

A solution to the problem would be a recursive mutex. However, a normal
recursive mutex does not fix the problem because it is not guaranteed
that the callbacks are called from the same thread. What we see in Broadcom's
implementation for example is:

- OMX_Foo is called
- OMX_Foo waits on a condition
- A callback is executed in a different thread
- When the callback returns, its calling function
  signals the condition that OMX_Foo waits on
- OMX_Foo wakes up and returns

The solution I came up with here is to take a second lock inside the callback,
but only if recursion is expected to happen. Therefore, all calls to OMX
functions are guarded by calls to gst_omx_rec_mutex_begin_recursion() / _end_recursion(),
which effectively tells the mutex that at this point we want to allow calls
to _recursive_lock() to succeed, although we are still holding the master lock.
2012-05-07 17:01:16 +03:00
Olivier Crête
ff2603a727 Port to Gst 0.11 2012-04-13 12:16:34 -04:00
Jonas Larsson
2cab5b5db5 omxvideoenc: Fix deadlock when using the EOS hack 2011-12-14 10:07:29 +01:00
Sebastian Dröge
3db75118dd omxvideoenc: Remove workaround for basevideocodec bug 2011-12-12 14:26:48 +01:00
Sebastian Dröge
9e6665e8f8 omx: Add hack for encoder components that don't allow empty EOS buffers 2011-12-09 12:24:01 +01:00
Sebastian Dröge
bd60f141e9 omxvideoenc: Use correct timestamp, duration and filled length for the EOS buffers 2011-12-06 12:46:51 +01:00
Sebastian Dröge
781e61d569 omxvideoenc: Drop EOS events in ::finish()
The event will be forwarded downstream from the srcpad
loop function after the last buffer was generated by the
component. Forwarding it after ::finish() will use the
sinkpad streaming thread and does not guarantee that
the encoder is completely drained.
2011-12-05 08:12:48 +01:00
Sebastian Dröge
be4e1e184e omxvideoenc: First set ports to flushing before waiting for the srcpad streaming thread to finish 2011-11-18 09:59:43 -08:00
Sebastian Dröge
1ba8ec3d37 omxvideoenc: Signal the drain GCond even if downstream returned an error 2011-11-17 11:29:39 -08:00
Sebastian Dröge
2408e0d33a omxvideoenc: Shutdown component in PAUSED->READY and deallocate buffers 2011-11-17 10:19:47 -08:00
Sebastian Dröge
879349ba11 omxvideoenc: Set force_keyframe to FALSE after handling it
There's no reason why the base class should forward the event
further downstream if we already handled it and will insert a
keyframe.
2011-11-16 12:02:08 -08:00
Sebastian Dröge
22ba4e1b9e omxvideoenc: Add vfunc for handling the output frames
This can be used by subclasses to override the buffer flags
or to handle some frames differently than the default behaviour.
2011-11-15 08:28:32 -08:00
Sebastian Dröge
0a4e222e60 omxvideoenc: Make srcpad caps setting threadsafe 2011-11-10 15:17:56 +01:00
Sebastian Dröge
fbe171ee2c omxvideoenc: Always flush the ports and make sure no processing is happening in ::reset
This fixes a race condition that happened when seeking
very often in a short period of time.
2011-11-10 15:02:22 +01:00