Skip to content

Commit 2d23bcc

Browse files
committed
rtph263pdepay: flag keyframes on output buffers
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1091>
1 parent 972184f commit 2d23bcc

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

gst/rtp/gstrtph263pdepay.c

+94
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,98 @@ gst_rtp_h263p_depay_setcaps (GstRTPBaseDepayload * filter, GstCaps * caps)
234234
}
235235
}
236236

237+
static void
238+
gst_rtp_h263p_depay_decorate_output_buffer (GstRtpH263PDepay * rtph263pdepay,
239+
GstBuffer * outbuf)
240+
{
241+
gboolean is_intra = FALSE;
242+
GstBitReader bits;
243+
guint8 pic_hdr[16];
244+
gsize pic_hdr_len = 0;
245+
guint32 psc, ptype, mpptype;
246+
guint8 ufep;
247+
248+
pic_hdr_len = gst_buffer_extract (outbuf, 0, pic_hdr, sizeof (pic_hdr));
249+
250+
GST_MEMDUMP_OBJECT (rtph263pdepay, "pic_hdr", pic_hdr, pic_hdr_len);
251+
252+
#if 0
253+
if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_MEMDUMP) {
254+
gchar bit_str[1 + sizeof (pic_hdr) * 8] = { 0, };
255+
guint8 b;
256+
257+
gst_bit_reader_init (&bits, pic_hdr, pic_hdr_len);
258+
while ((gst_bit_reader_get_bits_uint8 (&bits, &b, 1))) {
259+
g_strlcat (bit_str, b ? "1" : "0", sizeof (bit_str));
260+
}
261+
GST_TRACE_OBJECT (rtph263pdepay, "pic_hdr bits: %s", bit_str);
262+
}
263+
#endif
264+
265+
gst_bit_reader_init (&bits, pic_hdr, pic_hdr_len);
266+
267+
/* PSC - Picture Start Code: 22 bits: 0000 0000 0000 0000 10 0000 */
268+
if (!gst_bit_reader_get_bits_uint32 (&bits, &psc, 22) || psc != 0x20) {
269+
GST_WARNING_OBJECT (rtph263pdepay, "No picture start code");
270+
return;
271+
}
272+
273+
/* TR - Temporal Reference: 8 bits */
274+
if (!gst_bit_reader_skip (&bits, 8)) {
275+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no TR");
276+
return;
277+
}
278+
279+
/* PTYPE (first 8 bits) */
280+
if (!gst_bit_reader_get_bits_uint32 (&bits, &ptype, 8) || (ptype >> 6) != 2) {
281+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no PTYPE");
282+
return;
283+
}
284+
285+
/* PTYPE: check for extended PTYPE (bits 6-8 = 111) */
286+
if ((ptype & 7) != 7) {
287+
/* No extended PTYPE, read remaining 5 bits */
288+
if (!gst_bit_reader_get_bits_uint32 (&bits, &ptype, 5)) {
289+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no PTYPE");
290+
return;
291+
}
292+
is_intra = (ptype & 0x10) == 0;
293+
goto done;
294+
}
295+
296+
/* UFEP - Update Full Extended PTYPE */
297+
ufep = 0;
298+
if (!gst_bit_reader_get_bits_uint8 (&bits, &ufep, 3) || ufep > 1) {
299+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no PLUSPTYPE, %d",
300+
ufep);
301+
return;
302+
}
303+
304+
/* Skip optional part of PLUSPTYPE (OPPTYPE) */
305+
if (ufep == 1 && !gst_bit_reader_skip (&bits, 18)) {
306+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no OPPTYPE");
307+
return;
308+
}
309+
310+
/* Mandatory part of PLUSPTYPE (MPPTYPE) */
311+
if (!gst_bit_reader_get_bits_uint32 (&bits, &mpptype, 9)
312+
|| (mpptype & 7) != 1) {
313+
GST_WARNING_OBJECT (rtph263pdepay, "Short picture header: no MPPTYPE");
314+
return;
315+
}
316+
317+
is_intra = (mpptype >> 6) == 0;
318+
319+
done:
320+
321+
if (is_intra) {
322+
GST_LOG_OBJECT (rtph263pdepay, "I-frame");
323+
GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
324+
} else {
325+
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
326+
}
327+
}
328+
237329
static GstBuffer *
238330
gst_rtp_h263p_depay_process (GstRTPBaseDepayload * depayload,
239331
GstRTPBuffer * rtp)
@@ -336,6 +428,8 @@ gst_rtp_h263p_depay_process (GstRTPBaseDepayload * depayload,
336428

337429
gst_rtp_drop_non_video_meta (rtph263pdepay, outbuf);
338430

431+
gst_rtp_h263p_depay_decorate_output_buffer (rtph263pdepay, outbuf);
432+
339433
return outbuf;
340434
} else {
341435
/* frame not completed: store in adapter */

0 commit comments

Comments
 (0)