In snapshot mode pngenc should output exactly one frame
and then return FLOW_EOS to upstream. If upstream sends
more input frames before shutting down, it should keep
returning FLOW_EOS but not output any more encoded frames.
After a flushing seek it should output frames again though.
Fixes #3069.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5564>
GstVideoCodecFrame * frame);
static gboolean gst_pngenc_set_format (GstVideoEncoder * encoder,
GstVideoCodecState * state);
GstVideoCodecFrame * frame);
static gboolean gst_pngenc_set_format (GstVideoEncoder * encoder,
GstVideoCodecState * state);
+static gboolean gst_pngenc_flush (GstVideoEncoder * encoder);
static gboolean gst_pngenc_propose_allocation (GstVideoEncoder * encoder,
GstQuery * query);
static gboolean gst_pngenc_propose_allocation (GstVideoEncoder * encoder,
GstQuery * query);
venc_class->set_format = gst_pngenc_set_format;
venc_class->handle_frame = gst_pngenc_handle_frame;
venc_class->propose_allocation = gst_pngenc_propose_allocation;
venc_class->set_format = gst_pngenc_set_format;
venc_class->handle_frame = gst_pngenc_handle_frame;
venc_class->propose_allocation = gst_pngenc_propose_allocation;
+ venc_class->flush = gst_pngenc_flush;
gobject_class->finalize = gst_pngenc_finalize;
GST_DEBUG_CATEGORY_INIT (pngenc_debug, "pngenc", 0, "PNG image encoder");
gobject_class->finalize = gst_pngenc_finalize;
GST_DEBUG_CATEGORY_INIT (pngenc_debug, "pngenc", 0, "PNG image encoder");
gst_buffer_append_memory (pngenc->buffer_out, mem);
}
gst_buffer_append_memory (pngenc->buffer_out, mem);
}
+static gboolean
+gst_pngenc_flush (GstVideoEncoder * encoder)
+{
+ GstPngEnc *pngenc = GST_PNGENC (encoder);
+
+ pngenc->frame_count = 0;
+
+ return TRUE;
+}
+
static GstFlowReturn
gst_pngenc_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame)
{
static GstFlowReturn
gst_pngenc_handle_frame (GstVideoEncoder * encoder, GstVideoCodecFrame * frame)
{
GstVideoFrame vframe;
pngenc = GST_PNGENC (encoder);
GstVideoFrame vframe;
pngenc = GST_PNGENC (encoder);
+
+ if (pngenc->snapshot && pngenc->frame_count > 0)
+ return GST_FLOW_EOS;
+
info = &pngenc->input_state->info;
GST_DEBUG_OBJECT (pngenc, "BEGINNING");
info = &pngenc->input_state->info;
GST_DEBUG_OBJECT (pngenc, "BEGINNING");
if ((ret = gst_video_encoder_finish_frame (encoder, frame)) != GST_FLOW_OK)
goto done;
if ((ret = gst_video_encoder_finish_frame (encoder, frame)) != GST_FLOW_OK)
goto done;
+ ++pngenc->frame_count;
+
if (pngenc->snapshot)
ret = GST_FLOW_EOS;
if (pngenc->snapshot)
ret = GST_FLOW_EOS;
guint compression_level;
gboolean snapshot;
guint compression_level;
gboolean snapshot;
};
GST_ELEMENT_REGISTER_DECLARE (pngenc);
};
GST_ELEMENT_REGISTER_DECLARE (pngenc);