forked from marfrit/libva-v4l2-request-fourier
iter8 Phase 6: γ env-gated CAPTURE buffer diagnostic dump
After RequestSyncSurface DQBUFs CAPTURE and marks slot DECODED, optionally dump first/last 32 bytes of each destination_data plane plus a non-zero count over a per-plane scan window (one MB row for plane 0, 1024 bytes for chroma). Gated behind LIBVA_V4L2_DUMP_CAPTURE=1; default off, no regression on existing flows. Diagnostic for Bug 4 (H.264 partial-fill): distinguishes "kernel didn't write" from "libva mis-reads" from "stale-residue" by inspecting the post-DQBUF buffer state directly. Phase 5 amendments applied: - Amendment 1 (CRIT-1): snprintf-buffered hex line, one request_log call. - Amendment 2 (CRIT-2): dump nested inside current_slot != NULL guard. - Amendment 4 (IMP-3): placed between cap_pool_mark_decoded and status=VASurfaceDisplaying on happy path only. - Amendment 5 (MIN-2): scan window = max(1024 chroma, bpl*16 luma). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+78
-1
@@ -384,10 +384,87 @@ VAStatus RequestSyncSurface(VADriverContextP context, VASurfaceID surface_id)
|
||||
* (→ EXPORTED), the next BeginPicture for this surface (slot is
|
||||
* released first), or DestroySurfaces (release).
|
||||
*/
|
||||
if (surface_object->current_slot != NULL)
|
||||
if (surface_object->current_slot != NULL) {
|
||||
cap_pool_mark_decoded(&driver_data->capture_pool,
|
||||
surface_object->current_slot);
|
||||
|
||||
/*
|
||||
* iter8 Phase 6 (γ): env-gated diagnostic dump of the CAPTURE
|
||||
* buffer immediately after DQBUF + mark_decoded. Distinguishes
|
||||
* "kernel didn't write" from "libva mis-reads" for Bug 4
|
||||
* (H.264 partial-fill). Off by default; enable with
|
||||
* LIBVA_V4L2_DUMP_CAPTURE=1. destination_data[] is valid here
|
||||
* (surface_bind_slot populated it at BeginPicture).
|
||||
*/
|
||||
static const char *dump_env = NULL;
|
||||
static bool dump_env_checked = false;
|
||||
if (!dump_env_checked) {
|
||||
dump_env = getenv("LIBVA_V4L2_DUMP_CAPTURE");
|
||||
dump_env_checked = true;
|
||||
}
|
||||
if (dump_env != NULL && dump_env[0] == '1') {
|
||||
unsigned int p;
|
||||
char hexbuf[128];
|
||||
request_log("γ-dump: surface_id=%u v4l2_index=%u planes=%u\n",
|
||||
(unsigned int)surface_id,
|
||||
surface_object->destination_index,
|
||||
surface_object->destination_planes_count);
|
||||
for (p = 0; p < surface_object->destination_planes_count; p++) {
|
||||
const unsigned char *d = surface_object->destination_data[p];
|
||||
size_t sz = surface_object->destination_sizes[p];
|
||||
size_t scan_lim;
|
||||
unsigned int nz = 0;
|
||||
size_t i;
|
||||
int pos;
|
||||
|
||||
if (d == NULL) {
|
||||
request_log("γ-dump: plane[%u] NULL ptr (size=%zu)\n",
|
||||
p, sz);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Phase 5 MIN-2: scan at least one Y-MB row
|
||||
* (16 lines * bytesperline) for plane 0, else
|
||||
* 1024 bytes for chroma plane.
|
||||
*/
|
||||
if (p == 0) {
|
||||
size_t mbrow =
|
||||
surface_object->destination_bytesperlines[0] * 16;
|
||||
scan_lim = sz < mbrow ? sz : mbrow;
|
||||
} else {
|
||||
scan_lim = sz < 1024 ? sz : 1024;
|
||||
}
|
||||
for (i = 0; i < scan_lim; i++)
|
||||
if (d[i] != 0)
|
||||
nz++;
|
||||
|
||||
request_log("γ-dump: plane[%u] sz=%zu bpl=%u "
|
||||
"scan=%zu non_zero=%u\n",
|
||||
p, sz,
|
||||
surface_object->destination_bytesperlines[p],
|
||||
scan_lim, nz);
|
||||
|
||||
pos = 0;
|
||||
for (i = 0; i < 32 && i < sz; i++)
|
||||
pos += snprintf(hexbuf + pos,
|
||||
sizeof(hexbuf) - pos,
|
||||
"%02x ", d[i]);
|
||||
request_log("γ-dump: plane[%u] head[0..32]: %s\n",
|
||||
p, hexbuf);
|
||||
|
||||
if (sz >= 32) {
|
||||
pos = 0;
|
||||
for (i = 0; i < 32; i++)
|
||||
pos += snprintf(hexbuf + pos,
|
||||
sizeof(hexbuf) - pos,
|
||||
"%02x ", d[sz - 32 + i]);
|
||||
request_log("γ-dump: plane[%u] tail[%zu..%zu]: %s\n",
|
||||
p, sz - 32, sz - 1, hexbuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
surface_object->status = VASurfaceDisplaying;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user