mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-05 05:52:37 +00:00
codecparsers: h264: add support for Recovery Point SEI message.
The recovery point SEI message helps a decoder in determining if the decoding process would produce acceptable pictures for display after the decoder initiates random access or after the encoder indicates a broken link in the coded video sequence. This is not used in the h264parse element, but it could help debugging. https://bugzilla.gnome.org/show_bug.cgi?id=723380
This commit is contained in:
parent
0440cabf49
commit
67df207280
3 changed files with 52 additions and 1 deletions
|
@ -852,6 +852,31 @@ error:
|
||||||
return GST_H264_PARSER_ERROR;
|
return GST_H264_PARSER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstH264ParserResult
|
||||||
|
gst_h264_parser_parse_recovery_point (GstH264NalParser * nalparser,
|
||||||
|
GstH264RecoveryPoint * rp, NalReader * nr)
|
||||||
|
{
|
||||||
|
GstH264SPS *const sps = nalparser->last_sps;
|
||||||
|
|
||||||
|
GST_DEBUG ("parsing \"Recovery point\"");
|
||||||
|
if (!sps || !sps->valid) {
|
||||||
|
GST_WARNING ("didn't get the associated sequence paramater set for the "
|
||||||
|
"current access unit");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
READ_UE_ALLOWED (nr, rp->recovery_frame_cnt, 0, sps->max_frame_num - 1);
|
||||||
|
READ_UINT8 (nr, rp->exact_match_flag, 1);
|
||||||
|
READ_UINT8 (nr, rp->broken_link_flag, 1);
|
||||||
|
READ_UINT8 (nr, rp->changing_slice_group_idc, 2);
|
||||||
|
|
||||||
|
return GST_H264_PARSER_OK;
|
||||||
|
|
||||||
|
error:
|
||||||
|
GST_WARNING ("error parsing \"Recovery point\"");
|
||||||
|
return GST_H264_PARSER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
static GstH264ParserResult
|
static GstH264ParserResult
|
||||||
gst_h264_parser_parse_sei_message (GstH264NalParser * nalparser,
|
gst_h264_parser_parse_sei_message (GstH264NalParser * nalparser,
|
||||||
NalReader * nr, GstH264SEIMessage * sei)
|
NalReader * nr, GstH264SEIMessage * sei)
|
||||||
|
@ -893,6 +918,10 @@ gst_h264_parser_parse_sei_message (GstH264NalParser * nalparser,
|
||||||
res = gst_h264_parser_parse_pic_timing (nalparser,
|
res = gst_h264_parser_parse_pic_timing (nalparser,
|
||||||
&sei->payload.pic_timing, nr);
|
&sei->payload.pic_timing, nr);
|
||||||
break;
|
break;
|
||||||
|
case GST_H264_SEI_RECOVERY_POINT:
|
||||||
|
res = gst_h264_parser_parse_recovery_point (nalparser,
|
||||||
|
&sei->payload.recovery_point, nr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* Just consume payloadSize bytes, which does not account for
|
/* Just consume payloadSize bytes, which does not account for
|
||||||
emulation prevention bytes */
|
emulation prevention bytes */
|
||||||
|
|
|
@ -156,6 +156,7 @@ typedef enum
|
||||||
* GstH264SEIPayloadType:
|
* GstH264SEIPayloadType:
|
||||||
* @GST_H264_SEI_BUF_PERIOD: Buffering Period SEI Message
|
* @GST_H264_SEI_BUF_PERIOD: Buffering Period SEI Message
|
||||||
* @GST_H264_SEI_PIC_TIMING: Picture Timing SEI Message
|
* @GST_H264_SEI_PIC_TIMING: Picture Timing SEI Message
|
||||||
|
* @GST_H264_SEI_RECOVERY_POINT: Recovery Point SEI Message (D.2.7)
|
||||||
* ...
|
* ...
|
||||||
*
|
*
|
||||||
* The type of SEI message.
|
* The type of SEI message.
|
||||||
|
@ -163,7 +164,8 @@ typedef enum
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GST_H264_SEI_BUF_PERIOD = 0,
|
GST_H264_SEI_BUF_PERIOD = 0,
|
||||||
GST_H264_SEI_PIC_TIMING = 1
|
GST_H264_SEI_PIC_TIMING = 1,
|
||||||
|
GST_H264_SEI_RECOVERY_POINT = 6,
|
||||||
/* and more... */
|
/* and more... */
|
||||||
} GstH264SEIPayloadType;
|
} GstH264SEIPayloadType;
|
||||||
|
|
||||||
|
@ -234,6 +236,7 @@ typedef struct _GstH264SliceHdr GstH264SliceHdr;
|
||||||
typedef struct _GstH264ClockTimestamp GstH264ClockTimestamp;
|
typedef struct _GstH264ClockTimestamp GstH264ClockTimestamp;
|
||||||
typedef struct _GstH264PicTiming GstH264PicTiming;
|
typedef struct _GstH264PicTiming GstH264PicTiming;
|
||||||
typedef struct _GstH264BufferingPeriod GstH264BufferingPeriod;
|
typedef struct _GstH264BufferingPeriod GstH264BufferingPeriod;
|
||||||
|
typedef struct _GstH264RecoveryPoint GstH264RecoveryPoint;
|
||||||
typedef struct _GstH264SEIMessage GstH264SEIMessage;
|
typedef struct _GstH264SEIMessage GstH264SEIMessage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -706,6 +709,14 @@ struct _GstH264BufferingPeriod
|
||||||
guint8 vcl_initial_cpb_removal_delay_offset[32];
|
guint8 vcl_initial_cpb_removal_delay_offset[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _GstH264RecoveryPoint
|
||||||
|
{
|
||||||
|
guint32 recovery_frame_cnt;
|
||||||
|
guint8 exact_match_flag;
|
||||||
|
guint8 broken_link_flag;
|
||||||
|
guint8 changing_slice_group_idc;
|
||||||
|
};
|
||||||
|
|
||||||
struct _GstH264SEIMessage
|
struct _GstH264SEIMessage
|
||||||
{
|
{
|
||||||
GstH264SEIPayloadType payloadType;
|
GstH264SEIPayloadType payloadType;
|
||||||
|
@ -713,6 +724,7 @@ struct _GstH264SEIMessage
|
||||||
union {
|
union {
|
||||||
GstH264BufferingPeriod buffering_period;
|
GstH264BufferingPeriod buffering_period;
|
||||||
GstH264PicTiming pic_timing;
|
GstH264PicTiming pic_timing;
|
||||||
|
GstH264RecoveryPoint recovery_point;
|
||||||
/* ... could implement more */
|
/* ... could implement more */
|
||||||
} payload;
|
} payload;
|
||||||
};
|
};
|
||||||
|
|
|
@ -501,6 +501,16 @@ gst_h264_parse_process_sei (GstH264Parse * h264parse, GstH264NalUnit * nalu)
|
||||||
"new buffering period; ts_trn_nb updated: %" GST_TIME_FORMAT,
|
"new buffering period; ts_trn_nb updated: %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (h264parse->ts_trn_nb));
|
GST_TIME_ARGS (h264parse->ts_trn_nb));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Additional messages that are not innerly useful to the
|
||||||
|
* element but for debugging purposes */
|
||||||
|
case GST_H264_SEI_RECOVERY_POINT:
|
||||||
|
GST_LOG_OBJECT (h264parse, "recovery point found: %u %u %u %u",
|
||||||
|
sei.payload.recovery_point.recovery_frame_cnt,
|
||||||
|
sei.payload.recovery_point.exact_match_flag,
|
||||||
|
sei.payload.recovery_point.broken_link_flag,
|
||||||
|
sei.payload.recovery_point.changing_slice_group_idc);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_array_free (messages, TRUE);
|
g_array_free (messages, TRUE);
|
||||||
|
|
Loading…
Reference in a new issue