diff options
-rw-r--r-- | gst/pnm/gstpnmdec.c | 32 | ||||
-rw-r--r-- | gst/pnm/gstpnmdec.h | 1 |
2 files changed, 32 insertions, 1 deletions
diff --git a/gst/pnm/gstpnmdec.c b/gst/pnm/gstpnmdec.c index d99374a10..2f7e774fe 100644 --- a/gst/pnm/gstpnmdec.c +++ b/gst/pnm/gstpnmdec.c @@ -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; diff --git a/gst/pnm/gstpnmdec.h b/gst/pnm/gstpnmdec.h index a148f72c9..28a3c5053 100644 --- a/gst/pnm/gstpnmdec.h +++ b/gst/pnm/gstpnmdec.h @@ -41,6 +41,7 @@ struct _GstPnmdec GstElement element; GstVideoDecoder decoder; GstPnmInfoMngr mngr; + GstVideoCodecState *input_state; guint size, last_byte, current_size ; GstBuffer *buf; }; |