iter14 α-16: env-gated OUTPUT bitstream byte dump pre-QBUF
LIBVA_V4L2_DUMP_OUTPUT=<dir> writes source_data[0..slices_size] to <dir>/output_p<profile>_s<surface>_t<ts>.bin immediately before v4l2_queue_buffer OUTPUT. Discriminates whether libva writes the correct H.264/HEVC bitstream bytes (same as kdirect/input file). Off by default. Wrapped in static-cache env check. iter11+12+13 confirmed Bug 4/5 are not in S_EXT_CTRLS payload, not in kernel substrate (RFC v2), not in CPU cache visibility (α-17 sync ioctl works but inert). The remaining libva-side surface is the actual bitstream bytes the kernel reads. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -488,6 +488,49 @@ VAStatus RequestEndPicture(VADriverContextP context, VAContextID context_id)
|
|||||||
if (rc != VA_STATUS_SUCCESS)
|
if (rc != VA_STATUS_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* iter14 α-16: env-gated dump of OUTPUT bitstream bytes immediately
|
||||||
|
* before QBUF. LIBVA_V4L2_DUMP_OUTPUT=<dir> writes source_data[0..
|
||||||
|
* slices_size] to <dir>/output_<profile>_<surface>_<frame>.bin.
|
||||||
|
* Discriminates whether libva writes the same H.264/HEVC slice bytes
|
||||||
|
* as kdirect — if YES, Bug 4/5 are not in the OUTPUT-side; if NO,
|
||||||
|
* narrow to which slice-write path produces the divergence.
|
||||||
|
*
|
||||||
|
* Off by default; no behavior change when env unset.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static const char *dump_env = NULL;
|
||||||
|
static bool dump_env_checked = false;
|
||||||
|
if (!dump_env_checked) {
|
||||||
|
dump_env = getenv("LIBVA_V4L2_DUMP_OUTPUT");
|
||||||
|
dump_env_checked = true;
|
||||||
|
}
|
||||||
|
if (dump_env != NULL && dump_env[0] != '\0' &&
|
||||||
|
surface_object->source_data != NULL &&
|
||||||
|
surface_object->slices_size > 0) {
|
||||||
|
char path[256];
|
||||||
|
snprintf(path, sizeof(path),
|
||||||
|
"%s/output_p%d_s%u_t%llu.bin",
|
||||||
|
dump_env, (int)config_object->profile,
|
||||||
|
(unsigned int)surface_object->base.id,
|
||||||
|
(unsigned long long)context_object->timestamp_counter);
|
||||||
|
FILE *fp = fopen(path, "wb");
|
||||||
|
if (fp != NULL) {
|
||||||
|
size_t w = fwrite(surface_object->source_data,
|
||||||
|
1, surface_object->slices_size,
|
||||||
|
fp);
|
||||||
|
request_log("α-16: dumped %zu bytes to %s "
|
||||||
|
"(slices_count=%u)\n",
|
||||||
|
w, path,
|
||||||
|
surface_object->slices_count);
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
request_log("α-16: fopen(%s) failed: %s\n",
|
||||||
|
path, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rc = v4l2_queue_buffer(driver_data->video_fd, -1, capture_type, NULL,
|
rc = v4l2_queue_buffer(driver_data->video_fd, -1, capture_type, NULL,
|
||||||
surface_object->destination_index, 0,
|
surface_object->destination_index, 0,
|
||||||
surface_object->destination_buffers_count);
|
surface_object->destination_buffers_count);
|
||||||
|
|||||||
Reference in New Issue
Block a user