Changes in version 0.1.3 (2026-03-23) TIFF scaling - New tiff_scale parameter in av1r_options() for explicit control of TIFF/image sequence output resolution. Supports multiplier (e.g. 2 for 2x) or bounding box (e.g. c(1920, 1080) to fit into 1080p). Aspect ratio is always preserved — no distortion. - Frames smaller than hardware minimum (VAAPI: 320x128) are automatically scaled up proportionally across all backends (CPU, VAAPI, Vulkan). - Example script: inst/examples/tiff_scale.R. Batch conversion - New example script inst/examples/batch_convert.R for batch folder conversion with summary table (input/output size, compression ratio). - tiff_crf parameter (default 5) automatically applied to TIFF/image input for near-lossless microscopy encoding. Overrides crf. - verbose option controls informational messages. Quality control architecture - Each backend now uses the approach best suited to its rate control: - CPU (SVT-AV1): CRF passed directly — SVT-AV1 adapts to content - Vulkan: CRF passed directly as QP — CQP mode (RADV limitation) - VAAPI: 55% of input video bitrate via ffprobe — adapts to content - Removed calibration table approach (0.1.3-dev): empirical testing showed fixed CRF→bitrate tables are content-dependent and break on different input formats (MP4 vs AVI). Adaptive approach is simpler and more robust. - Vulkan CQP limitation documented: RADV only supports constant quantizer (no VBR/CRF), resulting in ~0.93 SSIM vs ~0.96 for CPU/VAAPI at the same bitrate. This is a driver limitation, not a bug. CPU encoding fixes - SVT-AV1 preset and thread count now passed via -svtav1-params instead of -preset and -threads which had no effect on libsvtav1. - Added -pix_fmt yuv420p for explicit pixel format. Audio preservation - CPU path now preserves audio tracks from input files (-c:a copy) instead of stripping them (-an). TIFF inputs still use -an since they have no audio. Benchmark improvements - Added "vs CPU" column showing speedup relative to CPU backend. - Added calibration scripts: calibrate_crf.R, calibrate_raw.R, calibrate_vaapi_bitrate.R for measuring backend response curves. Changes in version 0.1.2 (2026-03-05) Minimum coded extent handling - GPU encoder now queries minCodedExtent from the Vulkan driver before opening the ffmpeg decode pipe. Input frames smaller than the hardware minimum (e.g. 170×196 vs driver minimum 320×128) are automatically scaled up to the minimum supported resolution. - Vulkan context is initialized before the ffmpeg pipe so that the corrected dimensions are used for both decoding and encoding. - Fixed segfault in av1r_vulkan_query_min_extent(): the VkVideoEncodeAV1CapabilitiesKHR structure was missing from the pNext chain passed to vkGetPhysicalDeviceVideoCapabilitiesKHR, causing RADV to write to an unmapped address. CRF / QIndex mapping - CRF-to-QIndex mapping changed from linear (crf * 4) to nonlinear LUT approximating aomenc --cq-level. Linear mapping gave qIndex 112 at CRF 28 which was too low for real compression on RADV. The new mapping gives qIndex 175 at CRF 28, matching expected AV1 compression ratios. - On RADV, VBR mode is reported as supported but produces huge files; DISABLED mode (CQP) with constantQIndex is the only working path. Changes in version 0.1.1 Vulkan AV1 GPU Encoding — fully working - GPU encoding now works end-to-end on AMD RDNA4 (RX 9070, RADV GFX1201) via Vulkan VK_KHR_VIDEO_ENCODE_AV1. - Two-queue architecture: transfer queue (buffer→image upload) + encode queue (video encoding) with semaphore synchronization. Fixes VK_ERROR_DEVICE_LOST on GPUs where the encode queue has no TRANSFER capability. - Correct NV12 upload: Y plane and UV plane copied as separate vkCmdCopyBufferToImage calls with proper bufferRowLength for each plane. - Sequence Header OBU automatically prepended via vkGetEncodedVideoSessionParametersKHR — output plays in all players. - Rate control: DISABLED mode (CQP) with constantQIndex derived from CRF (qIndex = crf * 4). VBR/CBR modes are reported as supported by RADV but have no effect; CQP is the only working mode. - Audio track from the original file is preserved during IVF→MP4 muxing. - Dynamic loading of all Vulkan Video KHR extension functions via vkGetInstanceProcAddr/vkGetDeviceProcAddr for compatibility with SDK < 1.3.290. Multi-page TIFF support - Multi-page TIFF stacks are now extracted to a temporary PNG sequence via the magick package before encoding. Both GPU and CPU paths support this. - magick added to Suggests (required only for multi-page TIFF input). - Image sequences (printf patterns like frame%06d.png) are passed to ffmpeg with -framerate for correct decoding. - Tested on 510-frame 16-bit grayscale confocal microscopy TIFF stack (32.7 MB → 3.8 MB at CRF 1, 8.6x compression with quality preservation). CRAN Fixes - Removed redundant "A tool for" from Description. - Single-quoted software and API names in Title and Description per CRAN policy. - Replaced \dontrun{} with \donttest{} in all examples. - Examples now write to tempdir() instead of user's home filespace. Bundled Headers - Bundled Khronos VK_KHR_video_encode_av1 headers (src/vk_video/) — package no longer requires Vulkan SDK >= 1.3.290 at build time; builds against any Vulkan SDK >= 1.3.275 with the bundled polyfill. - configure now detects bundled AV1 encode headers and enables GPU path automatically. Initial Release - CPU encoding via FFmpeg (libsvtav1). - Automatic backend selection: GPU (Vulkan) → CPU (FFmpeg). - Supports H.264, H.265, AVI/MJPEG, TIFF stacks, and TIFF sequences as input. - convert_to_av1() for single-file and batch conversion. - detect_backend(), vulkan_available(), vulkan_devices() for diagnostics.