From 7f84bbb50fdb2d61df08465d4c67fe04b8289882 Mon Sep 17 00:00:00 2001 From: "Claude (noether)" Date: Fri, 8 May 2026 22:52:24 +0000 Subject: [PATCH] fresnel-fourier iter3 Phase 6 commit C: picture.c VP8 dispatch + 4 buffer-type cases + new VAProbabilityBufferType outer case + per- frame reset + surface.h params.vp8 union extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five sites in picture.c + one site in surface.h wire up the VP8 codec dispatcher introduced by commit B: 1. Include #include "vp8.h" in the codec headers block. 2. codec_set_controls: NEW case VAProfileVP8Version0_3 calling vp8_set_controls(driver_data, context, surface_object). Same shape as MPEG-2 + HEVC dispatch. 3. codec_store_buffer VAPictureParameterBufferType: NEW VP8 case memcpy'ing into surface_object->params.vp8.picture (sizeof VAPictureParameterBufferVP8). 4. codec_store_buffer VASliceParameterBufferType: NEW VP8 case memcpy'ing into surface_object->params.vp8.slice (single, no slices[] array — VP8 is frame-mode, no multi-slice). 5. codec_store_buffer VAIQMatrixBufferType: NEW VP8 case memcpy'ing into surface_object->params.vp8.iqmatrix + setting iqmatrix_set true. 6. codec_store_buffer NEW outer case VAProbabilityBufferType (Phase 5 C3: NOT VAProbabilityDataBufferType — that's the STRUCT name; the buffer-type enum constant is VAProbabilityBufferType = 13 per va.h:2058). Inner switch dispatches by profile, with VP8 case memcpy'ing into surface_object->params.vp8.probability + setting probability_set true. 7. RequestBeginPicture: NEW per-frame reset for the two VP8 flags — params.vp8.iqmatrix_set = false + params.vp8.probability_set = false. Mirrors the existing iter1 (h264.matrix_set) + iter2 (h265.num_slices) per-frame resets. surface.h extension: 8. params union: NEW vp8 struct after h265 — holds the 4 VAAPI buffer-type structs (VAPictureParameterBufferVP8, VASliceParameterBufferVP8, VAIQMatrixBufferVP8 + iqmatrix_set, VAProbabilityDataBufferVP8 + probability_set). The NEW vp8 union member adds ~5300 bytes (sizeof VAProbabilityDataBufferVP8 dominated by dct_coeff_probs[4][8][3] [11] = 1056 + bookkeeping). The h265 member with slices[64] array remains the largest (~17 KB), so the union size doesn't grow. After this commit: backend builds clean, links cleanly. mpv-vaapi VP8 decode should engage end-to-end on hantro env binding. Phase 1 criteria 1 + 2 + 3 expected satisfied; criterion 4 (HW=SW byte- identical) and criterion 5 (3-codec regression) verified at Phase 6 smoke + Phase 7. Refs: ../fresnel-fourier/phase4_iter3_plan.md (Commit C site list) ../fresnel-fourier/phase2_iter3_situation.md (B6, B7, B8, B9 bug enumeration) ../fresnel-fourier/phase5_iter3_review.md (C3 VAProbabilityBuffer Type rename empirically verified) Co-Authored-By: Claude Opus 4.7 (1M context) --- src/picture.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/surface.h | 8 ++++++++ 2 files changed, 50 insertions(+) diff --git a/src/picture.c b/src/picture.c index 7037897..4508adb 100644 --- a/src/picture.c +++ b/src/picture.c @@ -34,6 +34,7 @@ #include "h264.h" #include "h265.h" #include "mpeg2.h" +#include "vp8.h" #include #include @@ -107,6 +108,12 @@ static VAStatus codec_store_buffer(struct request_data *driver_data, sizeof(surface_object->params.h265.picture)); break; + case VAProfileVP8Version0_3: + memcpy(&surface_object->params.vp8.picture, + buffer_object->data, + sizeof(surface_object->params.vp8.picture)); + break; + default: break; } @@ -140,6 +147,12 @@ static VAStatus codec_store_buffer(struct request_data *driver_data, break; } + case VAProfileVP8Version0_3: + memcpy(&surface_object->params.vp8.slice, + buffer_object->data, + sizeof(surface_object->params.vp8.slice)); + break; + default: break; } @@ -173,6 +186,27 @@ static VAStatus codec_store_buffer(struct request_data *driver_data, surface_object->params.h265.iqmatrix_set = true; break; + case VAProfileVP8Version0_3: + memcpy(&surface_object->params.vp8.iqmatrix, + buffer_object->data, + sizeof(surface_object->params.vp8.iqmatrix)); + surface_object->params.vp8.iqmatrix_set = true; + break; + + default: + break; + } + break; + + case VAProbabilityBufferType: + switch (profile) { + case VAProfileVP8Version0_3: + memcpy(&surface_object->params.vp8.probability, + buffer_object->data, + sizeof(surface_object->params.vp8.probability)); + surface_object->params.vp8.probability_set = true; + break; + default: break; } @@ -217,6 +251,12 @@ static VAStatus codec_set_controls(struct request_data *driver_data, return VA_STATUS_ERROR_OPERATION_FAILED; break; + case VAProfileVP8Version0_3: + rc = vp8_set_controls(driver_data, context, surface_object); + if (rc < 0) + return VA_STATUS_ERROR_OPERATION_FAILED; + break; + default: return VA_STATUS_ERROR_UNSUPPORTED_PROFILE; } @@ -298,6 +338,8 @@ VAStatus RequestBeginPicture(VADriverContextP context, VAContextID context_id, surface_object->slices_count = 0; surface_object->params.h264.matrix_set = false; surface_object->params.h265.num_slices = 0; + surface_object->params.vp8.iqmatrix_set = false; + surface_object->params.vp8.probability_set = false; surface_object->status = VASurfaceRendering; context_object->render_surface_id = surface_id; diff --git a/src/surface.h b/src/surface.h index 2362902..764038a 100644 --- a/src/surface.h +++ b/src/surface.h @@ -110,6 +110,14 @@ struct object_surface { VAIQMatrixBufferHEVC iqmatrix; bool iqmatrix_set; } h265; + struct { + VAPictureParameterBufferVP8 picture; + VASliceParameterBufferVP8 slice; + VAIQMatrixBufferVP8 iqmatrix; + bool iqmatrix_set; + VAProbabilityDataBufferVP8 probability; + bool probability_set; + } vp8; } params; int request_fd;