diff --git a/src/config.c b/src/config.c index b4c6cfb..a0da521 100644 --- a/src/config.c +++ b/src/config.c @@ -36,6 +36,7 @@ #include +#include "codec.h" #include "utils.h" #include "v4l2.h" @@ -97,6 +98,15 @@ VAStatus RequestCreateConfig(VADriverContextP context, VAProfile profile, config_object->profile = profile; config_object->entrypoint = entrypoint; + /* + * iter5b: cache the V4L2 OUTPUT-side FOURCC for this profile so + * surface.c::CreateSurfaces2 can read it without re-running the + * profile→pixelformat mapping. Wires up the previously-dead + * pixelformat field at config.h:46. Returns 0 for unhandled + * profiles, which the switch above already rejects via + * VA_STATUS_ERROR_UNSUPPORTED_PROFILE. + */ + config_object->pixelformat = pixelformat_for_profile(profile); config_object->attributes[0].type = VAConfigAttribRTFormat; config_object->attributes[0].value = VA_RT_FORMAT_YUV420; config_object->attributes_count = 1; diff --git a/src/request.h b/src/request.h index ac1f419..b0c2045 100644 --- a/src/request.h +++ b/src/request.h @@ -96,9 +96,23 @@ struct request_data { * probes with small surfaces then re-allocates at real * resolution; we re-set the OUTPUT format whenever this pair * changes). + * + * iter5b: extended with last_output_pixelformat so the gate + * also fires on codec change (consumer decodes H.264 first, + * HEVC second on the same driver_data). Pre-iter5b the OUTPUT + * pixel format was hardcoded V4L2_PIX_FMT_H264_SLICE in + * CreateSurfaces2, so codec change was silent and HEVC / VP9 / + * VP8 saw the kernel hantro driver substitute MPEG2_DECODER + * codec_mode (when bound to hantro) or rkvdec silently drop + * the decode (when bound to rkvdec). Same bug class as iter4's + * unconditional h264_start_code; both fixes thread the active + * profile into codec-specific kernel state. + * + * 0 = uninitialized; non-zero = FOURCC of current OUTPUT format. */ unsigned int last_output_width; unsigned int last_output_height; + unsigned int last_output_pixelformat; }; VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context);