* - __u32
       - ``slice_group_change_cycle``
       -
-    * - __u8
+    * - struct :c:type:`v4l2_h264_reference`
       - ``ref_pic_list0[32]``
       - Reference picture list after applying the per-slice modifications
-    * - __u8
+    * - struct :c:type:`v4l2_h264_reference`
       - ``ref_pic_list1[32]``
       - Reference picture list after applying the per-slice modifications
     * - __u32
       - ``chroma_offset[32][2]``
       -
 
+``Picture Reference``
+
+.. c:type:: v4l2_h264_reference
+
+.. cssclass:: longtable
+
+.. flat-table:: struct v4l2_h264_reference
+    :header-rows:  0
+    :stub-columns: 0
+    :widths:       1 1 2
+
+    * - __u8
+      - ``fields``
+      - Specifies how the picture is referenced. See :ref:`Reference Fields <h264_ref_fields>`
+    * - __u8
+      - ``index``
+      - Index into the :c:type:`v4l2_ctrl_h264_decode_params`.dpb array.
+
+.. _h264_ref_fields:
+
+``Reference Fields``
+
+.. cssclass:: longtable
+
+.. flat-table::
+    :header-rows:  0
+    :stub-columns: 0
+    :widths:       1 1 2
+
+    * - ``V4L2_H264_TOP_FIELD_REF``
+      - 0x1
+      - The top field in field pair is used for short-term reference.
+    * - ``V4L2_H264_BOTTOM_FIELD_REF``
+      - 0x2
+      - The bottom field in field pair is used for short-term reference.
+    * - ``V4L2_H264_FRAME_REF``
+      - 0x3
+      - The frame (or the top/bottom fields, if it's a field pair)
+        is used for short-term reference.
+
 ``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (struct)``
     Specifies the decode parameters (as extracted from the bitstream)
     for the associated H264 slice data. This includes the necessary
 
 
 static void _cedrus_write_ref_list(struct cedrus_ctx *ctx,
                                   struct cedrus_run *run,
-                                  const u8 *ref_list, u8 num_ref,
-                                  enum cedrus_h264_sram_off sram)
+                                  const struct v4l2_h264_reference *ref_list,
+                                  u8 num_ref, enum cedrus_h264_sram_off sram)
 {
        const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params;
        struct vb2_queue *cap_q;
                int buf_idx;
                u8 dpb_idx;
 
-               dpb_idx = ref_list[i];
+               dpb_idx = ref_list[i].index;
                dpb = &decode->dpb[dpb_idx];
 
                if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE))
 
  */
 #define V4L2_H264_NUM_DPB_ENTRIES 16
 
+#define V4L2_H264_REF_LIST_LEN (2 * V4L2_H264_NUM_DPB_ENTRIES)
+
 /* Our pixel format isn't stable at the moment */
 #define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */
 
 #define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED    0x04
 #define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH             0x08
 
+#define V4L2_H264_TOP_FIELD_REF                                0x1
+#define V4L2_H264_BOTTOM_FIELD_REF                     0x2
+#define V4L2_H264_FRAME_REF                            0x3
+
+struct v4l2_h264_reference {
+       __u8 fields;
+
+       /* Index into v4l2_ctrl_h264_decode_params.dpb[] */
+       __u8 index;
+};
+
 struct v4l2_ctrl_h264_slice_params {
        /* Size in bytes, including header */
        __u32 size;
        __u8 num_ref_idx_l1_active_minus1;
        __u32 slice_group_change_cycle;
 
-       /*
-        * Entries on each list are indices into
-        * v4l2_ctrl_h264_decode_params.dpb[].
-        */
-       __u8 ref_pic_list0[32];
-       __u8 ref_pic_list1[32];
+       struct v4l2_h264_reference ref_pic_list0[V4L2_H264_REF_LIST_LEN];
+       struct v4l2_h264_reference ref_pic_list1[V4L2_H264_REF_LIST_LEN];
 
        __u32 flags;
 };