@@ -234,6 +234,98 @@ gst_rtp_h263p_depay_setcaps (GstRTPBaseDepayload * filter, GstCaps * caps)
234
234
}
235
235
}
236
236
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
+
237
329
static GstBuffer *
238
330
gst_rtp_h263p_depay_process (GstRTPBaseDepayload * depayload ,
239
331
GstRTPBuffer * rtp )
@@ -336,6 +428,8 @@ gst_rtp_h263p_depay_process (GstRTPBaseDepayload * depayload,
336
428
337
429
gst_rtp_drop_non_video_meta (rtph263pdepay , outbuf );
338
430
431
+ gst_rtp_h263p_depay_decorate_output_buffer (rtph263pdepay , outbuf );
432
+
339
433
return outbuf ;
340
434
} else {
341
435
/* frame not completed: store in adapter */
0 commit comments