v4l2codecs: h264: Set frame type flags
authorDmitry Osipenko <digetx@gmail.com>
Sun, 16 Jan 2022 12:51:32 +0000 (15:51 +0300)
committerNicolas Dufresne <nicolas@ndufresne.ca>
Fri, 6 May 2022 13:35:59 +0000 (13:35 +0000)
V4L spec now requires decode_params flags to be set in accordance to the
frame's type. In particular this is required by H.264 decoder of NVIDIA
Tegra SoC to operate properly. Set the flags based on type of parsed
slices.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1757>

subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2codech264dec.c
subprojects/gst-plugins-bad/sys/v4l2codecs/linux/v4l2-controls.h

index 406ed79..1b21a8d 100644 (file)
@@ -1291,6 +1291,16 @@ gst_v4l2_codec_h264_dec_decode_slice (GstH264Decoder * decoder,
       slice->nalu.size);
   self->bitstream_map.size += nal_size;
 
+  switch (slice->header.type % 5) {
+    case GST_H264_P_SLICE:
+      self->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_PFRAME;
+      break;
+
+    case GST_H264_B_SLICE:
+      self->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_BFRAME;
+      break;
+  }
+
   return GST_FLOW_OK;
 }
 
index 8fd9a21..aebabac 100644 (file)
@@ -1560,6 +1560,8 @@ struct v4l2_h264_dpb_entry {
 #define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC            0x01
 #define V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC          0x02
 #define V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD       0x04
+#define V4L2_H264_DECODE_PARAM_FLAG_PFRAME             0x08
+#define V4L2_H264_DECODE_PARAM_FLAG_BFRAME             0x10
 
 #define V4L2_CID_STATELESS_H264_DECODE_PARAMS  (V4L2_CID_CODEC_STATELESS_BASE + 7)
 /**