openh264enc: fix broken sps/pps header generation
authorTim-Philipp Müller <tim@centricular.com>
Tue, 20 Apr 2021 18:11:12 +0000 (19:11 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 24 Aug 2021 22:42:27 +0000 (23:42 +0100)
This was putting a truncated SPS into the initial header instead
of the PPS because it was always reading from the beginning of the
bitstream buffer (pBsBuf) and not from the offset where the current
NAL is at in the bitstream buffer (psBsBuf + nal_offset).

This was broken in commit 17113695.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1576

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2178>

ext/openh264/gstopenh264enc.cpp

index b8b80c4919a078b1b5dff79a9118ec193a5dbc66..103794197d87aba3ef288643e2aa5160c5633bcd 100644 (file)
@@ -1042,8 +1042,13 @@ gst_openh264enc_handle_frame (GstVideoEncoder * encoder,
           if (j > 0)
             nal_offset = nal_offset + frame_info.sLayerInfo[i].pNalLengthInByte[j-1];
           nal_type = ((* (frame_info.sLayerInfo[i].pBsBuf + nal_offset + 4)) & 0x1f);
-          if (nal_type == NAL_SPS || nal_type == NAL_PPS)
-            gst_buffer_fill (hdr, nal_offset, frame_info.sLayerInfo[i].pBsBuf, frame_info.sLayerInfo[i].pNalLengthInByte[j]);
+          /* Note: This only works if SPS/PPS are the first two NALs in which case
+           * nal_offset is the same for both the output and the bitstream buffer */
+          if (nal_type == NAL_SPS || nal_type == NAL_PPS) {
+            gst_buffer_fill (hdr, nal_offset,
+                frame_info.sLayerInfo[i].pBsBuf + nal_offset,
+                frame_info.sLayerInfo[i].pNalLengthInByte[j]);
+          }
         }
         headers = g_list_append (headers, gst_buffer_ref (hdr));
     }