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
This commit is contained in:
parent
4b5e2f68a3
commit
ec5648763d
@ -44,6 +44,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static gboolean gst_pnmdec_start (GstVideoDecoder * decoder);
|
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,
|
static GstFlowReturn gst_pnmdec_parse (GstVideoDecoder * decoder,
|
||||||
GstVideoCodecFrame * frame, GstAdapter * adapter, gboolean at_eos);
|
GstVideoCodecFrame * frame, GstAdapter * adapter, gboolean at_eos);
|
||||||
static GstFlowReturn gst_pnmdec_handle_frame (GstVideoDecoder * decoder,
|
static GstFlowReturn gst_pnmdec_handle_frame (GstVideoDecoder * decoder,
|
||||||
@ -83,8 +86,10 @@ gst_pnmdec_class_init (GstPnmdecClass * klass)
|
|||||||
"Lutz Mueller <lutz@users.sourceforge.net>");
|
"Lutz Mueller <lutz@users.sourceforge.net>");
|
||||||
|
|
||||||
vdec_class->start = gst_pnmdec_start;
|
vdec_class->start = gst_pnmdec_start;
|
||||||
|
vdec_class->stop = gst_pnmdec_stop;
|
||||||
vdec_class->parse = gst_pnmdec_parse;
|
vdec_class->parse = gst_pnmdec_parse;
|
||||||
vdec_class->handle_frame = gst_pnmdec_handle_frame;
|
vdec_class->handle_frame = gst_pnmdec_handle_frame;
|
||||||
|
vdec_class->set_format = gst_pnmdec_set_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -111,6 +116,31 @@ gst_pnmdec_init (GstPnmdec * s)
|
|||||||
GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (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
|
static GstFlowReturn
|
||||||
gst_pnmdec_parse_ascii (GstPnmdec * s, const guint8 * b, guint bs)
|
gst_pnmdec_parse_ascii (GstPnmdec * s, const guint8 * b, guint bs)
|
||||||
{
|
{
|
||||||
@ -330,7 +360,7 @@ gst_pnmdec_parse (GstVideoDecoder * decoder, GstVideoCodecFrame * frame,
|
|||||||
}
|
}
|
||||||
output_state =
|
output_state =
|
||||||
gst_video_decoder_set_output_state (GST_VIDEO_DECODER (s), format,
|
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);
|
gst_video_codec_state_unref (output_state);
|
||||||
if (gst_video_decoder_negotiate (GST_VIDEO_DECODER (s)) == FALSE) {
|
if (gst_video_decoder_negotiate (GST_VIDEO_DECODER (s)) == FALSE) {
|
||||||
r = GST_FLOW_NOT_NEGOTIATED;
|
r = GST_FLOW_NOT_NEGOTIATED;
|
||||||
|
@ -41,6 +41,7 @@ struct _GstPnmdec
|
|||||||
GstElement element;
|
GstElement element;
|
||||||
GstVideoDecoder decoder;
|
GstVideoDecoder decoder;
|
||||||
GstPnmInfoMngr mngr;
|
GstPnmInfoMngr mngr;
|
||||||
|
GstVideoCodecState *input_state;
|
||||||
guint size, last_byte, current_size ;
|
guint size, last_byte, current_size ;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user