diff --git a/src/surface.c b/src/surface.c index 44b4325..341637c 100644 --- a/src/surface.c +++ b/src/surface.c @@ -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;