Skip to content
Snippets Groups Projects
Commit 9fb73a18 authored by Reynaldo H. Verdejo Pinochet's avatar Reynaldo H. Verdejo Pinochet Committed by Sebastian Dröge
Browse files

pnmdec: propagate input state after parsing

Store and copy input state fields when setting the
output state of the decoder. Avoids problems like
the framerate set by an upstream element being ignored

Related to:

https://bugzilla.gnome.org/show_bug.cgi?id=756563
parent f6c66f2a
No related branches found
No related tags found
No related merge requests found
......@@ -44,6 +44,9 @@
#include <stdio.h>
static gboolean gst_pnmdec_start (GstVideoDecoder * decoder);
static gboolean gst_pnmdec_set_format (GstVideoDecoder * decoder,
GstVideoCodecState * state);
static gboolean gst_pnmdec_stop (GstVideoDecoder * decoder);
static GstFlowReturn gst_pnmdec_parse (GstVideoDecoder * decoder,
GstVideoCodecFrame * frame, GstAdapter * adapter, gboolean at_eos);
static GstFlowReturn gst_pnmdec_handle_frame (GstVideoDecoder * decoder,
......@@ -83,8 +86,10 @@ gst_pnmdec_class_init (GstPnmdecClass * klass)
"Lutz Mueller <lutz@users.sourceforge.net>");
vdec_class->start = gst_pnmdec_start;
vdec_class->stop = gst_pnmdec_stop;
vdec_class->parse = gst_pnmdec_parse;
vdec_class->handle_frame = gst_pnmdec_handle_frame;
vdec_class->set_format = gst_pnmdec_set_format;
}
static void
......@@ -111,6 +116,31 @@ gst_pnmdec_init (GstPnmdec * s)
GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (s));
}
static gboolean
gst_pnmdec_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state)
{
GstPnmdec *pnmdec = (GstPnmdec *) decoder;
if (pnmdec->input_state)
gst_video_codec_state_unref (pnmdec->input_state);
pnmdec->input_state = gst_video_codec_state_ref (state);
return TRUE;
}
static gboolean
gst_pnmdec_stop (GstVideoDecoder * decoder)
{
GstPnmdec *pnmdec = (GstPnmdec *) decoder;
if (pnmdec->input_state) {
gst_video_codec_state_unref (pnmdec->input_state);
pnmdec->input_state = NULL;
}
return TRUE;
}
static GstFlowReturn
gst_pnmdec_parse_ascii (GstPnmdec * s, const guint8 * b, guint bs)
{
......@@ -330,7 +360,7 @@ gst_pnmdec_parse (GstVideoDecoder * decoder, GstVideoCodecFrame * frame,
}
output_state =
gst_video_decoder_set_output_state (GST_VIDEO_DECODER (s), format,
s->mngr.info.width, s->mngr.info.height, NULL);
s->mngr.info.width, s->mngr.info.height, s->input_state);
gst_video_codec_state_unref (output_state);
if (gst_video_decoder_negotiate (GST_VIDEO_DECODER (s)) == FALSE) {
r = GST_FLOW_NOT_NEGOTIATED;
......
......@@ -41,6 +41,7 @@ struct _GstPnmdec
GstElement element;
GstVideoDecoder decoder;
GstPnmInfoMngr mngr;
GstVideoCodecState *input_state;
guint size, last_byte, current_size ;
GstBuffer *buf;
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment