mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 14:36:24 +00:00
basevideodecoder: add some sanity enforcing
This commit is contained in:
parent
f72658435b
commit
550237347b
2 changed files with 29 additions and 3 deletions
|
@ -899,6 +899,9 @@ gst_base_video_decoder_chain (GstPad * pad, GstBuffer * buf)
|
||||||
base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad));
|
base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad));
|
||||||
klass = GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder);
|
klass = GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder);
|
||||||
|
|
||||||
|
g_return_val_if_fail (base_video_decoder->packetized || klass->parse_data,
|
||||||
|
GST_FLOW_ERROR);
|
||||||
|
|
||||||
GST_LOG_OBJECT (base_video_decoder,
|
GST_LOG_OBJECT (base_video_decoder,
|
||||||
"chain %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " size %d",
|
"chain %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " size %d",
|
||||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||||
|
@ -1432,6 +1435,9 @@ gst_base_video_decoder_have_frame_2 (GstBaseVideoDecoder * base_video_decoder)
|
||||||
base_video_decoder_class =
|
base_video_decoder_class =
|
||||||
GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder);
|
GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder);
|
||||||
|
|
||||||
|
g_return_val_if_fail (base_video_decoder_class->handle_frame != NULL,
|
||||||
|
GST_FLOW_ERROR);
|
||||||
|
|
||||||
frame->distance_from_sync = base_video_decoder->distance_from_sync;
|
frame->distance_from_sync = base_video_decoder->distance_from_sync;
|
||||||
base_video_decoder->distance_from_sync++;
|
base_video_decoder->distance_from_sync++;
|
||||||
|
|
||||||
|
@ -1565,15 +1571,31 @@ gst_base_video_decoder_get_frame (GstBaseVideoDecoder * base_video_decoder,
|
||||||
* Sets src pad caps according to currently configured #GstVideoState.
|
* Sets src pad caps according to currently configured #GstVideoState.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void
|
gboolean
|
||||||
gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder)
|
gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder)
|
||||||
{
|
{
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state;
|
GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
|
/* minimum sense */
|
||||||
|
g_return_val_if_fail (state->format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
|
g_return_val_if_fail (state->width != 0, FALSE);
|
||||||
|
g_return_val_if_fail (state->height != 0, FALSE);
|
||||||
|
|
||||||
if (GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)) != NULL)
|
if (GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)) != NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* sanitize */
|
||||||
|
if (state->fps_d == 0) {
|
||||||
|
state->fps_n = 0;
|
||||||
|
state->fps_d = 1;
|
||||||
|
}
|
||||||
|
if (state->par_d == 0) {
|
||||||
|
state->par_n = 0;
|
||||||
|
state->par_d = 1;
|
||||||
|
}
|
||||||
|
|
||||||
caps = gst_video_format_new_caps (state->format,
|
caps = gst_video_format_new_caps (state->format,
|
||||||
state->width, state->height,
|
state->width, state->height,
|
||||||
state->fps_n, state->fps_d, state->par_n, state->par_d);
|
state->fps_n, state->fps_d, state->par_n, state->par_d);
|
||||||
|
@ -1585,9 +1607,13 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "setting caps %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (base_video_decoder, "setting caps %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder), caps);
|
ret =
|
||||||
|
gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder),
|
||||||
|
caps);
|
||||||
|
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -199,7 +199,7 @@ void gst_base_video_decoder_lost_sync (GstBaseVideoDecoder *base_vid
|
||||||
GstFlowReturn gst_base_video_decoder_have_frame (GstBaseVideoDecoder *base_video_decoder);
|
GstFlowReturn gst_base_video_decoder_have_frame (GstBaseVideoDecoder *base_video_decoder);
|
||||||
|
|
||||||
void gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder *base_video_decoder);
|
void gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder *base_video_decoder);
|
||||||
void gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder *base_video_decoder);
|
gboolean gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder *base_video_decoder);
|
||||||
GstBuffer *gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * base_video_decoder);
|
GstBuffer *gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * base_video_decoder);
|
||||||
GstFlowReturn gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder *base_video_decoder,
|
GstFlowReturn gst_base_video_decoder_alloc_src_frame (GstBaseVideoDecoder *base_video_decoder,
|
||||||
GstVideoFrame *frame);
|
GstVideoFrame *frame);
|
||||||
|
|
Loading…
Reference in a new issue