diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2020-06-29 13:23:12 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2020-07-02 12:21:51 -0400 |
commit | bc1a0323a9ba39caf6fa6585abda7d4a5296e7b7 (patch) | |
tree | 795ac203d964c61586125651f25c3a6dedcdbe06 /sys | |
parent | 779f331bd4682699ee8333d00df3e72b6bc798f6 (diff) | |
download | gstreamer-plugins-bad-bc1a0323a9ba39caf6fa6585abda7d4a5296e7b7.tar.gz |
v4l2slh264dec: Factor out bitstream allocation
No functional changes.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/v4l2codecs/gstv4l2codech264dec.c | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/sys/v4l2codecs/gstv4l2codech264dec.c b/sys/v4l2codecs/gstv4l2codech264dec.c index 81fcdb3bd..eec5c44eb 100644 --- a/sys/v4l2codecs/gstv4l2codech264dec.c +++ b/sys/v4l2codecs/gstv4l2codech264dec.c @@ -724,36 +724,46 @@ gst_v4l2_codec_h264_dec_new_sequence (GstH264Decoder * decoder, } static gboolean -gst_v4l2_codec_h264_dec_start_picture (GstH264Decoder * decoder, - GstH264Picture * picture, GstH264Slice * slice, GstH264Dpb * dpb) +gst_v4l2_codec_h264_dec_ensure_bitstream (GstV4l2CodecH264Dec * self) { - GstV4l2CodecH264Dec *self = GST_V4L2_CODEC_H264_DEC (decoder); + if (self->bitstream) + goto done; - /* FIXME base class should not call us if negotiation failed */ - if (!self->sink_allocator) - return FALSE; + self->bitstream = gst_v4l2_codec_allocator_alloc (self->sink_allocator); - /* Ensure we have a bitstream to write into */ if (!self->bitstream) { - self->bitstream = gst_v4l2_codec_allocator_alloc (self->sink_allocator); - - if (!self->bitstream) { - GST_ELEMENT_ERROR (decoder, RESOURCE, NO_SPACE_LEFT, - ("Not enough memory to decode H264 stream."), (NULL)); - return FALSE; - } + GST_ELEMENT_ERROR (self, RESOURCE, NO_SPACE_LEFT, + ("Not enough memory to decode H264 stream."), (NULL)); + return FALSE; + } - if (!gst_memory_map (self->bitstream, &self->bitstream_map, GST_MAP_WRITE)) { - GST_ELEMENT_ERROR (decoder, RESOURCE, WRITE, - ("Could not access bitstream memory for writing"), (NULL)); - g_clear_pointer (&self->bitstream, gst_memory_unref); - return FALSE; - } + if (!gst_memory_map (self->bitstream, &self->bitstream_map, GST_MAP_WRITE)) { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Could not access bitstream memory for writing"), (NULL)); + g_clear_pointer (&self->bitstream, gst_memory_unref); + return FALSE; } +done: /* We use this field to track how much we have written */ self->bitstream_map.size = 0; + return TRUE; +} + +static gboolean +gst_v4l2_codec_h264_dec_start_picture (GstH264Decoder * decoder, + GstH264Picture * picture, GstH264Slice * slice, GstH264Dpb * dpb) +{ + GstV4l2CodecH264Dec *self = GST_V4L2_CODEC_H264_DEC (decoder); + + /* FIXME base class should not call us if negotiation failed */ + if (!self->sink_allocator) + return FALSE; + + if (!gst_v4l2_codec_h264_dec_ensure_bitstream (self)) + return FALSE; + gst_v4l2_codec_h264_dec_fill_pps (self, slice->header.pps); gst_v4l2_codec_h264_dec_fill_scaling_matrix (self, slice->header.pps); gst_v4l2_codec_h264_dec_fill_decoder_params (self, &slice->header, picture, |