From 2aafb3951d5574ce7db0316d9025bd1339b33da1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 23 May 2015 13:23:22 +0100 Subject: [PATCH] rtpvrawdepay: map/unmap output frame only once, not for every input packet Map output buffer after creating it and keep it mapped until we're done with it instead of mapping/unmapping it for every single input buffer. --- gst/rtp/gstrtpvrawdepay.c | 33 ++++++++++++++++++--------------- gst/rtp/gstrtpvrawdepay.h | 2 +- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/gst/rtp/gstrtpvrawdepay.c b/gst/rtp/gstrtpvrawdepay.c index 329ea5c412..d9a8310af4 100644 --- a/gst/rtp/gstrtpvrawdepay.c +++ b/gst/rtp/gstrtpvrawdepay.c @@ -108,6 +108,7 @@ static void gst_rtp_vraw_depay_reset (GstRtpVRawDepay * rtpvrawdepay) { if (rtpvrawdepay->outbuf) { + gst_video_frame_unmap (&rtpvrawdepay->frame); gst_buffer_unref (rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } @@ -324,7 +325,7 @@ gst_rtp_vraw_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) guint cont, ystride, uvstride, pgroup, payload_len; gint width, height, xinc, yinc; GstRTPBuffer rtp = { NULL }; - GstVideoFrame frame; + GstVideoFrame *frame; gboolean marker; GstBuffer *outbuf = NULL; @@ -341,6 +342,7 @@ gst_rtp_vraw_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) GST_LOG_OBJECT (depayload, "new frame with timestamp %u", timestamp); /* new timestamp, flush old buffer and create new output buffer */ if (rtpvrawdepay->outbuf) { + gst_video_frame_unmap (&rtpvrawdepay->frame); gst_rtp_base_depayload_push (depayload, rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } @@ -362,22 +364,26 @@ gst_rtp_vraw_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) /* clear timestamp from alloc... */ GST_BUFFER_TIMESTAMP (outbuf) = -1; + if (!gst_video_frame_map (&rtpvrawdepay->frame, &rtpvrawdepay->vinfo, + outbuf, GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF)) + goto invalid_frame; + rtpvrawdepay->outbuf = outbuf; rtpvrawdepay->timestamp = timestamp; } - if (!gst_video_frame_map (&frame, &rtpvrawdepay->vinfo, rtpvrawdepay->outbuf, - GST_MAP_WRITE)) - goto invalid_frame; + frame = &rtpvrawdepay->frame; + + g_assert (frame->buffer != NULL); /* get pointer and strides of the planes */ - p0 = GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); - yp = GST_VIDEO_FRAME_COMP_DATA (&frame, 0); - up = GST_VIDEO_FRAME_COMP_DATA (&frame, 1); - vp = GST_VIDEO_FRAME_COMP_DATA (&frame, 2); + p0 = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + yp = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + up = GST_VIDEO_FRAME_COMP_DATA (frame, 1); + vp = GST_VIDEO_FRAME_COMP_DATA (frame, 2); - ystride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, 0); - uvstride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, 1); + ystride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + uvstride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 1); pgroup = rtpvrawdepay->pgroup; width = GST_VIDEO_INFO_WIDTH (&rtpvrawdepay->vinfo); @@ -550,12 +556,12 @@ gst_rtp_vraw_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) payload_len -= length; } - gst_video_frame_unmap (&frame); marker = gst_rtp_buffer_get_marker (&rtp); gst_rtp_buffer_unmap (&rtp); if (marker) { GST_LOG_OBJECT (depayload, "marker, flushing frame"); + gst_video_frame_unmap (&rtpvrawdepay->frame); outbuf = rtpvrawdepay->outbuf; rtpvrawdepay->outbuf = NULL; rtpvrawdepay->timestamp = -1; @@ -567,7 +573,6 @@ unknown_sampling: { GST_ELEMENT_ERROR (depayload, STREAM, FORMAT, (NULL), ("unimplemented sampling")); - gst_video_frame_unmap (&frame); gst_rtp_buffer_unmap (&rtp); return NULL; } @@ -580,20 +585,18 @@ alloc_failed: invalid_frame: { GST_ERROR_OBJECT (depayload, "could not map video frame"); - gst_rtp_buffer_unmap (&rtp); + gst_buffer_unref (outbuf); return NULL; } wrong_length: { GST_WARNING_OBJECT (depayload, "length not multiple of pgroup"); - gst_video_frame_unmap (&frame); gst_rtp_buffer_unmap (&rtp); return NULL; } short_packet: { GST_WARNING_OBJECT (depayload, "short packet"); - gst_video_frame_unmap (&frame); gst_rtp_buffer_unmap (&rtp); return NULL; } diff --git a/gst/rtp/gstrtpvrawdepay.h b/gst/rtp/gstrtpvrawdepay.h index bf63d5c3f8..18ca755d38 100644 --- a/gst/rtp/gstrtpvrawdepay.h +++ b/gst/rtp/gstrtpvrawdepay.h @@ -49,9 +49,9 @@ struct _GstRtpVRawDepay GstBufferPool *pool; GstVideoInfo vinfo; + GstVideoFrame frame; GstBuffer *outbuf; guint32 timestamp; - guint outsize; gint pgroup; gint xinc, yinc; -- 2.34.1