summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorSeungha Yang <seungha.yang@navercorp.com>2018-11-23 11:51:04 +0900
committerNicolas Dufresne <nicolas@ndufresne.ca>2018-11-30 02:19:17 +0000
commit68a5697c1a014051fb7a07aed0bb5dde7d45f9b0 (patch)
treec9b84e9fde14e3f4572568aedae737eb74c33e49 /gst
parent4f7fe897b9be77c983f935538d30a5c90cecc947 (diff)
downloadgstreamer-plugins-bad-68a5697c1a014051fb7a07aed0bb5dde7d45f9b0.tar.gz
h265parse: Don't duplicate VPS/SPS/PPS per config-interval if exists
Don't need to manually insert VPS/SPS/PPS since inband data could be useable. Also fixes #824
Diffstat (limited to 'gst')
-rw-r--r--gst/videoparsers/gsth265parse.c12
-rw-r--r--gst/videoparsers/gsth265parse.h5
2 files changed, 17 insertions, 0 deletions
diff --git a/gst/videoparsers/gsth265parse.c b/gst/videoparsers/gsth265parse.c
index 775cd24cf..edccb3fbb 100644
--- a/gst/videoparsers/gsth265parse.c
+++ b/gst/videoparsers/gsth265parse.c
@@ -184,6 +184,9 @@ gst_h265_parse_reset_frame (GstH265Parse * h265parse)
h265parse->sei_pos = -1;
h265parse->keyframe = FALSE;
h265parse->header = FALSE;
+ h265parse->have_vps_in_frame = FALSE;
+ h265parse->have_sps_in_frame = FALSE;
+ h265parse->have_pps_in_frame = FALSE;
gst_adapter_clear (h265parse->frame_out);
}
@@ -551,6 +554,7 @@ gst_h265_parse_process_nal (GstH265Parse * h265parse, GstH265NalUnit * nalu)
GST_DEBUG_OBJECT (h265parse, "triggering src caps check");
h265parse->update_caps = TRUE;
h265parse->have_vps = TRUE;
+ h265parse->have_vps_in_frame = TRUE;
if (h265parse->push_codec && h265parse->have_pps) {
/* VPS/SPS/PPS found in stream before the first pre_push_frame, no need
* to forcibly push at start */
@@ -580,6 +584,7 @@ gst_h265_parse_process_nal (GstH265Parse * h265parse, GstH265NalUnit * nalu)
GST_DEBUG_OBJECT (h265parse, "triggering src caps check");
h265parse->update_caps = TRUE;
h265parse->have_sps = TRUE;
+ h265parse->have_sps_in_frame = TRUE;
if (h265parse->push_codec && h265parse->have_pps) {
/* SPS and PPS found in stream before the first pre_push_frame, no need
* to forcibly push at start */
@@ -615,6 +620,7 @@ gst_h265_parse_process_nal (GstH265Parse * h265parse, GstH265NalUnit * nalu)
h265parse->update_caps = TRUE;
}
h265parse->have_pps = TRUE;
+ h265parse->have_pps_in_frame = TRUE;
if (h265parse->push_codec && h265parse->have_sps) {
/* SPS and PPS found in stream before the first pre_push_frame, no need
* to forcibly push at start */
@@ -1949,6 +1955,12 @@ gst_h265_parse_handle_vps_sps_pps_nals (GstH265Parse * h265parse,
gboolean send_done = FALSE;
GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ if (h265parse->have_vps_in_frame && h265parse->have_sps_in_frame
+ && h265parse->have_pps_in_frame) {
+ GST_DEBUG_OBJECT (h265parse, "VPS/SPS/PPS exist in frame, will not insert");
+ return TRUE;
+ }
+
if (h265parse->align == GST_H265_PARSE_ALIGN_NAL) {
/* send separate config NAL buffers */
GST_DEBUG_OBJECT (h265parse, "- sending VPS/SPS/PPS");
diff --git a/gst/videoparsers/gsth265parse.h b/gst/videoparsers/gsth265parse.h
index eb82f6ffd..d27aac358 100644
--- a/gst/videoparsers/gsth265parse.h
+++ b/gst/videoparsers/gsth265parse.h
@@ -76,6 +76,11 @@ struct _GstH265Parse
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];