* - __u16
       - ``pic_num``
       -
+    * - __u8
+      - ``fields``
+      - Specifies how the DPB entry is referenced. See :ref:`Reference Fields <h264_ref_fields>`
     * - __s32
       - ``top_field_order_cnt``
       -
 
     * - ``V4L2_H264_DPB_ENTRY_FLAG_VALID``
       - 0x00000001
-      - The DPB entry is valid and should be considered
+      - The DPB entry is valid (non-empty) and should be considered.
     * - ``V4L2_H264_DPB_ENTRY_FLAG_ACTIVE``
       - 0x00000002
-      - The DPB entry is currently being used as a reference frame
+      - The DPB entry is used for reference.
     * - ``V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM``
       - 0x00000004
-      - The DPB entry is a long term reference frame
+      - The DPB entry is used for long-term reference.
     * - ``V4L2_H264_DPB_ENTRY_FLAG_FIELD``
       - 0x00000008
-      - The DPB entry is a field reference, which means only one of the field
-        will be used when decoding the new frame/field. When not set the DPB
-        entry is a frame reference (both fields will be used). Note that this
-        flag does not say anything about the number of fields contained in the
-        reference frame, it just describes the one used to decode the new
-        field/frame
-    * - ``V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD``
-      - 0x00000010
-      - The DPB entry is a bottom field reference (only the bottom field of the
-        reference frame is needed to decode the new frame/field). Only valid if
-        V4L2_H264_DPB_ENTRY_FLAG_FIELD is set. When
-        V4L2_H264_DPB_ENTRY_FLAG_FIELD is set but
-        V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD is not, that means the
-        DPB entry is a top field reference
+      - The DPB entry is a single field or a complementary field pair.
 
 ``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE (enum)``
     Specifies the decoding mode to use. Currently exposes slice-based and
 
                else
                        b->refs[i].frame_num = dpb[i].frame_num;
 
-               if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD))
+               if (dpb[i].fields == V4L2_H264_FRAME_REF)
                        pic_order_count = min(dpb[i].top_field_order_cnt,
                                              dpb[i].bottom_field_order_cnt);
-               else if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD)
+               else if (dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF)
                        pic_order_count = dpb[i].bottom_field_order_cnt;
                else
                        pic_order_count = dpb[i].top_field_order_cnt;
 
        for (i = 0; i < ARRAY_SIZE(dec_params->dpb); i++) {
                struct vb2_buffer *vb_buf = get_ref_buf(ctx, run, i);
 
-               refer_addr = vb2_dma_contig_plane_dma_addr(vb_buf, 0) |
-                            RKVDEC_COLMV_USED_FLAG_REF;
+               refer_addr = vb2_dma_contig_plane_dma_addr(vb_buf, 0);
 
-               if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD))
-                       refer_addr |= RKVDEC_TOPFIELD_USED_REF |
-                                     RKVDEC_BOTFIELD_USED_REF;
-               else if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD)
-                       refer_addr |= RKVDEC_BOTFIELD_USED_REF;
-               else
+               if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)
+                       refer_addr |= RKVDEC_COLMV_USED_FLAG_REF;
+               if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD)
+                       refer_addr |= RKVDEC_FIELD_REF;
+
+               if (dpb[i].fields & V4L2_H264_TOP_FIELD_REF)
                        refer_addr |= RKVDEC_TOPFIELD_USED_REF;
+               if (dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF)
+                       refer_addr |= RKVDEC_BOTFIELD_USED_REF;
 
                writel_relaxed(dpb[i].top_field_order_cnt,
                               rkvdec->regs +  poc_reg_tbl_top_field[i]);
 
 #define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE                0x02
 #define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM     0x04
 #define V4L2_H264_DPB_ENTRY_FLAG_FIELD         0x08
-#define V4L2_H264_DPB_ENTRY_FLAG_BOTTOM_FIELD  0x10
 
 struct v4l2_h264_dpb_entry {
        __u64 reference_ts;
        __u16 frame_num;
        __u16 pic_num;
+       __u8 fields;
        /* Note that field is indicated by v4l2_buffer.field */
        __s32 top_field_order_cnt;
        __s32 bottom_field_order_cnt;