diff --git a/src/h264.c b/src/h264.c index ba29c5d..34f5025 100644 --- a/src/h264.c +++ b/src/h264.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -259,6 +260,42 @@ static void h264_va_picture_to_v4l2(struct request_data *driver_data, * the OUTPUT bitstream — a hypothesis verified empirically by * running this patch and inspecting the CAPTURE buffer. */ + /* + * DEBUG INSTRUMENTATION (0014): dump the raw bytes of + * VAPicture->CurrPic plus sizeof(VAPictureH264) so we can + * tell whether the observed TopFieldOrderCnt=65536 anomaly is + * (a) at the documented byte-offset 12 (ffmpeg-side bug or + * intentional non-spec encoding) or + * (b) at a different offset (libva ABI / VA_PADDING_LOW + * mismatch between ffmpeg's writer and our reader). + * + * Documented VAPictureH264 layout (libva-2.x): + * offset 0: VASurfaceID picture_id (uint32) + * offset 4: uint32 frame_idx + * offset 8: uint32 flags + * offset 12: int32 TopFieldOrderCnt + * offset 16: int32 BottomFieldOrderCnt + * offset 20+: uint32 va_reserved[VA_PADDING_LOW] + */ + { + const unsigned char *cp = (const unsigned char *)&VAPicture->CurrPic; + char hex[32 * 3 + 1] = { 0 }; + unsigned int i; + for (i = 0; i < 32; i++) + snprintf(hex + i * 3, 4, " %02x", cp[i]); + request_log("VAPictureH264 sizeof=%zu CurrPic[0..31]:%s\n", + sizeof(VAPictureH264), hex); + request_log("VAPictureH264 CurrPic field reads: " + "picture_id=0x%08x frame_idx=%u flags=0x%x " + "TopFOC=%d BottomFOC=%d frame_num=%u\n", + (unsigned)VAPicture->CurrPic.picture_id, + (unsigned)VAPicture->CurrPic.frame_idx, + (unsigned)VAPicture->CurrPic.flags, + (int)VAPicture->CurrPic.TopFieldOrderCnt, + (int)VAPicture->CurrPic.BottomFieldOrderCnt, + (unsigned)VAPicture->frame_num); + } + decode->nal_ref_idc = nal_ref_idc; decode->frame_num = VAPicture->frame_num; decode->top_field_order_cnt = VAPicture->CurrPic.TopFieldOrderCnt;