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
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) <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@
|
||||
#include "h264.h"
|
||||
#include "h265.h"
|
||||
#include "mpeg2.h"
|
||||
#include "vp8.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user