ampere-av1 Phase 3: SEQUENCE byte-equal kdirect; 3/10 frames PASS bit-exact
Three more fixes after strace-diff localization vs kdirect. Fix 6 — fill_sequence ENABLE_SUPERRES: gate on picture->pic_info_fields.bits.use_superres instead of unconditional set-true. VAAPI doesn't expose enable_superres at sequence level; per strace diff kdirect clears the flag for streams not using superres (byte 1 of flags was the only SEQUENCE diff). After this fix, SEQUENCE ctrl byte-equal kdirect on every call. Fix 7 — refresh_frame_flags = 0xff (was 0): VAAPI doesn't expose refresh_frame_flags. Default 0xff = "refresh all DPB slots" matches kdirect's submission and AV1 spec default for KEY/SWITCH frames; for inter frames simple P-frame chains naturally tolerate this. Fix 8 — surface_object->av1_order_hint per-surface tracking. Set in av1_set_controls from picture->order_hint of the current frame. Also propagated to the linked display surface (when apply_grain=1 → cur_frame != cur_display) so future frames referencing the display surface find the order_hint via the linked_decode_surface_id. Tried + reverted: ref-name iteration of reference_frame_ts / order_hints via picture->ref_frame_idx[i-1] → DPB slot (Kwiboo's convention via FFmpeg's s->ref[i]). Empirically regressed 3/10 → 1/10. V4L2 uAPI's indexing here looks DPB-slot-direct despite the AV1 spec lexicon — needs kernel-side disambiguation to settle. Verification on ampere (av1_larger.ivf 352x288, 10 frames): Frames 0, 2, 4: PASS bit-exact (apply_grain=1, grain HW path) Frames 1, 3, 5-9: DIFF (apply_grain=0) 3/10 PASS (was 1/10 after iter checkpoint). test_av1.ivf 208x208: unchanged bit-exact PASS sha 029ee72c214b37c1 Remaining open: frame 1 (apply_grain=0, first inter) submits IDENTICAL FRAME ctrl bytes to kdirect (verified strace-diff post-fix), yet decoded output diverges. That means the divergence is no longer in control submission — points at OUTPUT-side bitstream differences between ffmpeg-vaapi and ffmpeg-v4l2request, or at DPB CAPTURE buffer state (grain-applied data being used as reference vs pre-grain). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,16 @@ struct object_surface {
|
||||
*/
|
||||
VASurfaceID linked_decode_surface_id;
|
||||
|
||||
/*
|
||||
* AV1 Phase 3: AV1 order_hint of the frame currently decoded into
|
||||
* this surface. VAAPI's VADecPictureParameterBufferAV1.order_hint
|
||||
* is per-frame; kernel's v4l2_ctrl_av1_frame.order_hints[8] is
|
||||
* per-reference. We track each decoded frame's order_hint here so
|
||||
* the next frame's av1_set_controls can populate order_hints[i]
|
||||
* from ref_frame_map[i] → SURFACE → av1_order_hint.
|
||||
*/
|
||||
uint8_t av1_order_hint;
|
||||
|
||||
union {
|
||||
struct {
|
||||
VAPictureParameterBufferMPEG2 picture;
|
||||
|
||||
Reference in New Issue
Block a user