From 4b3c21b105d34e45742773dfd5b6a699ee270ab0 Mon Sep 17 00:00:00 2001 From: claude-noether Date: Thu, 14 May 2026 16:13:11 +0000 Subject: [PATCH] iter33 DIAG: env-gated dump of v4l2_ctrl_vp8_frame contents LIBVA_VP8_DUMP_FRAME=1 prints the v4l2_ctrl_vp8_frame struct fields to stderr before VIDIOC_S_EXT_CTRLS. Goal: diff libva-side struct against expected kdirect-side values for VP8 frame-2+ divergence (libva produces non-trivial but wrong output; kdirect VP8 byte-equal to SW). Env-gated, no behavior change otherwise. --- src/vp8.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/vp8.c b/src/vp8.c index cc4abdf..3e94032 100644 --- a/src/vp8.c +++ b/src/vp8.c @@ -59,6 +59,8 @@ #include #include +#include +#include #include #include @@ -244,6 +246,64 @@ int vp8_set_controls(struct request_data *driver_data, if (picture->pic_fields.bits.sign_bias_alternate) frame.flags |= V4L2_VP8_FRAME_FLAG_SIGN_BIAS_ALT; + /* iter33 DIAG: dump v4l2_ctrl_vp8_frame contents. + * LIBVA_VP8_DUMP_FRAME=1 enables. */ + if (getenv("LIBVA_VP8_DUMP_FRAME")) { + uint8_t *p = (uint8_t *)&frame; + uint32_t k; + fprintf(stderr, + "vp8: width=%u height=%u version=%u flags=0x%llx num_dct=%u\n", + frame.width, frame.height, frame.version, + (unsigned long long)frame.flags, frame.num_dct_parts); + fprintf(stderr, + "vp8: first_part_size=%u first_part_header_bits=%u prob_skip_false=%u prob_intra=%u prob_last=%u prob_gf=%u\n", + frame.first_part_size, frame.first_part_header_bits, + frame.prob_skip_false, frame.prob_intra, + frame.prob_last, frame.prob_gf); + fprintf(stderr, + "vp8: lf level=%u sharpness=%u flags=0x%x ref_frm_delta=[%d %d %d %d] mb_mode_delta=[%d %d %d %d]\n", + frame.lf.level, frame.lf.sharpness_level, frame.lf.flags, + frame.lf.ref_frm_delta[0], frame.lf.ref_frm_delta[1], + frame.lf.ref_frm_delta[2], frame.lf.ref_frm_delta[3], + frame.lf.mb_mode_delta[0], frame.lf.mb_mode_delta[1], + frame.lf.mb_mode_delta[2], frame.lf.mb_mode_delta[3]); + fprintf(stderr, + "vp8: quant y_ac=%u y_dc_d=%d y2_dc_d=%d y2_ac_d=%d uv_dc_d=%d uv_ac_d=%d\n", + frame.quant.y_ac_qi, frame.quant.y_dc_delta, + frame.quant.y2_dc_delta, frame.quant.y2_ac_delta, + frame.quant.uv_dc_delta, frame.quant.uv_ac_delta); + fprintf(stderr, + "vp8: seg flags=0x%x quant_update=[%d %d %d %d] lf_update=[%d %d %d %d]\n", + frame.segment.flags, + frame.segment.quant_update[0], frame.segment.quant_update[1], + frame.segment.quant_update[2], frame.segment.quant_update[3], + frame.segment.lf_update[0], frame.segment.lf_update[1], + frame.segment.lf_update[2], frame.segment.lf_update[3]); + fprintf(stderr, + "vp8: coder range=%u value=%u bit_count=%u\n", + frame.coder_state.range, frame.coder_state.value, + frame.coder_state.bit_count); + fprintf(stderr, "vp8: dct_part_sizes=["); + for (k = 0; k < 8; k++) + fprintf(stderr, "%u%s", frame.dct_part_sizes[k], + k < 7 ? " " : "]\n"); + fprintf(stderr, + "vp8: refs last=%llu golden=%llu alt=%llu\n", + (unsigned long long)frame.last_frame_ts, + (unsigned long long)frame.golden_frame_ts, + (unsigned long long)frame.alt_frame_ts); + fprintf(stderr, "vp8: entropy y_mode_probs=[%u %u %u %u] uv_mode_probs=[%u %u %u]\n", + frame.entropy.y_mode_probs[0], frame.entropy.y_mode_probs[1], + frame.entropy.y_mode_probs[2], frame.entropy.y_mode_probs[3], + frame.entropy.uv_mode_probs[0], frame.entropy.uv_mode_probs[1], + frame.entropy.uv_mode_probs[2]); + fprintf(stderr, "vp8: coeff_probs[0][0][0][0..11]="); + for (k = 0; k < 11; k++) + fprintf(stderr, "%u ", frame.entropy.coeff_probs[0][0][0][k]); + fprintf(stderr, "\n"); + (void)p; + } + /* Clause 1+10: single-control batched submission */ struct v4l2_ext_control ctrls[1] = { {