diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2018-04-26 12:30:47 +0200 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2018-06-08 09:53:01 +0200 |
commit | c8969b0dbec565f388c35f6d5eb43bc463d6348a (patch) | |
tree | 19928770061371c6e80b7e4e57bc7de629f9980a | |
parent | 431eac07bffd7019fbbad0464b2a2df95d29ed66 (diff) | |
download | gst-omx-c8969b0dbec565f388c35f6d5eb43bc463d6348a.tar.gz |
omxvideoenc: implement decide_allocation
Increase the number of output buffers by the number of buffers requested
downstream.
Prevent buffers starvation if downstream is going to use dynamic buffer
mode on its input.
https://bugzilla.gnome.org/show_bug.cgi?id=795746
-rw-r--r-- | omx/gstomx.c | 12 | ||||
-rw-r--r-- | omx/gstomx.h | 2 | ||||
-rw-r--r-- | omx/gstomxvideodec.c | 2 | ||||
-rw-r--r-- | omx/gstomxvideoenc.c | 47 | ||||
-rw-r--r-- | omx/gstomxvideoenc.h | 2 |
5 files changed, 53 insertions, 12 deletions
diff --git a/omx/gstomx.c b/omx/gstomx.c index 94bc014..52e6d68 100644 --- a/omx/gstomx.c +++ b/omx/gstomx.c @@ -2552,17 +2552,19 @@ done: * less buffers than the worst case in such scenarios. */ gboolean -gst_omx_port_ensure_buffer_count_actual (GstOMXPort * port) +gst_omx_port_ensure_buffer_count_actual (GstOMXPort * port, guint extra) { OMX_PARAM_PORTDEFINITIONTYPE port_def; + guint nb; gst_omx_port_get_port_definition (port, &port_def); - if (port_def.nBufferCountActual != port_def.nBufferCountMin) { - port_def.nBufferCountActual = port_def.nBufferCountMin; + + nb = port_def.nBufferCountMin + extra; + if (port_def.nBufferCountActual != nb) { + port_def.nBufferCountActual = nb; GST_DEBUG_OBJECT (port->comp->parent, - "set port %d nBufferCountActual to %d", - (guint) port->index, (guint) port_def.nBufferCountActual); + "set port %d nBufferCountActual to %d", (guint) port->index, nb); if (gst_omx_port_update_port_definition (port, &port_def) != OMX_ErrorNone) return FALSE; diff --git a/omx/gstomx.h b/omx/gstomx.h index 4600833..eab7b7d 100644 --- a/omx/gstomx.h +++ b/omx/gstomx.h @@ -455,7 +455,7 @@ OMX_ERRORTYPE gst_omx_port_mark_reconfigured (GstOMXPort * port); OMX_ERRORTYPE gst_omx_port_set_enabled (GstOMXPort * port, gboolean enabled); OMX_ERRORTYPE gst_omx_port_wait_enabled (GstOMXPort * port, GstClockTime timeout); gboolean gst_omx_port_is_enabled (GstOMXPort * port); -gboolean gst_omx_port_ensure_buffer_count_actual (GstOMXPort * port); +gboolean gst_omx_port_ensure_buffer_count_actual (GstOMXPort * port, guint extra); /* OMX 1.2.0 dynamic allocation mode */ gboolean gst_omx_is_dynamic_allocation_supported (void); diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index e885a99..989d185 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -2335,7 +2335,7 @@ gst_omx_video_dec_ensure_nb_in_buffers (GstOMXVideoDec * self) GstOMXVideoDecClass *klass = GST_OMX_VIDEO_DEC_GET_CLASS (self); if ((klass->cdata.hacks & GST_OMX_HACK_ENSURE_BUFFER_COUNT_ACTUAL)) { - if (!gst_omx_port_ensure_buffer_count_actual (self->dec_in_port)) + if (!gst_omx_port_ensure_buffer_count_actual (self->dec_in_port, 0)) return FALSE; } diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c index faba38e..1a630c4 100644 --- a/omx/gstomxvideoenc.c +++ b/omx/gstomxvideoenc.c @@ -226,6 +226,8 @@ static gboolean gst_omx_video_enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query); static GstCaps *gst_omx_video_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter); +static gboolean gst_omx_video_enc_decide_allocation (GstVideoEncoder * encoder, + GstQuery * query); static GstFlowReturn gst_omx_video_enc_drain (GstOMXVideoEnc * self); @@ -481,6 +483,8 @@ gst_omx_video_enc_class_init (GstOMXVideoEncClass * klass) video_encoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_omx_video_enc_propose_allocation); video_encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_omx_video_enc_getcaps); + video_encoder_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_omx_video_enc_decide_allocation); klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER; klass->cdata.default_sink_template_caps = "video/x-raw, " @@ -1372,11 +1376,18 @@ static gboolean gst_omx_video_enc_ensure_nb_out_buffers (GstOMXVideoEnc * self) { GstOMXVideoEncClass *klass = GST_OMX_VIDEO_ENC_GET_CLASS (self); + guint extra = 0; - if ((klass->cdata.hacks & GST_OMX_HACK_ENSURE_BUFFER_COUNT_ACTUAL)) { - if (!gst_omx_port_ensure_buffer_count_actual (self->enc_out_port)) - return FALSE; - } + if (!(klass->cdata.hacks & GST_OMX_HACK_ENSURE_BUFFER_COUNT_ACTUAL)) + return TRUE; + + /* If dowstream tell us how many buffers it needs allocate as many extra buffers so we won't starve + * if it keeps them downstream (like when using dynamic mode). */ + if (self->nb_downstream_buffers) + extra = self->nb_downstream_buffers; + + if (!gst_omx_port_ensure_buffer_count_actual (self->enc_out_port, extra)) + return FALSE; return TRUE; } @@ -1641,6 +1652,7 @@ gst_omx_video_enc_start (GstVideoEncoder * encoder) self->last_upstream_ts = 0; self->downstream_flow_ret = GST_FLOW_OK; + self->nb_downstream_buffers = 0; return TRUE; } @@ -1883,7 +1895,7 @@ gst_omx_video_enc_ensure_nb_in_buffers (GstOMXVideoEnc * self) GstOMXVideoEncClass *klass = GST_OMX_VIDEO_ENC_GET_CLASS (self); if ((klass->cdata.hacks & GST_OMX_HACK_ENSURE_BUFFER_COUNT_ACTUAL)) { - if (!gst_omx_port_ensure_buffer_count_actual (self->enc_in_port)) + if (!gst_omx_port_ensure_buffer_count_actual (self->enc_in_port, 0)) return FALSE; } @@ -3030,3 +3042,28 @@ gst_omx_video_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) return ret; } + +static gboolean +gst_omx_video_enc_decide_allocation (GstVideoEncoder * encoder, + GstQuery * query) +{ + GstOMXVideoEnc *self = GST_OMX_VIDEO_ENC (encoder); + guint min = 1; + + if (!GST_VIDEO_ENCODER_CLASS + (gst_omx_video_enc_parent_class)->decide_allocation (encoder, query)) + return FALSE; + + if (gst_query_get_n_allocation_pools (query)) { + gst_query_parse_nth_allocation_pool (query, 0, NULL, NULL, &min, NULL); + GST_DEBUG_OBJECT (self, + "Downstream requested %d buffers, adjust number of output buffers accordingly", + min); + } else { + GST_DEBUG_OBJECT (self, "Downstream didn't set any allocation pool info"); + } + + self->nb_downstream_buffers = min; + + return TRUE; +} diff --git a/omx/gstomxvideoenc.h b/omx/gstomxvideoenc.h index 53a008e..370b290 100644 --- a/omx/gstomxvideoenc.h +++ b/omx/gstomxvideoenc.h @@ -101,6 +101,8 @@ struct _GstOMXVideoEnc GstOMXBufferAllocation input_allocation; /* TRUE if encoder is passing dmabuf's fd directly to the OMX component */ gboolean input_dmabuf; + /* Number of buffers requested downstream */ + guint nb_downstream_buffers; #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS GEnumClass *alg_roi_quality_enum_class; |