rtph265pay: Also immediately send packet if it is a suffix NAL

Immediately send packet if it contains any suffix NAL, this is required
in case they come after the VCL nal to not have to wait until the next frame.
This commit is contained in:
Olivier Crête 2019-06-27 19:47:41 -04:00 committed by Nicolas Dufresne
parent 43e83695fd
commit 061afa33ee
3 changed files with 31 additions and 7 deletions

View file

@ -969,7 +969,7 @@ gst_rtp_h265_pay_reset_bundle (GstRtpH265Pay * rtph265pay)
{
g_clear_pointer (&rtph265pay->bundle, gst_buffer_list_unref);
rtph265pay->bundle_size = 0;
rtph265pay->bundle_contains_vcl = FALSE;
rtph265pay->bundle_contains_vcl_or_suffix = FALSE;
}
static GstFlowReturn
@ -1385,7 +1385,7 @@ gst_rtp_h265_pay_payload_nal_bundle (GstRTPBasePayload * basepayload,
GST_DEBUG_OBJECT (rtph265pay, "creating new AP aggregate");
bundle = rtph265pay->bundle = gst_buffer_list_new ();
bundle_size = rtph265pay->bundle_size = 2;
rtph265pay->bundle_contains_vcl = FALSE;
rtph265pay->bundle_contains_vcl_or_suffix = FALSE;
}
GST_DEBUG_OBJECT (rtph265pay,
@ -1401,8 +1401,10 @@ gst_rtp_h265_pay_payload_nal_bundle (GstRTPBasePayload * basepayload,
ret = GST_FLOW_OK;
/* In H.265, all VCL NAL units are < 32 */
if (nal_type < 32)
rtph265pay->bundle_contains_vcl = TRUE;
if (nal_type < 32 || nal_type == GST_H265_NAL_EOS ||
nal_type == GST_H265_NAL_EOB || nal_type == GST_H265_NAL_SUFFIX_SEI ||
(nal_type >= 45 && nal_type <= 47) || (nal_type >= 56 && nal_type < 63))
rtph265pay->bundle_contains_vcl_or_suffix = TRUE;
if (marker) {
GST_DEBUG_OBJECT (rtph265pay, "sending bundle at marker");
@ -1650,7 +1652,7 @@ gst_rtp_h265_pay_handle_buffer (GstRTPBasePayload * basepayload,
if (ret == GST_FLOW_OK && rtph265pay->bundle_size > 0 &&
rtph265pay->aggregate_mode == GST_RTP_H265_AGGREGATE_ZERO_LATENCY &&
rtph265pay->bundle_contains_vcl) {
rtph265pay->bundle_contains_vcl_or_suffix) {
GST_DEBUG_OBJECT (rtph265pay, "sending bundle at end incoming packet");
ret = gst_rtp_h265_pay_send_bundle (rtph265pay, FALSE);
}

View file

@ -76,7 +76,7 @@ struct _GstRtpH265Pay
/* aggregate buffers with AP */
GstBufferList *bundle;
guint bundle_size;
gboolean bundle_contains_vcl;
gboolean bundle_contains_vcl_or_suffix;
GstRTPH265AggregateMode aggregate_mode;
};

View file

@ -459,6 +459,7 @@ static guint8 h265_idr_slice_2[] = {
0x00, 0x3e, 0x40, 0x92, 0x0c, 0x78
};
GST_START_TEST (test_rtph265pay_two_slices_timestamp)
{
GstHarness *h = gst_harness_new_parse ("rtph265pay timestamp-offset=123");
@ -928,6 +929,11 @@ GST_START_TEST (test_rtph265pay_aggregate_with_discont)
GST_END_TEST;
/* EOS */
static guint8 h265_eos[] = {
0x00, 0x00, 0x00, 0x01, (36 << 1), 0x00
};
GST_START_TEST (test_rtph265pay_aggregate_until_vcl)
{
@ -957,7 +963,6 @@ GST_START_TEST (test_rtph265pay_aggregate_until_vcl)
ret = gst_harness_push (h, buffer);
fail_unless_equals_int (ret, GST_FLOW_OK);
fail_unless_equals_int (gst_harness_buffers_in_queue (h), 1);
buffer = gst_harness_pull (h);
@ -972,6 +977,23 @@ GST_START_TEST (test_rtph265pay_aggregate_until_vcl)
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (buffer);
/* Push EOS now */
buffer = wrap_static_buffer_with_pts (h265_eos, sizeof (h265_eos), 0);
ret = gst_harness_push (h, buffer);
fail_unless_equals_int (ret, GST_FLOW_OK);
fail_unless_equals_int (gst_harness_buffers_in_queue (h), 1);
buffer = gst_harness_pull (h);
fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp));
fail_unless_equals_uint64 (GST_BUFFER_PTS (buffer), 0);
fail_unless_equals_uint64 (gst_rtp_buffer_get_timestamp (&rtp), 123);
fail_unless_equals_int (gst_buffer_get_size (buffer), 12 +
sizeof (h265_eos) - 4);
gst_rtp_buffer_unmap (&rtp);
gst_buffer_unref (buffer);
gst_harness_teardown (h);
}