From 4892656b3fa27e526f078b3d89e1b4283170a43d Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Tue, 5 May 2026 13:44:56 +0000 Subject: [PATCH] iter4 DEBUG: pre-S_EXT_CTRLS DPB census + per-entry dump Inline log of DECODE_PARAMS.flags, sps.max_num_ref_frames, dpb counts (valid/active/long-term/internally-used), and per-entry frame_num / pic_num / fields / reference_ts immediately before each S_EXT_CTRLS submission. Used in iter4 Phase 4 to identify (a) the dpb->fields=0 bug and (b) the stale-entry growth bug. Stays in for iter4 Phase 4 continuation (at least one more bug still produces EINVAL after frame ~20). Remove at iter5 DEBUG sweep alongside iter1 ENTER/CAPTURE-dump and iter3 Y2. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/h264.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/h264.c b/src/h264.c index ffc6ba2..9270233 100644 --- a/src/h264.c +++ b/src/h264.c @@ -993,6 +993,37 @@ int h264_set_controls(struct request_data *driver_data, unsigned int num_controls = 0; const bool slice_based = false; /* TODO: probe via context->decode_mode */ + /* DEBUG iter4: dump DPB census + DECODE_PARAMS.flags before submission. */ + { + unsigned int dpb_valid = 0, dpb_used = 0, dpb_active = 0, dpb_lt = 0; + for (int i = 0; i < H264_DPB_SIZE; i++) { + struct v4l2_h264_dpb_entry *e = &decode.dpb[i]; + if (e->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID) dpb_valid++; + if (e->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) dpb_active++; + if (e->flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) dpb_lt++; + } + for (int i = 0; i < H264_DPB_SIZE; i++) + if (context->dpb.entries[i].used) dpb_used++; + request_log("iter4 dbg: pre-S_EXT_CTRLS: decode.flags=0x%02x decode.frame_num=%u decode.nal_ref_idc=%u " + "decode.TopFOC=%d sps.max_refs=%u " + "dpb_valid=%u/active=%u/long=%u (ours_used=%u) sps.profile=%u sps.poc_type=%u " + "ref_l0_minus1=%u ref_l1_minus1=%u\n", + decode.flags, decode.frame_num, decode.nal_ref_idc, + decode.top_field_order_cnt, sps.max_num_ref_frames, + dpb_valid, dpb_active, dpb_lt, dpb_used, + sps.profile_idc, sps.pic_order_cnt_type, + pps.num_ref_idx_l0_default_active_minus1, + pps.num_ref_idx_l1_default_active_minus1); + for (int i = 0; i < H264_DPB_SIZE; i++) { + struct v4l2_h264_dpb_entry *e = &decode.dpb[i]; + if (!(e->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID)) + continue; + request_log(" dpb[%d]: ts=%llu frame_num=%u pic_num=%u fields=0x%x flags=0x%x TopFOC=%d\n", + i, (unsigned long long)e->reference_ts, e->frame_num, e->pic_num, + e->fields, e->flags, e->top_field_order_cnt); + } + } + controls[num_controls].id = V4L2_CID_STATELESS_H264_SPS; controls[num_controls].p_h264_sps = &sps; controls[num_controls].size = sizeof(sps);