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:
Guillaume Desmottes 2018-09-27 15:33:32 +02:00 committed by Nicolas Dufresne
parent 99bd3f716c
commit 64643fdfb4
2 changed files with 43 additions and 1 deletions

View file

@ -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 */

View file

@ -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;
}; };