summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2015-05-23 13:23:22 +0100
committerTim-Philipp Müller <tim@centricular.com>2015-05-25 16:16:42 +0100
commit2aafb3951d5574ce7db0316d9025bd1339b33da1 (patch)
tree82147e7b59651129107b798726549585a4d73a7a
parentd03b9513f1723014549aafdc4f5bba7196882581 (diff)
downloadgstreamer-plugins-good-2aafb3951d5574ce7db0316d9025bd1339b33da1.tar.gz
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.
-rw-r--r--gst/rtp/gstrtpvrawdepay.c33
-rw-r--r--gst/rtp/gstrtpvrawdepay.h2
2 files changed, 19 insertions, 16 deletions
diff --git a/gst/rtp/gstrtpvrawdepay.c b/gst/rtp/gstrtpvrawdepay.c
index 329ea5c41..d9a8310af 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 bf63d5c3f..18ca755d3 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;