rtph265depay: store negotiated output format as enum
[platform/upstream/gst-plugins-good.git] / gst / rtp / gstrtph265depay.c
1 /* GStreamer
2  * Copyright (C) <2006> Wim Taymans <wim.taymans@gmail.com>
3  * Copyright (C) <2014> Jurgen Slowack <jurgenslowack@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #  include "config.h"
23 #endif
24
25 #include <stdio.h>
26 #include <string.h>
27
28 #include <gst/base/gstbitreader.h>
29 #include <gst/rtp/gstrtpbuffer.h>
30 #include <gst/video/video.h>
31 #include "gstrtph265depay.h"
32 #include "gstrtputils.h"
33
34 GST_DEBUG_CATEGORY_STATIC (rtph265depay_debug);
35 #define GST_CAT_DEFAULT (rtph265depay_debug)
36
37 /* This is what we'll default to when downstream hasn't
38  * expressed a restriction or preference via caps */
39 #define DEFAULT_STREAM_FORMAT GST_H265_STREAM_FORMAT_BYTESTREAM
40 #define DEFAULT_ACCESS_UNIT   FALSE
41
42 /* 3 zero bytes syncword */
43 static const guint8 sync_bytes[] = { 0, 0, 0, 1 };
44
45 static GstStaticPadTemplate gst_rtp_h265_depay_src_template =
46     GST_STATIC_PAD_TEMPLATE ("src",
47     GST_PAD_SRC,
48     GST_PAD_ALWAYS,
49     GST_STATIC_CAPS
50     ("video/x-h265, stream-format=(string)hvc1, alignment=(string)au; "
51         /* FIXME: hev1 format is not supported yet */
52         /* "video/x-h265, "
53            "stream-format = (string) hev1, alignment = (string) au; " */
54         "video/x-h265, "
55         "stream-format = (string) byte-stream, alignment = (string) { nal, au }")
56     );
57
58 static GstStaticPadTemplate gst_rtp_h265_depay_sink_template =
59 GST_STATIC_PAD_TEMPLATE ("sink",
60     GST_PAD_SINK,
61     GST_PAD_ALWAYS,
62     GST_STATIC_CAPS ("application/x-rtp, "
63         "media = (string) \"video\", "
64         "clock-rate = (int) 90000, " "encoding-name = (string) \"H265\"")
65         /** optional parameters **/
66     /* "profile-space = (int) [ 0, 3 ], " */
67     /* "profile-id = (int) [ 0, 31 ], " */
68     /* "tier-flag = (int) [ 0, 1 ], " */
69     /* "level-id = (int) [ 0, 255 ], " */
70     /* "interop-constraints = (string) ANY, " */
71     /* "profile-compatibility-indicator = (string) ANY, " */
72     /* "sprop-sub-layer-id = (int) [ 0, 6 ], " */
73     /* "recv-sub-layer-id = (int) [ 0, 6 ], " */
74     /* "max-recv-level-id = (int) [ 0, 255 ], " */
75     /* "tx-mode = (string) {MST , SST}, " */
76     /* "sprop-vps = (string) ANY, " */
77     /* "sprop-sps = (string) ANY, " */
78     /* "sprop-pps = (string) ANY, " */
79     /* "sprop-sei = (string) ANY, " */
80     /* "max-lsr = (int) ANY, " *//* MUST be in the range of MaxLumaSR to 16 * MaxLumaSR, inclusive */
81     /* "max-lps = (int) ANY, " *//* MUST be in the range of MaxLumaPS to 16 * MaxLumaPS, inclusive */
82     /* "max-cpb = (int) ANY, " *//* MUST be in the range of MaxCPB to 16 * MaxCPB, inclusive */
83     /* "max-dpb = (int) [1, 16], " */
84     /* "max-br = (int) ANY, " *//* MUST be in the range of MaxBR to 16 * MaxBR, inclusive, for the highest level */
85     /* "max-tr = (int) ANY, " *//* MUST be in the range of MaxTileRows to 16 * MaxTileRows, inclusive, for the highest level */
86     /* "max-tc = (int) ANY, " *//* MUST be in the range of MaxTileCols to 16 * MaxTileCols, inclusive, for the highest level */
87     /* "max-fps = (int) ANY, " */
88     /* "sprop-max-don-diff = (int) [0, 32767], " */
89     /* "sprop-depack-buf-nalus = (int) [0, 32767], " */
90     /* "sprop-depack-buf-nalus = (int) [0, 4294967295], " */
91     /* "depack-buf-cap = (int) [1, 4294967295], " */
92     /* "sprop-segmentation-id = (int) [0, 3], " */
93     /* "sprop-spatial-segmentation-idc = (string) ANY, " */
94     /* "dec-parallel-cap = (string) ANY, " */
95     );
96
97 #define gst_rtp_h265_depay_parent_class parent_class
98 G_DEFINE_TYPE (GstRtpH265Depay, gst_rtp_h265_depay,
99     GST_TYPE_RTP_BASE_DEPAYLOAD);
100
101 static void gst_rtp_h265_depay_finalize (GObject * object);
102
103 static GstStateChangeReturn gst_rtp_h265_depay_change_state (GstElement *
104     element, GstStateChange transition);
105
106 static GstBuffer *gst_rtp_h265_depay_process (GstRTPBaseDepayload * depayload,
107     GstRTPBuffer * rtp);
108 static gboolean gst_rtp_h265_depay_setcaps (GstRTPBaseDepayload * filter,
109     GstCaps * caps);
110 static gboolean gst_rtp_h265_depay_handle_event (GstRTPBaseDepayload * depay,
111     GstEvent * event);
112
113 static void
114 gst_rtp_h265_depay_class_init (GstRtpH265DepayClass * klass)
115 {
116   GObjectClass *gobject_class;
117   GstElementClass *gstelement_class;
118   GstRTPBaseDepayloadClass *gstrtpbasedepayload_class;
119
120   gobject_class = (GObjectClass *) klass;
121   gstelement_class = (GstElementClass *) klass;
122   gstrtpbasedepayload_class = (GstRTPBaseDepayloadClass *) klass;
123
124   gobject_class->finalize = gst_rtp_h265_depay_finalize;
125
126   gst_element_class_add_static_pad_template (gstelement_class,
127       &gst_rtp_h265_depay_src_template);
128   gst_element_class_add_static_pad_template (gstelement_class,
129       &gst_rtp_h265_depay_sink_template);
130
131   gst_element_class_set_static_metadata (gstelement_class,
132       "RTP H265 depayloader", "Codec/Depayloader/Network/RTP",
133       "Extracts H265 video from RTP packets (RFC 7798)",
134       "Jurgen Slowack <jurgenslowack@gmail.com>");
135   gstelement_class->change_state = gst_rtp_h265_depay_change_state;
136
137   gstrtpbasedepayload_class->process_rtp_packet = gst_rtp_h265_depay_process;
138   gstrtpbasedepayload_class->set_caps = gst_rtp_h265_depay_setcaps;
139   gstrtpbasedepayload_class->handle_event = gst_rtp_h265_depay_handle_event;
140 }
141
142 static void
143 gst_rtp_h265_depay_init (GstRtpH265Depay * rtph265depay)
144 {
145   rtph265depay->adapter = gst_adapter_new ();
146   rtph265depay->picture_adapter = gst_adapter_new ();
147   rtph265depay->output_format = DEFAULT_STREAM_FORMAT;
148   rtph265depay->byte_stream =
149       (DEFAULT_STREAM_FORMAT == GST_H265_STREAM_FORMAT_BYTESTREAM);
150   rtph265depay->stream_format = NULL;
151   rtph265depay->merge = DEFAULT_ACCESS_UNIT;
152   rtph265depay->vps = g_ptr_array_new_with_free_func (
153       (GDestroyNotify) gst_buffer_unref);
154   rtph265depay->sps = g_ptr_array_new_with_free_func (
155       (GDestroyNotify) gst_buffer_unref);
156   rtph265depay->pps = g_ptr_array_new_with_free_func (
157       (GDestroyNotify) gst_buffer_unref);
158 }
159
160 static void
161 gst_rtp_h265_depay_reset (GstRtpH265Depay * rtph265depay, gboolean hard)
162 {
163   gst_adapter_clear (rtph265depay->adapter);
164   rtph265depay->wait_start = TRUE;
165   gst_adapter_clear (rtph265depay->picture_adapter);
166   rtph265depay->picture_start = FALSE;
167   rtph265depay->last_keyframe = FALSE;
168   rtph265depay->last_ts = 0;
169   rtph265depay->current_fu_type = 0;
170   rtph265depay->new_codec_data = FALSE;
171   g_ptr_array_set_size (rtph265depay->vps, 0);
172   g_ptr_array_set_size (rtph265depay->sps, 0);
173   g_ptr_array_set_size (rtph265depay->pps, 0);
174
175   if (hard) {
176     if (rtph265depay->allocator != NULL) {
177       gst_object_unref (rtph265depay->allocator);
178       rtph265depay->allocator = NULL;
179     }
180     gst_allocation_params_init (&rtph265depay->params);
181   }
182 }
183
184 static void
185 gst_rtp_h265_depay_finalize (GObject * object)
186 {
187   GstRtpH265Depay *rtph265depay;
188
189   rtph265depay = GST_RTP_H265_DEPAY (object);
190
191   if (rtph265depay->codec_data)
192     gst_buffer_unref (rtph265depay->codec_data);
193
194   g_object_unref (rtph265depay->adapter);
195   g_object_unref (rtph265depay->picture_adapter);
196
197   g_ptr_array_free (rtph265depay->vps, TRUE);
198   g_ptr_array_free (rtph265depay->sps, TRUE);
199   g_ptr_array_free (rtph265depay->pps, TRUE);
200
201   G_OBJECT_CLASS (parent_class)->finalize (object);
202 }
203
204 static inline const gchar *
205 stream_format_get_nick (GstH265StreamFormat fmt)
206 {
207   switch (fmt) {
208     case GST_H265_STREAM_FORMAT_BYTESTREAM:
209       return "byte-stream";
210     case GST_H265_STREAM_FORMAT_HVC1:
211       return "hvc1";
212     case GST_H265_STREAM_FORMAT_HEV1:
213       return "hev1";
214     default:
215       break;
216   }
217   return "unknown";
218 }
219
220 static void
221 gst_rtp_h265_depay_negotiate (GstRtpH265Depay * rtph265depay)
222 {
223   GstH265StreamFormat stream_format = GST_H265_STREAM_FORMAT_UNKNOWN;
224   GstCaps *caps;
225   gint merge = -1;
226
227   caps =
228       gst_pad_get_allowed_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay));
229
230   GST_DEBUG_OBJECT (rtph265depay, "allowed caps: %" GST_PTR_FORMAT, caps);
231
232   if (caps) {
233     if (gst_caps_get_size (caps) > 0) {
234       GstStructure *s = gst_caps_get_structure (caps, 0);
235       const gchar *str = NULL;
236
237       if ((str = gst_structure_get_string (s, "stream-format"))) {
238         rtph265depay->stream_format = g_intern_string (str);
239
240         if (strcmp (str, "hev1") == 0) {
241           stream_format = GST_H265_STREAM_FORMAT_HEV1;
242         } else if (strcmp (str, "hvc1") == 0) {
243           stream_format = GST_H265_STREAM_FORMAT_HVC1;
244         } else if (strcmp (str, "byte-stream") == 0) {
245           stream_format = GST_H265_STREAM_FORMAT_BYTESTREAM;
246         } else {
247           GST_DEBUG_OBJECT (rtph265depay, "unknown stream-format: %s", str);
248         }
249       }
250
251       if ((str = gst_structure_get_string (s, "alignment"))) {
252         if (strcmp (str, "au") == 0) {
253           merge = TRUE;
254         } else if (strcmp (str, "nal") == 0) {
255           merge = FALSE;
256         } else {
257           GST_DEBUG_OBJECT (rtph265depay, "unknown alignment: %s", str);
258         }
259       }
260     }
261     gst_caps_unref (caps);
262   }
263
264   if (stream_format != GST_H265_STREAM_FORMAT_UNKNOWN) {
265     GST_DEBUG_OBJECT (rtph265depay, "downstream wants stream-format %s",
266         stream_format_get_nick (stream_format));
267     rtph265depay->output_format = stream_format;
268   } else {
269     GST_DEBUG_OBJECT (rtph265depay, "defaulting to output stream-format %s",
270         stream_format_get_nick (DEFAULT_STREAM_FORMAT));
271     rtph265depay->stream_format =
272         stream_format_get_nick (DEFAULT_STREAM_FORMAT);
273     rtph265depay->output_format = DEFAULT_STREAM_FORMAT;
274   }
275   rtph265depay->byte_stream =
276       (rtph265depay->output_format == GST_H265_STREAM_FORMAT_BYTESTREAM);
277
278   if (merge != -1) {
279     GST_DEBUG_OBJECT (rtph265depay, "downstream requires merge %d", merge);
280     rtph265depay->merge = merge;
281   } else {
282     GST_DEBUG_OBJECT (rtph265depay, "defaulting to merge %d",
283         DEFAULT_ACCESS_UNIT);
284     rtph265depay->merge = DEFAULT_ACCESS_UNIT;
285   }
286 }
287
288 static gboolean
289 parse_sps (GstMapInfo * map, guint32 * sps_id)
290 {                               /* To parse seq_parameter_set_id */
291   GstBitReader br = GST_BIT_READER_INIT (map->data + 15,
292       map->size - 15);
293
294   GST_MEMDUMP ("SPS", map->data, map->size);
295
296   if (map->size < 16)
297     return FALSE;
298
299   if (!gst_rtp_read_golomb (&br, sps_id))
300     return FALSE;
301
302   return TRUE;
303 }
304
305 static gboolean
306 parse_pps (GstMapInfo * map, guint32 * sps_id, guint32 * pps_id)
307 {                               /* To parse picture_parameter_set_id */
308   GstBitReader br = GST_BIT_READER_INIT (map->data + 2,
309       map->size - 2);
310
311   GST_MEMDUMP ("PPS", map->data, map->size);
312
313   if (map->size < 3)
314     return FALSE;
315
316   if (!gst_rtp_read_golomb (&br, pps_id))
317     return FALSE;
318   if (!gst_rtp_read_golomb (&br, sps_id))
319     return FALSE;
320
321   return TRUE;
322 }
323
324 static gboolean
325 gst_rtp_h265_depay_set_output_caps (GstRtpH265Depay * rtph265depay,
326     GstCaps * caps)
327 {
328   GstAllocationParams params;
329   GstAllocator *allocator = NULL;
330   GstPad *srcpad;
331   gboolean res;
332
333   gst_allocation_params_init (&params);
334
335   srcpad = GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay);
336
337   res = gst_pad_set_caps (srcpad, caps);
338
339   if (res) {
340     GstQuery *query;
341
342     query = gst_query_new_allocation (caps, TRUE);
343     if (!gst_pad_peer_query (srcpad, query)) {
344       GST_DEBUG_OBJECT (rtph265depay, "downstream ALLOCATION query failed");
345     }
346
347     if (gst_query_get_n_allocation_params (query) > 0) {
348       gst_query_parse_nth_allocation_param (query, 0, &allocator, &params);
349     }
350
351     gst_query_unref (query);
352   }
353
354   if (rtph265depay->allocator)
355     gst_object_unref (rtph265depay->allocator);
356
357   rtph265depay->allocator = allocator;
358   rtph265depay->params = params;
359
360   return res;
361 }
362
363 static gboolean
364 gst_rtp_h265_set_src_caps (GstRtpH265Depay * rtph265depay)
365 {
366   gboolean res, update_caps;
367   GstCaps *old_caps;
368   GstCaps *srccaps;
369   GstPad *srcpad;
370
371   if (!rtph265depay->byte_stream &&
372       (!rtph265depay->new_codec_data ||
373           rtph265depay->vps->len == 0 || rtph265depay->sps->len == 0
374           || rtph265depay->pps->len == 0))
375     return TRUE;
376
377   srccaps = gst_caps_new_simple ("video/x-h265",
378       "stream-format", G_TYPE_STRING, rtph265depay->stream_format,
379       "alignment", G_TYPE_STRING, rtph265depay->merge ? "au" : "nal", NULL);
380
381   if (!rtph265depay->byte_stream) {
382     GstBuffer *codec_data;
383     gint i = 0;
384     gint len;
385     guint num_vps = rtph265depay->vps->len;
386     guint num_sps = rtph265depay->sps->len;
387     guint num_pps = rtph265depay->pps->len;
388     GstMapInfo map, nalmap;
389     guint8 *data;
390     guint8 num_arrays = 0;
391     guint new_size;
392     GstBitReader br;
393     guint32 tmp;
394     guint8 tmp8 = 0;
395     guint32 max_sub_layers_minus1, temporal_id_nesting_flag, chroma_format_idc,
396         bit_depth_luma_minus8, bit_depth_chroma_minus8,
397         min_spatial_segmentation_idc;
398
399     /* Fixme: Current implementation is not embedding SEI in codec_data */
400
401     if (num_sps == 0)
402       return FALSE;
403
404     /* start with 23 bytes header */
405     len = 23;
406
407     num_arrays = (num_vps > 0) + (num_sps > 0) + (num_pps > 0);
408     len += 3 * num_arrays;
409
410     /* add size of vps, sps & pps */
411     for (i = 0; i < num_vps; i++)
412       len += 2 + gst_buffer_get_size (g_ptr_array_index (rtph265depay->vps, i));
413     for (i = 0; i < num_sps; i++)
414       len += 2 + gst_buffer_get_size (g_ptr_array_index (rtph265depay->sps, i));
415     for (i = 0; i < num_pps; i++)
416       len += 2 + gst_buffer_get_size (g_ptr_array_index (rtph265depay->pps, i));
417
418     GST_DEBUG_OBJECT (rtph265depay,
419         "constructing codec_data: num_vps =%d num_sps=%d, num_pps=%d", num_vps,
420         num_sps, num_pps);
421
422     codec_data = gst_buffer_new_and_alloc (len);
423     gst_buffer_map (codec_data, &map, GST_MAP_READWRITE);
424     data = map.data;
425
426     memset (data, 0, map.size);
427
428     /* Parsing sps to get the info required further on */
429
430     gst_buffer_map (g_ptr_array_index (rtph265depay->sps, 0), &nalmap,
431         GST_MAP_READ);
432
433     max_sub_layers_minus1 = ((nalmap.data[2]) >> 1) & 0x07;
434     temporal_id_nesting_flag = nalmap.data[2] & 0x01;
435
436     gst_bit_reader_init (&br, nalmap.data + 15, nalmap.size - 15);
437
438     gst_rtp_read_golomb (&br, &tmp);    /* sps_seq_parameter_set_id */
439     gst_rtp_read_golomb (&br, &chroma_format_idc);      /* chroma_format_idc */
440
441     if (chroma_format_idc == 3)
442
443       gst_bit_reader_get_bits_uint8 (&br, &tmp8, 1);    /* separate_colour_plane_flag */
444
445     gst_rtp_read_golomb (&br, &tmp);    /* pic_width_in_luma_samples */
446     gst_rtp_read_golomb (&br, &tmp);    /* pic_height_in_luma_samples */
447
448     gst_bit_reader_get_bits_uint8 (&br, &tmp8, 1);      /* conformance_window_flag */
449     if (tmp8) {
450       gst_rtp_read_golomb (&br, &tmp);  /* conf_win_left_offset */
451       gst_rtp_read_golomb (&br, &tmp);  /* conf_win_right_offset */
452       gst_rtp_read_golomb (&br, &tmp);  /* conf_win_top_offset */
453       gst_rtp_read_golomb (&br, &tmp);  /* conf_win_bottom_offset */
454     }
455
456     gst_rtp_read_golomb (&br, &bit_depth_luma_minus8);  /* bit_depth_luma_minus8 */
457     gst_rtp_read_golomb (&br, &bit_depth_chroma_minus8);        /* bit_depth_chroma_minus8 */
458
459     GST_DEBUG_OBJECT (rtph265depay,
460         "Ignoring min_spatial_segmentation for now (assuming zero)");
461
462     min_spatial_segmentation_idc = 0;   /* NOTE - we ignore this for now, but in a perfect world, we should continue parsing to obtain the real value */
463
464     gst_buffer_unmap (g_ptr_array_index (rtph265depay->sps, 0), &nalmap);
465
466     /* HEVCDecoderConfigurationVersion = 1 */
467     data[0] = 1;
468
469     /* Copy from profile_tier_level (Rec. ITU-T H.265 (04/2013) section 7.3.3
470      *
471      * profile_space | tier_flat | profile_idc |
472      * profile_compatibility_flags | constraint_indicator_flags |
473      * level_idc | progressive_source_flag | interlaced_source_flag
474      * non_packed_constraint_flag | frame_only_constraint_flag
475      * reserved_zero_44bits | level_idc */
476     gst_buffer_map (g_ptr_array_index (rtph265depay->sps, 0), &nalmap,
477         GST_MAP_READ);
478     for (i = 0; i < 12; i++)
479       data[i + 1] = nalmap.data[i];
480     gst_buffer_unmap (g_ptr_array_index (rtph265depay->sps, 0), &nalmap);
481
482     /* min_spatial_segmentation_idc */
483     GST_WRITE_UINT16_BE (data + 13, min_spatial_segmentation_idc);
484     data[13] |= 0xf0;
485     data[15] = 0xfc;            /* keeping parrallelismType as zero (unknown) */
486     data[16] = 0xfc | chroma_format_idc;
487     data[17] = 0xf8 | bit_depth_luma_minus8;
488     data[18] = 0xf8 | bit_depth_chroma_minus8;
489     data[19] = 0x00;            /* keep avgFrameRate as unspecified */
490     data[20] = 0x00;            /* keep avgFrameRate as unspecified */
491     /* constFrameRate(2 bits): 0, stream may or may not be of constant framerate
492      * numTemporalLayers (3 bits): number of temporal layers, value from SPS
493      * TemporalIdNested (1 bit): sps_temporal_id_nesting_flag from SPS
494      * lengthSizeMinusOne (2 bits): plus 1 indicates the length of the NALUnitLength */
495     /* we always output NALs with 4-byte nal unit length markers (or sync code) */
496     data[21] = rtph265depay->byte_stream ? 0x00 : 0x03;
497     data[21] |= ((max_sub_layers_minus1 + 1) << 3);
498     data[21] |= (temporal_id_nesting_flag << 2);
499     GST_WRITE_UINT8 (data + 22, num_arrays);    /* numOfArrays */
500
501     data += 23;
502
503     /* copy all VPS */
504     if (num_vps > 0) {
505       /* array_completeness | reserved_zero bit | nal_unit_type */
506       data[0] = 0x00 | 0x20;
507       data++;
508
509       GST_WRITE_UINT16_BE (data, num_vps);
510       data += 2;
511
512       for (i = 0; i < num_vps; i++) {
513         gsize nal_size =
514             gst_buffer_get_size (g_ptr_array_index (rtph265depay->vps, i));
515         GST_WRITE_UINT16_BE (data, nal_size);
516         gst_buffer_extract (g_ptr_array_index (rtph265depay->vps, i), 0,
517             data + 2, nal_size);
518         data += 2 + nal_size;
519         GST_DEBUG_OBJECT (rtph265depay, "Copied VPS %d of length %u", i,
520             (guint) nal_size);
521       }
522     }
523
524     /* copy all SPS */
525     if (num_sps > 0) {
526       /* array_completeness | reserved_zero bit | nal_unit_type */
527       data[0] = 0x00 | 0x21;
528       data++;
529
530       GST_WRITE_UINT16_BE (data, num_sps);
531       data += 2;
532
533       for (i = 0; i < num_sps; i++) {
534         gsize nal_size =
535             gst_buffer_get_size (g_ptr_array_index (rtph265depay->sps, i));
536         GST_WRITE_UINT16_BE (data, nal_size);
537         gst_buffer_extract (g_ptr_array_index (rtph265depay->sps, i), 0,
538             data + 2, nal_size);
539         data += 2 + nal_size;
540         GST_DEBUG_OBJECT (rtph265depay, "Copied SPS %d of length %u", i,
541             (guint) nal_size);
542       }
543     }
544
545     /* copy all PPS */
546     if (num_pps > 0) {
547       /* array_completeness | reserved_zero bit | nal_unit_type */
548       data[0] = 0x00 | 0x22;
549       data++;
550
551       GST_WRITE_UINT16_BE (data, num_pps);
552       data += 2;
553
554       for (i = 0; i < num_pps; i++) {
555         gsize nal_size =
556             gst_buffer_get_size (g_ptr_array_index (rtph265depay->pps, i));
557         GST_WRITE_UINT16_BE (data, nal_size);
558         gst_buffer_extract (g_ptr_array_index (rtph265depay->pps, i), 0,
559             data + 2, nal_size);
560         data += 2 + nal_size;
561         GST_DEBUG_OBJECT (rtph265depay, "Copied PPS %d of length %u", i,
562             (guint) nal_size);
563       }
564     }
565
566     new_size = data - map.data;
567     gst_buffer_unmap (codec_data, &map);
568     gst_buffer_set_size (codec_data, new_size);
569
570     gst_caps_set_simple (srccaps,
571         "codec_data", GST_TYPE_BUFFER, codec_data, NULL);
572     gst_buffer_unref (codec_data);
573   }
574
575   srcpad = GST_RTP_BASE_DEPAYLOAD_SRCPAD (rtph265depay);
576
577   old_caps = gst_pad_get_current_caps (srcpad);
578   if (old_caps != NULL) {
579
580     /* Only update the caps if they are not equal. For
581      * AVC we don't update caps if only the codec_data
582      * changes. This is the same behaviour as in h264parse
583      * and gstrtph264depay
584      */
585     if (rtph265depay->byte_stream) {
586       update_caps = !gst_caps_is_equal (srccaps, old_caps);
587     } else {
588       GstCaps *tmp_caps = gst_caps_copy (srccaps);
589       GstStructure *old_s, *tmp_s;
590
591       old_s = gst_caps_get_structure (old_caps, 0);
592       tmp_s = gst_caps_get_structure (tmp_caps, 0);
593       if (gst_structure_has_field (old_s, "codec_data"))
594         gst_structure_set_value (tmp_s, "codec_data",
595             gst_structure_get_value (old_s, "codec_data"));
596
597       update_caps = !gst_caps_is_equal (old_caps, tmp_caps);
598       gst_caps_unref (tmp_caps);
599     }
600     gst_caps_unref (old_caps);
601   } else {
602     update_caps = TRUE;
603   }
604
605   if (update_caps) {
606     res = gst_rtp_h265_depay_set_output_caps (rtph265depay, srccaps);
607   } else {
608     res = TRUE;
609   }
610
611   gst_caps_unref (srccaps);
612
613   /* Insert SPS and PPS into the stream on next opportunity */
614   if (rtph265depay->sps->len > 0 || rtph265depay->pps->len > 0) {
615     gint i;
616     GstBuffer *codec_data;
617     GstMapInfo map;
618     guint8 *data;
619     guint len = 0;
620
621     for (i = 0; i < rtph265depay->sps->len; i++) {
622       len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph265depay->sps, i));
623     }
624
625     for (i = 0; i < rtph265depay->pps->len; i++) {
626       len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph265depay->pps, i));
627     }
628
629     codec_data = gst_buffer_new_and_alloc (len);
630     gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
631     data = map.data;
632
633     for (i = 0; i < rtph265depay->sps->len; i++) {
634       GstBuffer *sps_buf = g_ptr_array_index (rtph265depay->sps, i);
635       guint sps_size = gst_buffer_get_size (sps_buf);
636
637       if (rtph265depay->byte_stream)
638         memcpy (data, sync_bytes, sizeof (sync_bytes));
639       else
640         GST_WRITE_UINT32_BE (data, sps_size);
641       gst_buffer_extract (sps_buf, 0, data + 4, -1);
642       data += 4 + sps_size;
643     }
644
645     for (i = 0; i < rtph265depay->pps->len; i++) {
646       GstBuffer *pps_buf = g_ptr_array_index (rtph265depay->pps, i);
647       guint pps_size = gst_buffer_get_size (pps_buf);
648
649       if (rtph265depay->byte_stream)
650         memcpy (data, sync_bytes, sizeof (sync_bytes));
651       else
652         GST_WRITE_UINT32_BE (data, pps_size);
653       gst_buffer_extract (pps_buf, 0, data + 4, -1);
654       data += 4 + pps_size;
655     }
656
657     gst_buffer_unmap (codec_data, &map);
658     if (rtph265depay->codec_data)
659       gst_buffer_unref (rtph265depay->codec_data);
660     rtph265depay->codec_data = codec_data;
661   }
662
663   if (res)
664     rtph265depay->new_codec_data = FALSE;
665
666   return res;
667 }
668
669 gboolean
670 gst_rtp_h265_add_vps_sps_pps (GstElement * rtph265, GPtrArray * vps_array,
671     GPtrArray * sps_array, GPtrArray * pps_array, GstBuffer * nal)
672 {
673   GstMapInfo map;
674   guchar type;
675   guint i;
676
677   gst_buffer_map (nal, &map, GST_MAP_READ);
678
679   type = (map.data[0] >> 1) & 0x3f;
680
681   if (type == GST_H265_VPS_NUT) {
682     guint32 vps_id = (map.data[2] >> 4) & 0x0f;
683
684     for (i = 0; i < vps_array->len; i++) {
685       GstBuffer *vps = g_ptr_array_index (vps_array, i);
686       GstMapInfo vpsmap;
687       guint32 tmp_vps_id;
688
689       gst_buffer_map (vps, &vpsmap, GST_MAP_READ);
690       tmp_vps_id = (vpsmap.data[2] >> 4) & 0x0f;
691
692       if (vps_id == tmp_vps_id) {
693         if (map.size == vpsmap.size &&
694             memcmp (map.data, vpsmap.data, vpsmap.size) == 0) {
695           GST_LOG_OBJECT (rtph265, "Unchanged VPS %u, not updating", vps_id);
696           gst_buffer_unmap (vps, &vpsmap);
697           goto drop;
698         } else {
699           gst_buffer_unmap (vps, &vpsmap);
700           g_ptr_array_remove_index_fast (vps_array, i);
701           g_ptr_array_add (vps_array, nal);
702           GST_LOG_OBJECT (rtph265, "Modified VPS %u, replacing", vps_id);
703           goto done;
704         }
705       }
706       gst_buffer_unmap (vps, &vpsmap);
707     }
708     GST_LOG_OBJECT (rtph265, "Adding new VPS %u", vps_id);
709     g_ptr_array_add (vps_array, nal);
710   } else if (type == GST_H265_SPS_NUT) {
711     guint32 sps_id;
712
713     if (!parse_sps (&map, &sps_id)) {
714       GST_WARNING_OBJECT (rtph265, "Invalid SPS,"
715           " can't parse seq_parameter_set_id");
716       goto drop;
717     }
718
719     for (i = 0; i < sps_array->len; i++) {
720       GstBuffer *sps = g_ptr_array_index (sps_array, i);
721       GstMapInfo spsmap;
722       guint32 tmp_sps_id;
723
724       gst_buffer_map (sps, &spsmap, GST_MAP_READ);
725       parse_sps (&spsmap, &tmp_sps_id);
726
727       if (sps_id == tmp_sps_id) {
728         if (map.size == spsmap.size &&
729             memcmp (map.data, spsmap.data, spsmap.size) == 0) {
730           GST_LOG_OBJECT (rtph265, "Unchanged SPS %u, not updating", sps_id);
731           gst_buffer_unmap (sps, &spsmap);
732           goto drop;
733         } else {
734           gst_buffer_unmap (sps, &spsmap);
735           g_ptr_array_remove_index_fast (sps_array, i);
736           g_ptr_array_add (sps_array, nal);
737           GST_LOG_OBJECT (rtph265, "Modified SPS %u, replacing", sps_id);
738           goto done;
739         }
740       }
741       gst_buffer_unmap (sps, &spsmap);
742     }
743     GST_LOG_OBJECT (rtph265, "Adding new SPS %u", sps_id);
744     g_ptr_array_add (sps_array, nal);
745   } else if (type == GST_H265_PPS_NUT) {
746     guint32 sps_id;
747     guint32 pps_id;
748
749     if (!parse_pps (&map, &sps_id, &pps_id)) {
750       GST_WARNING_OBJECT (rtph265, "Invalid PPS,"
751           " can't parse seq_parameter_set_id or pic_parameter_set_id");
752       goto drop;
753     }
754
755     for (i = 0; i < pps_array->len; i++) {
756       GstBuffer *pps = g_ptr_array_index (pps_array, i);
757       GstMapInfo ppsmap;
758       guint32 tmp_sps_id;
759       guint32 tmp_pps_id;
760
761
762       gst_buffer_map (pps, &ppsmap, GST_MAP_READ);
763       parse_pps (&ppsmap, &tmp_sps_id, &tmp_pps_id);
764
765       if (pps_id == tmp_pps_id) {
766         if (map.size == ppsmap.size &&
767             memcmp (map.data, ppsmap.data, ppsmap.size) == 0) {
768           GST_LOG_OBJECT (rtph265, "Unchanged PPS %u:%u, not updating", sps_id,
769               pps_id);
770           gst_buffer_unmap (pps, &ppsmap);
771           goto drop;
772         } else {
773           gst_buffer_unmap (pps, &ppsmap);
774           g_ptr_array_remove_index_fast (pps_array, i);
775           g_ptr_array_add (pps_array, nal);
776           GST_LOG_OBJECT (rtph265, "Modified PPS %u:%u, replacing",
777               sps_id, pps_id);
778           goto done;
779         }
780       }
781       gst_buffer_unmap (pps, &ppsmap);
782     }
783     GST_LOG_OBJECT (rtph265, "Adding new PPS %u:%i", sps_id, pps_id);
784     g_ptr_array_add (pps_array, nal);
785   } else {
786     goto drop;
787   }
788
789 done:
790   gst_buffer_unmap (nal, &map);
791
792   return TRUE;
793
794 drop:
795   gst_buffer_unmap (nal, &map);
796   gst_buffer_unref (nal);
797
798   return FALSE;
799 }
800
801
802 static void
803 gst_rtp_h265_depay_add_vps_sps_pps (GstRtpH265Depay * rtph265depay,
804     GstBuffer * nal)
805 {
806   if (gst_rtp_h265_add_vps_sps_pps (GST_ELEMENT (rtph265depay),
807           rtph265depay->vps, rtph265depay->sps, rtph265depay->pps, nal))
808     rtph265depay->new_codec_data = TRUE;
809 }
810
811 static gboolean
812 gst_rtp_h265_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps)
813 {
814   gint clock_rate;
815   GstStructure *structure = gst_caps_get_structure (caps, 0);
816   GstRtpH265Depay *rtph265depay;
817   const gchar *vps;
818   const gchar *sps;
819   const gchar *pps;
820   gchar *ps;
821   GstMapInfo map;
822   guint8 *ptr;
823
824   rtph265depay = GST_RTP_H265_DEPAY (depayload);
825
826   if (!gst_structure_get_int (structure, "clock-rate", &clock_rate))
827     clock_rate = 90000;
828   depayload->clock_rate = clock_rate;
829
830   /* Base64 encoded, comma separated config NALs */
831   vps = gst_structure_get_string (structure, "sprop-vps");
832   sps = gst_structure_get_string (structure, "sprop-sps");
833   pps = gst_structure_get_string (structure, "sprop-pps");
834   if (vps == NULL || sps == NULL || pps == NULL) {
835     ps = NULL;
836   } else {
837     ps = g_strdup_printf ("%s,%s,%s", vps, sps, pps);
838   }
839
840   /* negotiate with downstream w.r.t. output format and alignment */
841   gst_rtp_h265_depay_negotiate (rtph265depay);
842
843   if (rtph265depay->byte_stream && ps != NULL) {
844     /* for bytestream we only need the parameter sets but we don't error out
845      * when they are not there, we assume they are in the stream. */
846     gchar **params;
847     GstBuffer *codec_data;
848     guint len, total;
849     gint i;
850
851     params = g_strsplit (ps, ",", 0);
852
853     /* count total number of bytes in base64. Also include the sync bytes in
854      * front of the params. */
855     len = 0;
856     for (i = 0; params[i]; i++) {
857       len += strlen (params[i]);
858       len += sizeof (sync_bytes);
859     }
860     /* we seriously overshoot the length, but it's fine. */
861     codec_data = gst_buffer_new_and_alloc (len);
862
863     gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
864     ptr = map.data;
865     total = 0;
866     for (i = 0; params[i]; i++) {
867       guint save = 0;
868       gint state = 0;
869
870       GST_DEBUG_OBJECT (depayload, "decoding param %d (%s)", i, params[i]);
871       memcpy (ptr, sync_bytes, sizeof (sync_bytes));
872       ptr += sizeof (sync_bytes);
873       len =
874           g_base64_decode_step (params[i], strlen (params[i]), ptr, &state,
875           &save);
876       GST_DEBUG_OBJECT (depayload, "decoded %d bytes", len);
877       total += len + sizeof (sync_bytes);
878       ptr += len;
879     }
880     gst_buffer_unmap (codec_data, &map);
881     gst_buffer_resize (codec_data, 0, total);
882     g_strfreev (params);
883
884     /* keep the codec_data, we need to send it as the first buffer. We cannot
885      * push it in the adapter because the adapter might be flushed on discont.
886      */
887     if (rtph265depay->codec_data)
888       gst_buffer_unref (rtph265depay->codec_data);
889     rtph265depay->codec_data = codec_data;
890   } else if (!rtph265depay->byte_stream) {
891     gchar **params;
892     gint i;
893
894     if (ps == NULL)
895       goto incomplete_caps;
896
897     params = g_strsplit (ps, ",", 0);
898
899     GST_DEBUG_OBJECT (depayload, "we have %d params", g_strv_length (params));
900
901     /* start with 23 bytes header */
902     for (i = 0; params[i]; i++) {
903       GstBuffer *nal;
904       GstMapInfo nalmap;
905       gsize nal_len;
906       guint save = 0;
907       gint state = 0;
908
909       nal_len = strlen (params[i]);
910       if (nal_len == 0) {
911         GST_WARNING_OBJECT (depayload, "empty param '%s' (#%d)", params[i], i);
912         continue;
913       }
914       nal = gst_buffer_new_and_alloc (nal_len);
915       gst_buffer_map (nal, &nalmap, GST_MAP_READWRITE);
916
917       nal_len =
918           g_base64_decode_step (params[i], nal_len, nalmap.data, &state, &save);
919
920       GST_DEBUG_OBJECT (depayload, "adding param %d as %s", i,
921           (((nalmap.data[0] >> 1) & 0x3f) ==
922               32) ? "VPS" : (((nalmap.data[0] >> 1) & 0x3f) ==
923               33) ? "SPS" : "PPS");
924
925       gst_buffer_unmap (nal, &nalmap);
926       gst_buffer_set_size (nal, nal_len);
927
928       gst_rtp_h265_depay_add_vps_sps_pps (rtph265depay, nal);
929     }
930     g_strfreev (params);
931
932     if (rtph265depay->vps->len == 0 || rtph265depay->sps->len == 0 ||
933         rtph265depay->pps->len == 0) {
934       goto incomplete_caps;
935     }
936   }
937
938   g_free (ps);
939
940   return gst_rtp_h265_set_src_caps (rtph265depay);
941
942   /* ERRORS */
943 incomplete_caps:
944   {
945     GST_DEBUG_OBJECT (depayload, "we have incomplete caps,"
946         " doing setcaps later");
947     g_free (ps);
948     return TRUE;
949   }
950 }
951
952 static GstBuffer *
953 gst_rtp_h265_depay_allocate_output_buffer (GstRtpH265Depay * depay, gsize size)
954 {
955   GstBuffer *buffer = NULL;
956
957   g_return_val_if_fail (size > 0, NULL);
958
959   GST_LOG_OBJECT (depay, "want output buffer of %u bytes", (guint) size);
960
961   buffer = gst_buffer_new_allocate (depay->allocator, size, &depay->params);
962   if (buffer == NULL) {
963     GST_INFO_OBJECT (depay, "couldn't allocate output buffer");
964     buffer = gst_buffer_new_allocate (NULL, size, NULL);
965   }
966
967   return buffer;
968 }
969
970 static GstBuffer *
971 gst_rtp_h265_complete_au (GstRtpH265Depay * rtph265depay,
972     GstClockTime * out_timestamp, gboolean * out_keyframe)
973 {
974   GstBufferList *list;
975   GstMapInfo outmap;
976   GstBuffer *outbuf;
977   guint outsize, offset = 0;
978   gint b, n_bufs, m, n_mem;
979
980   /* we had a picture in the adapter and we completed it */
981   GST_DEBUG_OBJECT (rtph265depay, "taking completed AU");
982   outsize = gst_adapter_available (rtph265depay->picture_adapter);
983
984   outbuf = gst_rtp_h265_depay_allocate_output_buffer (rtph265depay, outsize);
985
986   if (outbuf == NULL)
987     return NULL;
988
989   if (!gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE))
990     return NULL;
991
992   list = gst_adapter_take_buffer_list (rtph265depay->picture_adapter, outsize);
993
994   n_bufs = gst_buffer_list_length (list);
995   for (b = 0; b < n_bufs; ++b) {
996     GstBuffer *buf = gst_buffer_list_get (list, b);
997
998     n_mem = gst_buffer_n_memory (buf);
999     for (m = 0; m < n_mem; ++m) {
1000       GstMemory *mem = gst_buffer_peek_memory (buf, m);
1001       gsize mem_size = gst_memory_get_sizes (mem, NULL, NULL);
1002       GstMapInfo mem_map;
1003
1004       if (gst_memory_map (mem, &mem_map, GST_MAP_READ)) {
1005         memcpy (outmap.data + offset, mem_map.data, mem_size);
1006         gst_memory_unmap (mem, &mem_map);
1007       } else {
1008         memset (outmap.data + offset, 0, mem_size);
1009       }
1010       offset += mem_size;
1011     }
1012
1013     gst_rtp_copy_video_meta (rtph265depay, outbuf, buf);
1014   }
1015   gst_buffer_list_unref (list);
1016   gst_buffer_unmap (outbuf, &outmap);
1017
1018   *out_timestamp = rtph265depay->last_ts;
1019   *out_keyframe = rtph265depay->last_keyframe;
1020
1021   rtph265depay->last_keyframe = FALSE;
1022   rtph265depay->picture_start = FALSE;
1023
1024   return outbuf;
1025 }
1026
1027 /* VPS/SPS/PPS/RADL/TSA/RASL/IDR/CRA is considered key, all others DELTA;
1028  * so downstream waiting for keyframe can pick up at VPS/SPS/PPS/IDR */
1029
1030 #define NAL_TYPE_IS_PARAMETER_SET(nt) (         ((nt) == GST_H265_VPS_NUT)\
1031                                                                                 ||  ((nt) == GST_H265_SPS_NUT)\
1032                                                                                 ||  ((nt) == GST_H265_PPS_NUT)                          )
1033
1034 #define NAL_TYPE_IS_CODED_SLICE_SEGMENT(nt) (           ((nt) == GST_H265_NAL_SLICE_TRAIL_N)\
1035                                                                                                 ||      ((nt) == GST_H265_NAL_SLICE_TRAIL_R)\
1036                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_TSA_N)\
1037                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_TSA_R)\
1038                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_STSA_N)\
1039                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_STSA_R)\
1040                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_RASL_N)\
1041                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_RASL_R)\
1042                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_BLA_W_LP)\
1043                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_BLA_W_RADL)\
1044                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_BLA_N_LP)\
1045                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_IDR_W_RADL)\
1046                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_IDR_N_LP)\
1047                                                                                                 ||  ((nt) == GST_H265_NAL_SLICE_CRA_NUT)                )
1048
1049 /* Intra random access point */
1050 #define NAL_TYPE_IS_IRAP(nt)   (((nt) == GST_H265_NAL_SLICE_BLA_W_LP)   \
1051                              || ((nt) == GST_H265_NAL_SLICE_BLA_W_RADL) \
1052                              || ((nt) == GST_H265_NAL_SLICE_BLA_N_LP)   \
1053                              || ((nt) == GST_H265_NAL_SLICE_IDR_W_RADL) \
1054                              || ((nt) == GST_H265_NAL_SLICE_IDR_N_LP)   \
1055                              || ((nt) == GST_H265_NAL_SLICE_CRA_NUT))
1056
1057 #define NAL_TYPE_IS_KEY(nt) (NAL_TYPE_IS_PARAMETER_SET(nt) || NAL_TYPE_IS_IRAP(nt))
1058
1059 static void
1060 gst_rtp_h265_depay_handle_nal (GstRtpH265Depay * rtph265depay, GstBuffer * nal,
1061     GstClockTime in_timestamp, gboolean marker)
1062 {
1063   GstRTPBaseDepayload *depayload = GST_RTP_BASE_DEPAYLOAD (rtph265depay);
1064   gint nal_type;
1065   GstMapInfo map;
1066   GstBuffer *outbuf = NULL;
1067   GstClockTime out_timestamp;
1068   gboolean keyframe, out_keyframe;
1069
1070   gst_buffer_map (nal, &map, GST_MAP_READ);
1071   if (G_UNLIKELY (map.size < 5))
1072     goto short_nal;
1073
1074   nal_type = (map.data[4] >> 1) & 0x3f;
1075   GST_DEBUG_OBJECT (rtph265depay, "handle NAL type %d (RTP marker bit %d)",
1076       nal_type, marker);
1077
1078   keyframe = NAL_TYPE_IS_KEY (nal_type);
1079
1080   out_keyframe = keyframe;
1081   out_timestamp = in_timestamp;
1082
1083   if (!rtph265depay->byte_stream) {
1084     if (NAL_TYPE_IS_PARAMETER_SET (nal_type)) {
1085       gst_rtp_h265_depay_add_vps_sps_pps (rtph265depay,
1086           gst_buffer_copy_region (nal, GST_BUFFER_COPY_ALL,
1087               4, gst_buffer_get_size (nal) - 4));
1088       gst_buffer_unmap (nal, &map);
1089       gst_buffer_unref (nal);
1090       return;
1091     } else if (rtph265depay->sps->len == 0 || rtph265depay->pps->len == 0) {
1092       /* Down push down any buffer in non-bytestream mode if the SPS/PPS haven't
1093        * go through yet
1094        */
1095       gst_pad_push_event (GST_RTP_BASE_DEPAYLOAD_SINKPAD (depayload),
1096           gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM,
1097               gst_structure_new ("GstForceKeyUnit",
1098                   "all-headers", G_TYPE_BOOLEAN, TRUE, NULL)));
1099       gst_buffer_unmap (nal, &map);
1100       gst_buffer_unref (nal);
1101       return;
1102     }
1103
1104     if (rtph265depay->new_codec_data &&
1105         rtph265depay->sps->len > 0 && rtph265depay->pps->len > 0)
1106       gst_rtp_h265_set_src_caps (rtph265depay);
1107   }
1108
1109   if (rtph265depay->merge) {
1110     gboolean start = FALSE, complete = FALSE;
1111
1112     /* marker bit isn't mandatory so in the following code we try to detect
1113      * an AU boundary (see H.265 spec section 7.4.2.4.4) */
1114     if (!marker) {
1115       if (NAL_TYPE_IS_CODED_SLICE_SEGMENT (nal_type)) {
1116         /* A NAL unit (X) ends an access unit if the next-occurring VCL NAL unit (Y) has the high-order bit of the first byte after its NAL unit header equal to 1 */
1117         start = TRUE;
1118         if (((map.data[6] >> 7) & 0x01) == 1) {
1119           complete = TRUE;
1120         }
1121       } else if ((nal_type >= 32 && nal_type <= 35)
1122           || nal_type == 39 || (nal_type >= 41 && nal_type <= 44)
1123           || (nal_type >= 48 && nal_type <= 55)) {
1124         /* VPS, SPS, PPS, SEI, ... terminate an access unit */
1125         complete = TRUE;
1126       }
1127       GST_DEBUG_OBJECT (depayload, "start %d, complete %d", start, complete);
1128
1129       if (complete && rtph265depay->picture_start)
1130         outbuf = gst_rtp_h265_complete_au (rtph265depay, &out_timestamp,
1131             &out_keyframe);
1132     }
1133     /* add to adapter */
1134     gst_buffer_unmap (nal, &map);
1135
1136     GST_DEBUG_OBJECT (depayload, "adding NAL to picture adapter");
1137     gst_adapter_push (rtph265depay->picture_adapter, nal);
1138     rtph265depay->last_ts = in_timestamp;
1139     rtph265depay->last_keyframe |= keyframe;
1140     rtph265depay->picture_start |= start;
1141
1142     if (marker)
1143       outbuf = gst_rtp_h265_complete_au (rtph265depay, &out_timestamp,
1144           &out_keyframe);
1145   } else {
1146     /* no merge, output is input nal */
1147     GST_DEBUG_OBJECT (depayload, "using NAL as output");
1148     outbuf = nal;
1149     gst_buffer_unmap (nal, &map);
1150   }
1151
1152   if (outbuf) {
1153     /* prepend codec_data */
1154     if (rtph265depay->codec_data) {
1155       GST_DEBUG_OBJECT (depayload, "prepending codec_data");
1156       gst_rtp_copy_video_meta (rtph265depay, rtph265depay->codec_data, outbuf);
1157       outbuf = gst_buffer_append (rtph265depay->codec_data, outbuf);
1158       rtph265depay->codec_data = NULL;
1159       out_keyframe = TRUE;
1160     }
1161     outbuf = gst_buffer_make_writable (outbuf);
1162
1163     gst_rtp_drop_non_video_meta (rtph265depay, outbuf);
1164
1165     GST_BUFFER_PTS (outbuf) = out_timestamp;
1166
1167     if (out_keyframe)
1168       GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
1169     else
1170       GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
1171
1172     gst_rtp_base_depayload_push (depayload, outbuf);
1173   }
1174
1175   return;
1176
1177   /* ERRORS */
1178 short_nal:
1179   {
1180     GST_WARNING_OBJECT (depayload, "dropping short NAL");
1181     gst_buffer_unmap (nal, &map);
1182     gst_buffer_unref (nal);
1183     return;
1184   }
1185 }
1186
1187 static void
1188 gst_rtp_h265_finish_fragmentation_unit (GstRtpH265Depay * rtph265depay)
1189 {
1190   guint outsize;
1191   GstMapInfo map;
1192   GstBuffer *outbuf;
1193
1194   outsize = gst_adapter_available (rtph265depay->adapter);
1195   g_assert (outsize >= 4);
1196
1197   outbuf = gst_adapter_take_buffer (rtph265depay->adapter, outsize);
1198
1199   gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
1200   GST_DEBUG_OBJECT (rtph265depay, "output %d bytes", outsize);
1201
1202   if (rtph265depay->byte_stream) {
1203     memcpy (map.data, sync_bytes, sizeof (sync_bytes));
1204   } else {
1205     GST_WRITE_UINT32_BE (map.data, outsize - 4);
1206   }
1207   gst_buffer_unmap (outbuf, &map);
1208
1209   rtph265depay->current_fu_type = 0;
1210
1211   gst_rtp_h265_depay_handle_nal (rtph265depay, outbuf,
1212       rtph265depay->fu_timestamp, rtph265depay->fu_marker);
1213 }
1214
1215 static GstBuffer *
1216 gst_rtp_h265_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp)
1217 {
1218   GstRtpH265Depay *rtph265depay;
1219   GstBuffer *outbuf = NULL;
1220   guint8 nal_unit_type;
1221
1222   rtph265depay = GST_RTP_H265_DEPAY (depayload);
1223
1224   /* flush remaining data on discont */
1225   if (GST_BUFFER_IS_DISCONT (rtp->buffer)) {
1226     gst_adapter_clear (rtph265depay->adapter);
1227     rtph265depay->wait_start = TRUE;
1228     rtph265depay->current_fu_type = 0;
1229   }
1230
1231   {
1232     gint payload_len;
1233     guint8 *payload;
1234     guint header_len;
1235     GstMapInfo map;
1236     guint outsize, nalu_size;
1237     GstClockTime timestamp;
1238     gboolean marker;
1239     guint8 nuh_layer_id, nuh_temporal_id_plus1;
1240     guint8 S, E;
1241     guint16 nal_header;
1242 #if 0
1243     gboolean donl_present = FALSE;
1244 #endif
1245
1246     timestamp = GST_BUFFER_PTS (rtp->buffer);
1247
1248     payload_len = gst_rtp_buffer_get_payload_len (rtp);
1249     payload = gst_rtp_buffer_get_payload (rtp);
1250     marker = gst_rtp_buffer_get_marker (rtp);
1251
1252     GST_DEBUG_OBJECT (rtph265depay, "receiving %d bytes", payload_len);
1253
1254     if (payload_len == 0)
1255       goto empty_packet;
1256
1257     /* +---------------+---------------+
1258      * |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
1259      * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1260      * |F|   Type    |  LayerId  | TID |
1261      * +-------------+-----------------+
1262      *
1263      * F must be 0.
1264      *
1265      */
1266     nal_unit_type = (payload[0] >> 1) & 0x3f;
1267     nuh_layer_id = ((payload[0] & 0x01) << 5) | (payload[1] >> 3);      /* should be zero for now but this could change in future HEVC extensions */
1268     nuh_temporal_id_plus1 = payload[1] & 0x03;
1269
1270     /* At least two byte header with type */
1271     header_len = 2;
1272
1273     GST_DEBUG_OBJECT (rtph265depay,
1274         "NAL header nal_unit_type %d, nuh_temporal_id_plus1 %d", nal_unit_type,
1275         nuh_temporal_id_plus1);
1276
1277     GST_FIXME_OBJECT (rtph265depay, "Assuming DONL field is not present");
1278
1279     /* FIXME - assuming DONL field is not present for now */
1280     /*donl_present = (tx-mode == "MST") || (sprop-max-don-diff > 0); */
1281
1282     /* If FU unit was being processed, but the current nal is of a different
1283      * type.  Assume that the remote payloader is buggy (didn't set the end bit
1284      * when the FU ended) and send out what we gathered thusfar */
1285     if (G_UNLIKELY (rtph265depay->current_fu_type != 0 &&
1286             nal_unit_type != rtph265depay->current_fu_type))
1287       gst_rtp_h265_finish_fragmentation_unit (rtph265depay);
1288
1289     switch (nal_unit_type) {
1290       case 48:
1291       {
1292         GST_DEBUG_OBJECT (rtph265depay, "Processing aggregation packet");
1293
1294         /* Aggregation packet (section 4.7) */
1295
1296         /*  An example of an AP packet containing two aggregation units
1297            without the DONL and DOND fields
1298
1299            0                   1                   2                   3
1300            0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1301            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1302            |                          RTP Header                           |
1303            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1304            |   PayloadHdr (Type=48)        |         NALU 1 Size           |
1305            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1306            |          NALU 1 HDR           |                               |
1307            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         NALU 1 Data           |
1308            |                   . . .                                       |
1309            |                                                               |
1310            +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1311            |  . . .        | NALU 2 Size                   | NALU 2 HDR    |
1312            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1313            | NALU 2 HDR    |                                               |
1314            +-+-+-+-+-+-+-+-+              NALU 2 Data                      |
1315            |                   . . .                                       |
1316            |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1317            |                               :...OPTIONAL RTP padding        |
1318            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1319          */
1320
1321         /* strip headers */
1322         payload += header_len;
1323         payload_len -= header_len;
1324
1325         rtph265depay->wait_start = FALSE;
1326
1327 #if 0
1328         if (donl_present)
1329           goto not_implemented_donl_present;
1330 #endif
1331
1332         while (payload_len > 2) {
1333
1334           nalu_size = (payload[0] << 8) | payload[1];
1335
1336           /* dont include nalu_size */
1337           if (nalu_size > (payload_len - 2))
1338             nalu_size = payload_len - 2;
1339
1340           outsize = nalu_size + sizeof (sync_bytes);
1341           outbuf = gst_buffer_new_and_alloc (outsize);
1342
1343           gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
1344           if (rtph265depay->byte_stream) {
1345             memcpy (map.data, sync_bytes, sizeof (sync_bytes));
1346           } else {
1347             GST_WRITE_UINT32_BE (map.data, nalu_size);
1348           }
1349
1350           /* strip NALU size */
1351           payload += 2;
1352           payload_len -= 2;
1353
1354           memcpy (map.data + sizeof (sync_bytes), payload, nalu_size);
1355           gst_buffer_unmap (outbuf, &map);
1356
1357           gst_rtp_copy_video_meta (rtph265depay, outbuf, rtp->buffer);
1358
1359           gst_rtp_h265_depay_handle_nal (rtph265depay, outbuf, timestamp,
1360               marker);
1361
1362           payload += nalu_size;
1363           payload_len -= nalu_size;
1364         }
1365         break;
1366       }
1367       case 49:
1368       {
1369         GST_DEBUG_OBJECT (rtph265depay, "Processing Fragmentation Unit");
1370
1371         /* Fragmentation units (FUs)  Section 4.8 */
1372
1373         /*    The structure of a Fragmentation Unit (FU)
1374          *
1375          *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1376          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1377          |    PayloadHdr (Type=49)       |   FU header   | DONL (cond)   |
1378          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
1379          | DONL (cond)   |                                               |
1380          |-+-+-+-+-+-+-+-+                                               |
1381          |                         FU payload                            |
1382          |                                                               |
1383          |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1384          |                               :...OPTIONAL RTP padding        |
1385          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1386          *
1387          *
1388          */
1389
1390         /* strip headers */
1391         payload += header_len;
1392         payload_len -= header_len;
1393
1394         /* processing FU header */
1395         S = (payload[0] & 0x80) == 0x80;
1396         E = (payload[0] & 0x40) == 0x40;
1397
1398         GST_DEBUG_OBJECT (rtph265depay,
1399             "FU header with S %d, E %d, nal_unit_type %d", S, E,
1400             payload[0] & 0x3f);
1401
1402         if (rtph265depay->wait_start && !S)
1403           goto waiting_start;
1404
1405 #if 0
1406         if (donl_present)
1407           goto not_implemented_donl_present;
1408 #endif
1409
1410         if (S) {
1411
1412           GST_DEBUG_OBJECT (rtph265depay, "Start of Fragmentation Unit");
1413
1414           /* If a new FU unit started, while still processing an older one.
1415            * Assume that the remote payloader is buggy (doesn't set the end
1416            * bit) and send out what we've gathered thusfar */
1417           if (G_UNLIKELY (rtph265depay->current_fu_type != 0))
1418             gst_rtp_h265_finish_fragmentation_unit (rtph265depay);
1419
1420           rtph265depay->current_fu_type = nal_unit_type;
1421           rtph265depay->fu_timestamp = timestamp;
1422
1423           rtph265depay->wait_start = FALSE;
1424
1425           /* reconstruct NAL header */
1426           nal_header =
1427               ((payload[0] & 0x3f) << 9) | (nuh_layer_id << 3) |
1428               nuh_temporal_id_plus1;
1429
1430           /* go back one byte so we can copy the payload + two bytes more in the front which
1431            * will be overwritten by the nal_header
1432            */
1433           payload -= 1;
1434           payload_len += 1;
1435
1436           nalu_size = payload_len;
1437           outsize = nalu_size + sizeof (sync_bytes);
1438           outbuf = gst_buffer_new_and_alloc (outsize);
1439
1440           gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
1441           if (rtph265depay->byte_stream) {
1442             GST_WRITE_UINT32_BE (map.data, 0x00000001);
1443           } else {
1444             /* will be fixed up in finish_fragmentation_unit() */
1445             GST_WRITE_UINT32_BE (map.data, 0xffffffff);
1446           }
1447           memcpy (map.data + sizeof (sync_bytes), payload, nalu_size);
1448           map.data[4] = nal_header >> 8;
1449           map.data[5] = nal_header & 0xff;
1450           gst_buffer_unmap (outbuf, &map);
1451
1452           gst_rtp_copy_video_meta (rtph265depay, outbuf, rtp->buffer);
1453
1454           GST_DEBUG_OBJECT (rtph265depay, "queueing %d bytes", outsize);
1455
1456           /* and assemble in the adapter */
1457           gst_adapter_push (rtph265depay->adapter, outbuf);
1458         } else {
1459
1460           GST_DEBUG_OBJECT (rtph265depay,
1461               "Following part of Fragmentation Unit");
1462
1463           /* strip off FU header byte */
1464           payload += 1;
1465           payload_len -= 1;
1466
1467           outsize = payload_len;
1468           outbuf = gst_buffer_new_and_alloc (outsize);
1469           gst_buffer_fill (outbuf, 0, payload, outsize);
1470
1471           gst_rtp_copy_video_meta (rtph265depay, outbuf, rtp->buffer);
1472
1473           GST_DEBUG_OBJECT (rtph265depay, "queueing %d bytes", outsize);
1474
1475           /* and assemble in the adapter */
1476           gst_adapter_push (rtph265depay->adapter, outbuf);
1477         }
1478
1479         outbuf = NULL;
1480         rtph265depay->fu_marker = marker;
1481
1482         /* if NAL unit ends, flush the adapter */
1483         if (E) {
1484           gst_rtp_h265_finish_fragmentation_unit (rtph265depay);
1485           GST_DEBUG_OBJECT (rtph265depay, "End of Fragmentation Unit");
1486         }
1487         break;
1488       }
1489       case 50:
1490         goto not_implemented;   /* PACI packets  Section 4.9 */
1491       default:
1492       {
1493         rtph265depay->wait_start = FALSE;
1494
1495         /* All other cases: Single NAL unit packet   Section 4.6 */
1496         /* the entire payload is the output buffer */
1497
1498 #if 0
1499         if (donl_present)
1500           goto not_implemented_donl_present;
1501 #endif
1502
1503         nalu_size = payload_len;
1504         outsize = nalu_size + sizeof (sync_bytes);
1505         outbuf = gst_buffer_new_and_alloc (outsize);
1506
1507         gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
1508         if (rtph265depay->byte_stream) {
1509           memcpy (map.data, sync_bytes, sizeof (sync_bytes));
1510         } else {
1511           GST_WRITE_UINT32_BE (map.data, nalu_size);
1512         }
1513         memcpy (map.data + 4, payload, nalu_size);
1514         gst_buffer_unmap (outbuf, &map);
1515
1516         gst_rtp_copy_video_meta (rtph265depay, outbuf, rtp->buffer);
1517
1518         gst_rtp_h265_depay_handle_nal (rtph265depay, outbuf, timestamp, marker);
1519         break;
1520       }
1521     }
1522   }
1523
1524   return NULL;
1525
1526   /* ERRORS */
1527 empty_packet:
1528   {
1529     GST_DEBUG_OBJECT (rtph265depay, "empty packet");
1530     return NULL;
1531   }
1532 waiting_start:
1533   {
1534     GST_DEBUG_OBJECT (rtph265depay, "waiting for start");
1535     return NULL;
1536   }
1537 #if 0
1538 not_implemented_donl_present:
1539   {
1540     GST_ELEMENT_ERROR (rtph265depay, STREAM, FORMAT,
1541         (NULL), ("DONL field present not supported yet"));
1542     return NULL;
1543   }
1544 #endif
1545 not_implemented:
1546   {
1547     GST_ELEMENT_ERROR (rtph265depay, STREAM, FORMAT,
1548         (NULL), ("NAL unit type %d not supported yet", nal_unit_type));
1549     return NULL;
1550   }
1551 }
1552
1553 static gboolean
1554 gst_rtp_h265_depay_handle_event (GstRTPBaseDepayload * depay, GstEvent * event)
1555 {
1556   GstRtpH265Depay *rtph265depay;
1557
1558   rtph265depay = GST_RTP_H265_DEPAY (depay);
1559
1560   switch (GST_EVENT_TYPE (event)) {
1561     case GST_EVENT_FLUSH_STOP:
1562       gst_rtp_h265_depay_reset (rtph265depay, FALSE);
1563       break;
1564     default:
1565       break;
1566   }
1567
1568   return
1569       GST_RTP_BASE_DEPAYLOAD_CLASS (parent_class)->handle_event (depay, event);
1570 }
1571
1572 static GstStateChangeReturn
1573 gst_rtp_h265_depay_change_state (GstElement * element,
1574     GstStateChange transition)
1575 {
1576   GstRtpH265Depay *rtph265depay;
1577   GstStateChangeReturn ret;
1578
1579   rtph265depay = GST_RTP_H265_DEPAY (element);
1580
1581   switch (transition) {
1582     case GST_STATE_CHANGE_NULL_TO_READY:
1583       break;
1584     case GST_STATE_CHANGE_READY_TO_PAUSED:
1585       gst_rtp_h265_depay_reset (rtph265depay, TRUE);
1586       break;
1587     default:
1588       break;
1589   }
1590
1591   ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
1592
1593   switch (transition) {
1594     case GST_STATE_CHANGE_PAUSED_TO_READY:
1595       gst_rtp_h265_depay_reset (rtph265depay, TRUE);
1596       break;
1597     case GST_STATE_CHANGE_READY_TO_NULL:
1598       break;
1599     default:
1600       break;
1601   }
1602   return ret;
1603 }
1604
1605 gboolean
1606 gst_rtp_h265_depay_plugin_init (GstPlugin * plugin)
1607 {
1608   GST_DEBUG_CATEGORY_INIT (rtph265depay_debug, "rtph265depay", 0,
1609       "H265 Video RTP Depayloader");
1610
1611   return gst_element_register (plugin, "rtph265depay",
1612       GST_RANK_SECONDARY, GST_TYPE_RTP_H265_DEPAY);
1613 }