mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
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.
This commit is contained in:
parent
db766de135
commit
8d728abd8c
1 changed files with 18 additions and 12 deletions
|
@ -768,7 +768,8 @@ static GstBuffer *
|
||||||
gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
|
gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
|
||||||
{
|
{
|
||||||
x265_nal *nal;
|
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;
|
int header_return;
|
||||||
GstBuffer *buf;
|
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
|
* 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 */
|
* nal units and only copy these tree nal units as the header */
|
||||||
|
|
||||||
for (vps_idx = 0; vps_idx < i_nal; vps_idx++) {
|
vps_idx = sps_idx = pps_idx = -1;
|
||||||
if (nal[vps_idx].type == 32) {
|
for (i = 0; i < i_nal; i++) {
|
||||||
break;
|
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."),
|
GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x265 header failed."),
|
||||||
("x265_encoder_headers did not return VPS, SPS and PPS"));
|
("x265_encoder_headers did not return VPS, SPS and PPS"));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -800,13 +806,13 @@ gst_x265_enc_get_header_buffer (GstX265Enc * encoder)
|
||||||
offset = 0;
|
offset = 0;
|
||||||
buf =
|
buf =
|
||||||
gst_buffer_new_allocate (NULL,
|
gst_buffer_new_allocate (NULL,
|
||||||
nal[vps_idx].sizeBytes + nal[vps_idx + 1].sizeBytes + nal[vps_idx +
|
nal[vps_idx].sizeBytes + nal[sps_idx].sizeBytes + nal[pps_idx].sizeBytes,
|
||||||
2].sizeBytes, NULL);
|
NULL);
|
||||||
for (i = 0; i < i_nal; i++) {
|
gst_buffer_fill (buf, offset, nal[vps_idx].payload, nal[vps_idx].sizeBytes);
|
||||||
gst_buffer_fill (buf, offset, nal[i + vps_idx].payload,
|
offset += nal[vps_idx].sizeBytes;
|
||||||
nal[i + vps_idx].sizeBytes);
|
gst_buffer_fill (buf, offset, nal[sps_idx].payload, nal[sps_idx].sizeBytes);
|
||||||
offset += nal[i + vps_idx].sizeBytes;
|
offset += nal[sps_idx].sizeBytes;
|
||||||
}
|
gst_buffer_fill (buf, offset, nal[pps_idx].payload, nal[pps_idx].sizeBytes);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue