mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
h265parser: parse SEI recovery point
Copied the implementation from h264parser and adapted it to the HEVC syntax. https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/790
This commit is contained in:
parent
99bd3f716c
commit
64643fdfb4
2 changed files with 43 additions and 1 deletions
|
@ -1097,6 +1097,33 @@ error:
|
||||||
return GST_H265_PARSER_ERROR;
|
return GST_H265_PARSER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstH265ParserResult
|
||||||
|
gst_h265_parser_parse_recovery_point (GstH265Parser * parser,
|
||||||
|
GstH265RecoveryPoint * rp, NalReader * nr)
|
||||||
|
{
|
||||||
|
GstH265SPS *const sps = parser->last_sps;
|
||||||
|
gint32 max_pic_order_cnt_lsb;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
max_pic_order_cnt_lsb = pow (2, (sps->log2_max_pic_order_cnt_lsb_minus4 + 4));
|
||||||
|
READ_SE_ALLOWED (nr, rp->recovery_poc_cnt, -max_pic_order_cnt_lsb / 2,
|
||||||
|
max_pic_order_cnt_lsb - 1);
|
||||||
|
READ_UINT8 (nr, rp->exact_match_flag, 1);
|
||||||
|
READ_UINT8 (nr, rp->broken_link_flag, 1);
|
||||||
|
|
||||||
|
return GST_H265_PARSER_OK;
|
||||||
|
|
||||||
|
error:
|
||||||
|
GST_WARNING ("error parsing \"Recovery point\"");
|
||||||
|
return GST_H265_PARSER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/******** API *************/
|
/******** API *************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2281,6 +2308,10 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
|
||||||
res = gst_h265_parser_parse_pic_timing (parser,
|
res = gst_h265_parser_parse_pic_timing (parser,
|
||||||
&sei->payload.pic_timing, nr);
|
&sei->payload.pic_timing, nr);
|
||||||
break;
|
break;
|
||||||
|
case GST_H265_SEI_RECOVERY_POINT:
|
||||||
|
res = gst_h265_parser_parse_recovery_point (parser,
|
||||||
|
&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 */
|
||||||
|
|
|
@ -220,6 +220,7 @@ typedef enum
|
||||||
* GstH265SEIPayloadType:
|
* GstH265SEIPayloadType:
|
||||||
* @GST_H265_SEI_BUF_PERIOD: Buffering Period SEI Message
|
* @GST_H265_SEI_BUF_PERIOD: Buffering Period SEI Message
|
||||||
* @GST_H265_SEI_PIC_TIMING: Picture Timing SEI Message
|
* @GST_H265_SEI_PIC_TIMING: Picture Timing SEI Message
|
||||||
|
* @GST_H265_SEI_RECOVERY_POINT: Recovery Point SEI Message (D.3.8)
|
||||||
* ...
|
* ...
|
||||||
*
|
*
|
||||||
* The type of SEI message.
|
* The type of SEI message.
|
||||||
|
@ -227,7 +228,8 @@ typedef enum
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GST_H265_SEI_BUF_PERIOD = 0,
|
GST_H265_SEI_BUF_PERIOD = 0,
|
||||||
GST_H265_SEI_PIC_TIMING = 1
|
GST_H265_SEI_PIC_TIMING = 1,
|
||||||
|
GST_H265_SEI_RECOVERY_POINT = 6,
|
||||||
/* and more... */
|
/* and more... */
|
||||||
} GstH265SEIPayloadType;
|
} GstH265SEIPayloadType;
|
||||||
|
|
||||||
|
@ -313,6 +315,7 @@ typedef struct _GstH265SliceHdr GstH265SliceHdr;
|
||||||
|
|
||||||
typedef struct _GstH265PicTiming GstH265PicTiming;
|
typedef struct _GstH265PicTiming GstH265PicTiming;
|
||||||
typedef struct _GstH265BufferingPeriod GstH265BufferingPeriod;
|
typedef struct _GstH265BufferingPeriod GstH265BufferingPeriod;
|
||||||
|
typedef struct _GstH265RecoveryPoint GstH265RecoveryPoint;
|
||||||
typedef struct _GstH265SEIMessage GstH265SEIMessage;
|
typedef struct _GstH265SEIMessage GstH265SEIMessage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1063,6 +1066,13 @@ struct _GstH265BufferingPeriod
|
||||||
guint8 vcl_initial_alt_cpb_removal_offset[32];
|
guint8 vcl_initial_alt_cpb_removal_offset[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _GstH265RecoveryPoint
|
||||||
|
{
|
||||||
|
gint32 recovery_poc_cnt;
|
||||||
|
guint8 exact_match_flag;
|
||||||
|
guint8 broken_link_flag;
|
||||||
|
};
|
||||||
|
|
||||||
struct _GstH265SEIMessage
|
struct _GstH265SEIMessage
|
||||||
{
|
{
|
||||||
GstH265SEIPayloadType payloadType;
|
GstH265SEIPayloadType payloadType;
|
||||||
|
@ -1070,6 +1080,7 @@ struct _GstH265SEIMessage
|
||||||
union {
|
union {
|
||||||
GstH265BufferingPeriod buffering_period;
|
GstH265BufferingPeriod buffering_period;
|
||||||
GstH265PicTiming pic_timing;
|
GstH265PicTiming pic_timing;
|
||||||
|
GstH265RecoveryPoint recovery_point;
|
||||||
/* ... could implement more */
|
/* ... could implement more */
|
||||||
} payload;
|
} payload;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue