summaryrefslogtreecommitdiff
path: root/ext/x265
diff options
context:
space:
mode:
authorThijs Vermeir <thijs.vermeir@barco.com>2015-05-20 12:11:31 +0200
committerThijs Vermeir <thijsvermeir@gmail.com>2015-05-20 13:16:01 +0200
commit8d728abd8c59270cdd5acdcc42f7e8f7880a4982 (patch)
treec6973748d47434efc3b127e7462b3d7aab3852d4 /ext/x265
parentdb766de13546db60cb09d6a96947ed4ca1eb6854 (diff)
x265enc: Only copy VPS/SPS/PPS NAL units in header buffer
Previously the VPS unit was detected and all next packets where copied into the header buffer assuming only SPS and PPS would follow. This is not always true, also other types of NAL units follow the VPS unit and where copied to the header buffer. Now the VPS/SPS/PPS are explicitely detected and copied in the header buffer.
Diffstat (limited to 'ext/x265')
-rw-r--r--ext/x265/gstx265enc.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/ext/x265/gstx265enc.c b/ext/x265/gstx265enc.c
index 325ab2270..47b95a66a 100644
--- a/ext/x265/gstx265enc.c
+++ b/ext/x265/gstx265enc.c
@@ -768,7 +768,8 @@ static GstBuffer *
gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
{
x265_nal *nal;
- guint32 i_nal, i, offset, vps_idx;
+ guint32 i_nal, i, offset;
+ gint32 vps_idx, sps_idx, pps_idx;
int header_return;
GstBuffer *buf;
@@ -785,13 +786,18 @@ gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
* The usefull headers are sequential (VPS, SPS and PPS), so we look for this
* nal units and only copy these tree nal units as the header */
- for (vps_idx = 0; vps_idx < i_nal; vps_idx++) {
- if (nal[vps_idx].type == 32) {
- break;
+ vps_idx = sps_idx = pps_idx = -1;
+ for (i = 0; i < i_nal; i++) {
+ if (nal[i].type == 32) {
+ vps_idx = i;
+ } else if (nal[i].type == 33) {
+ sps_idx = i;
+ } else if (nal[i].type == 34) {
+ pps_idx = i;
}
}
- if (vps_idx >= i_nal - 3) {
+ if (vps_idx == -1 || sps_idx == -1 || pps_idx == -1) {
GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x265 header failed."),
("x265_encoder_headers did not return VPS, SPS and PPS"));
return FALSE;
@@ -800,13 +806,13 @@ gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
offset = 0;
buf =
gst_buffer_new_allocate (NULL,
- nal[vps_idx].sizeBytes + nal[vps_idx + 1].sizeBytes + nal[vps_idx +
- 2].sizeBytes, NULL);
- for (i = 0; i < i_nal; i++) {
- gst_buffer_fill (buf, offset, nal[i + vps_idx].payload,
- nal[i + vps_idx].sizeBytes);
- offset += nal[i + vps_idx].sizeBytes;
- }
+ nal[vps_idx].sizeBytes + nal[sps_idx].sizeBytes + nal[pps_idx].sizeBytes,
+ NULL);
+ gst_buffer_fill (buf, offset, nal[vps_idx].payload, nal[vps_idx].sizeBytes);
+ offset += nal[vps_idx].sizeBytes;
+ gst_buffer_fill (buf, offset, nal[sps_idx].payload, nal[sps_idx].sizeBytes);
+ offset += nal[sps_idx].sizeBytes;
+ gst_buffer_fill (buf, offset, nal[pps_idx].payload, nal[pps_idx].sizeBytes);
return buf;
}