omxvideoenc: drain encoder on ALLOCATION and DRAIN queries

Ensure that the encoder releases all its input buffers when requested by
upstream. Encoder input buffers may be shared with downstreaming (when
using dmabuf), upstream may then request the encoder to
drain when reconfiguring before destroying its buffers.

Also drain on ALLOCATION query as we already do in kmssink as that
notify of a format change.

Fix "decoder ! encoder" pipeline when decoding a file with different
resolutions on Zynq.
This commit is contained in:
Guillaume Desmottes 2019-08-29 12:20:56 +05:30
parent 76267ec55d
commit 7c40a91c31

View file

@ -231,6 +231,8 @@ static GstCaps *gst_omx_video_enc_getcaps (GstVideoEncoder * encoder,
GstCaps * filter);
static gboolean gst_omx_video_enc_decide_allocation (GstVideoEncoder * encoder,
GstQuery * query);
static gboolean gst_omx_video_enc_sink_query (GstVideoEncoder * encoder,
GstQuery * query);
static GstFlowReturn gst_omx_video_enc_drain (GstOMXVideoEnc * self);
@ -488,6 +490,8 @@ gst_omx_video_enc_class_init (GstOMXVideoEncClass * klass)
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);
video_encoder_class->sink_query =
GST_DEBUG_FUNCPTR (gst_omx_video_enc_sink_query);
klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER;
klass->cdata.default_sink_template_caps =
@ -3295,3 +3299,27 @@ gst_omx_video_enc_decide_allocation (GstVideoEncoder * encoder,
return TRUE;
}
static gboolean
gst_omx_video_enc_sink_query (GstVideoEncoder * encoder, GstQuery * query)
{
GstOMXVideoEnc *self = GST_OMX_VIDEO_ENC (encoder);
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_ALLOCATION:
case GST_QUERY_DRAIN:
{
GST_DEBUG_OBJECT (encoder, "%s query: drain encoder",
GST_QUERY_TYPE_NAME (query));
gst_omx_video_enc_drain (self);
return TRUE;
}
default:
break;
}
return
GST_VIDEO_ENCODER_CLASS (gst_omx_video_enc_parent_class)->sink_query
(encoder, query);
}