gstreamer/gst/videoparsers/gsth265parse.h
Seungha Yang a24367132b h265parse: Parse mastering display info and content light level from SEI
... and set to caps if necessary.

Note 1) the mastering display info and content light level SEI meessages
are persistent in the corresponding codec video sequence (i.e., GOP).
So any bitstream containing those SEI messages
(and also all pictures are intended to be HDR rendered) should be ensured that
each first slice of codec video sequence follows those SEI messages.

Note 2) The codec video sequence is a group an [IRAP + NoRaslOutputFlag == 1]
and following AUs which are not [IRAP + NoRaslOutputFlag == 1]
The NoRaslOutputFlag is equal to 1 for each IDR AU, BLA AU and some CRA AU.
For a CRA AU to have NoRaslOutputFlag equal to 1, following condition should required.
* When the CRA AU is the first AU in the bitstream in decoding order
* or the CRA AU is the first AU that follows an end of sequence NAL in decoding order
* or the HandleCraAsBlaFlag equal to 1.

Due to the limited context in parse element, in this commint, CRA AU will not considered as
having the NoRaslOutputFlag equal to 1. Therefore, in the worst case,
mastering-display-info and content-light-level could be cleared one GOP after
when stream was chagned from HDR to SDR.
2019-05-03 19:44:15 +00:00

129 lines
3.5 KiB
C

/* GStreamer H.265 Parser
* Copyright (C) 2013 Intel Corporation
* Contact: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GST_H265_PARSE_H__
#define __GST_H265_PARSE_H__
#include <gst/gst.h>
#include <gst/base/gstbaseparse.h>
#include <gst/codecparsers/gsth265parser.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_H265_PARSE \
(gst_h265_parse_get_type())
#define GST_H265_PARSE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_H265_PARSE,GstH265Parse))
#define GST_H265_PARSE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_H265_PARSE,GstH265ParseClass))
#define GST_IS_H265_PARSE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_H265_PARSE))
#define GST_IS_H265_PARSE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_H265_PARSE))
GType gst_h265_parse_get_type (void);
typedef struct _GstH265Parse GstH265Parse;
typedef struct _GstH265ParseClass GstH265ParseClass;
struct _GstH265Parse
{
GstBaseParse baseparse;
/* stream */
gint width, height;
gint fps_num, fps_den;
gint upstream_par_n, upstream_par_d;
gint parsed_par_n, parsed_par_d;
gint parsed_fps_n, parsed_fps_d;
/* current codec_data in output caps, if any */
GstBuffer *codec_data;
/* input codec_data, if any */
GstBuffer *codec_data_in;
guint nal_length_size;
gboolean packetized;
gboolean split_packetized;
gboolean transform;
/* state */
GstH265Parser *nalparser;
guint state;
guint align;
guint format;
gint current_off;
GstClockTime last_report;
gboolean push_codec;
/* The following variables have a meaning in context of "have
* VPS/SPS/PPS to push downstream", e.g. to update caps */
gboolean have_vps;
gboolean have_sps;
gboolean have_pps;
/* per frame vps/sps/pps check for periodic push codec decision */
gboolean have_vps_in_frame;
gboolean have_sps_in_frame;
gboolean have_pps_in_frame;
/* collected SPS and PPS NALUs */
GstBuffer *vps_nals[GST_H265_MAX_VPS_COUNT];
GstBuffer *sps_nals[GST_H265_MAX_SPS_COUNT];
GstBuffer *pps_nals[GST_H265_MAX_PPS_COUNT];
/* Infos we need to keep track of */
guint8 sei_pic_struct;
/* Collected TimeCode SEI */
GstH265TimeCode time_code;
gboolean discont;
/* frame parsing */
gint idr_pos, sei_pos;
gboolean update_caps;
GstAdapter *frame_out;
gboolean keyframe;
gboolean header;
/* AU state */
gboolean picture_start;
/* props */
gint interval;
gboolean sent_codec_tag;
GstClockTime pending_key_unit_ts;
GstEvent *force_key_unit_event;
GstVideoMasteringDisplayInfo mastering_display_info;
guint mastering_display_info_state;
GstVideoContentLightLevel content_light_level;
guint content_light_level_state;
};
struct _GstH265ParseClass
{
GstBaseParseClass parent_class;
};
G_END_DECLS
#endif