diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2018-09-27 15:33:32 +0200 |
---|---|---|
committer | Nicolas Dufresne <nicolas@ndufresne.ca> | 2018-12-02 02:07:39 +0000 |
commit | 64643fdfb4701d12c6ef24dbd21b442a35134f38 (patch) | |
tree | eff1ae86831d2fbd475e14b50a0dfc435bb199ac /gst-libs | |
parent | 99bd3f716cf63e04f88ad54a83d1a5d42f99bc56 (diff) | |
download | gstreamer-plugins-bad-64643fdfb4701d12c6ef24dbd21b442a35134f38.tar.gz |
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
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/codecparsers/gsth265parser.c | 31 | ||||
-rw-r--r-- | gst-libs/gst/codecparsers/gsth265parser.h | 13 |
2 files changed, 43 insertions, 1 deletions
diff --git a/gst-libs/gst/codecparsers/gsth265parser.c b/gst-libs/gst/codecparsers/gsth265parser.c index a6baa495d..d44a045f7 100644 --- a/gst-libs/gst/codecparsers/gsth265parser.c +++ b/gst-libs/gst/codecparsers/gsth265parser.c @@ -1097,6 +1097,33 @@ 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 *************/ /** @@ -2281,6 +2308,10 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser, res = gst_h265_parser_parse_pic_timing (parser, &sei->payload.pic_timing, nr); break; + case GST_H265_SEI_RECOVERY_POINT: + res = gst_h265_parser_parse_recovery_point (parser, + &sei->payload.recovery_point, nr); + break; default: /* Just consume payloadSize bytes, which does not account for emulation prevention bytes */ diff --git a/gst-libs/gst/codecparsers/gsth265parser.h b/gst-libs/gst/codecparsers/gsth265parser.h index c8c0a9806..b4d1901c0 100644 --- a/gst-libs/gst/codecparsers/gsth265parser.h +++ b/gst-libs/gst/codecparsers/gsth265parser.h @@ -220,6 +220,7 @@ typedef enum * GstH265SEIPayloadType: * @GST_H265_SEI_BUF_PERIOD: Buffering Period 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. @@ -227,7 +228,8 @@ typedef enum typedef enum { 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... */ } GstH265SEIPayloadType; @@ -313,6 +315,7 @@ typedef struct _GstH265SliceHdr GstH265SliceHdr; typedef struct _GstH265PicTiming GstH265PicTiming; typedef struct _GstH265BufferingPeriod GstH265BufferingPeriod; +typedef struct _GstH265RecoveryPoint GstH265RecoveryPoint; typedef struct _GstH265SEIMessage GstH265SEIMessage; /** @@ -1063,6 +1066,13 @@ struct _GstH265BufferingPeriod guint8 vcl_initial_alt_cpb_removal_offset[32]; }; +struct _GstH265RecoveryPoint +{ + gint32 recovery_poc_cnt; + guint8 exact_match_flag; + guint8 broken_link_flag; +}; + struct _GstH265SEIMessage { GstH265SEIPayloadType payloadType; @@ -1070,6 +1080,7 @@ struct _GstH265SEIMessage union { GstH265BufferingPeriod buffering_period; GstH265PicTiming pic_timing; + GstH265RecoveryPoint recovery_point; /* ... could implement more */ } payload; }; |