#include "gstrtpvrawpay.h"
+#define BUFFER_LISTS_PER_FRAME 10
+
GST_DEBUG_CATEGORY_STATIC (rtpvrawpay_debug);
#define GST_CAT_DEFAULT (rtpvrawpay_debug)
{
GstRtpVRawPay *rtpvrawpay;
GstFlowReturn ret = GST_FLOW_OK;
+ gfloat packets_per_packline;
+ guint pgroups_per_packet;
+ guint packlines_per_list, buffers_per_list;
guint lines_delay; /* after how many packed lines we push out a buffer list */
guint last_line; /* last pack line number we pushed out a buffer list */
guint line, offset;
xinc = rtpvrawpay->xinc;
/* after how many packed lines we push out a buffer list */
- lines_delay = GST_ROUND_UP_4 (height / 10);
+ lines_delay = GST_ROUND_UP_4 (height / BUFFER_LISTS_PER_FRAME);
+
+ /* calculate how many buffers we expect to store in a single buffer list */
+ pgroups_per_packet = (mtu - (12 + 14)) / pgroup;
+ packets_per_packline = width / (xinc * pgroups_per_packet * 1.0);
+ packlines_per_list = height / (yinc * BUFFER_LISTS_PER_FRAME);
+ buffers_per_list = packlines_per_list * packets_per_packline;
+ buffers_per_list = GST_ROUND_UP_8 (buffers_per_list);
fields = 1 + interlaced;
offset = 0;
last_line = 0;
- list = gst_buffer_list_new ();
+ list = gst_buffer_list_new_sized (buffers_per_list);
/* write all lines */
while (line < height) {
ret = gst_rtp_base_payload_push_list (payload, list);
list = NULL;
if (!complete)
- list = gst_buffer_list_new ();
+ list = gst_buffer_list_new_sized (buffers_per_list);
last_line = pack_line;
}
}