From 8dd33c18079354476ee73fe76c2e7828ba9eabf3a5101cfa2fcfebc66c31f1f5 Mon Sep 17 00:00:00 2001 From: copecone Date: Tue, 2 Jun 2026 21:00:48 +0900 Subject: [PATCH] Apply VFlip to Encoder --- Util/FFmpeg/FFmpegNativeEncoder.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Util/FFmpeg/FFmpegNativeEncoder.cs b/Util/FFmpeg/FFmpegNativeEncoder.cs index 0a5c36b..0c63a54 100644 --- a/Util/FFmpeg/FFmpegNativeEncoder.cs +++ b/Util/FFmpeg/FFmpegNativeEncoder.cs @@ -174,8 +174,12 @@ namespace ADOFAIRenderer.Util.FFmpeg { if (!_isInitialized) throw new InvalidOperationException("인코더가 초기화되지 않았습니다."); - _pSrcFrame->data[0] = buffer; - _pSrcFrame->linesize[0] = _settings.Width * 4; // RGBA = 4 bytes per pixel + // Unity의 Bottom-Left origin 좌표계를 FFmpeg의 Top-Left origin 좌표계로 맞추기 위해 + // 포인터를 마지막 행의 시작 위치로 옮기고 stride(linesize)를 음수(-)로 주어 상하 반전(vflip)을 수행합니다. + // 추가적인 메모리 카피나 GPU 연산 없이 sws_scale 내부에서 초고속으로 상하가 반전됩니다. + int stride = _settings.Width * 4; + _pSrcFrame->data[0] = buffer + stride * (_settings.Height - 1); + _pSrcFrame->linesize[0] = -stride; _pSrcFrame->width = _settings.Width; _pSrcFrame->height = _settings.Height; _pSrcFrame->format = (int)AVPixelFormat.AV_PIX_FMT_RGBA;