# VavCore AV1 Static Library - Revised Implementation Plan ## πŸ“š **라이브러리 κ°œμš”** ### **VavCore**: Vav2Player 기반 AV1 λ””μ½”λ”© 라이브러리 - **기반**: κ²€μ¦λœ Vav2Player μ½”λ“œλ² μ΄μŠ€μ—μ„œ 핡심 λͺ¨λ“ˆ μΆ”μΆœ - **λͺ©ν‘œ**: Godot μ—”μ§„ 톡합을 μœ„ν•œ C API 제곡 - **νŠΉμ§•**: μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄, ν•˜λ“œμ›¨μ–΄ 가속, ν”Œλž«νΌ 독립성 ## πŸ—οΈ **톡합 μ•„ν‚€ν…μ²˜ 섀계** ### **Visual Studio μ†”λ£¨μ…˜ ꡬ쑰** ``` Vav2Player.sln # 톡합 μ†”λ£¨μ…˜ β”œβ”€β”€ VavCore/ # Static Library Project β”‚ β”œβ”€β”€ VavCore.vcxproj # C API 라이브러리 ν”„λ‘œμ νŠΈ β”‚ β”œβ”€β”€ include/VavCore/ β”‚ β”‚ β”œβ”€β”€ VavCore.h # C API 메인 헀더 β”‚ β”‚ β”œβ”€β”€ VideoTypes.h # 데이터 ꡬ쑰체 β”‚ β”‚ └── IVideoDecoder.h # 디코더 μΈν„°νŽ˜μ΄μŠ€ β”‚ └── src/ β”‚ β”œβ”€β”€ VavCore.cpp # C API κ΅¬ν˜„ β”‚ β”œβ”€β”€ Decoder/ # 디코더 λͺ¨λ“ˆ (from Vav2Player) β”‚ β”‚ β”œβ”€β”€ AV1Decoder.h/.cpp β”‚ β”‚ β”œβ”€β”€ AdaptiveAV1Decoder.h/.cpp β”‚ β”‚ β”œβ”€β”€ AdaptiveNVDECDecoder.h/.cpp β”‚ β”‚ β”œβ”€β”€ NVDECAV1Decoder.h/.cpp β”‚ β”‚ β”œβ”€β”€ MediaFoundationAV1Decoder.h/.cpp β”‚ β”‚ └── VideoDecoderFactory.h/.cpp β”‚ β”œβ”€β”€ FileIO/ # 파일 I/O λͺ¨λ“ˆ β”‚ β”‚ └── WebMFileReader.h/.cpp β”‚ └── Common/ # 곡톡 μœ ν‹Έλ¦¬ν‹° β”‚ └── [utility files] β”œβ”€β”€ Vav2Player/ # WinUI3 GUI Application β”‚ β”œβ”€β”€ Vav2Player.vcxproj # GUI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ νŠΈ β”‚ └── src/ # GUI 및 λ Œλ”λ§ μ „μš© β”‚ β”œβ”€β”€ UI/ # WinUI3 κ΄€λ ¨ νŒŒμΌλ“€ β”‚ └── Rendering/ # D3D12 λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ β”œβ”€β”€ Vav2PlayerHeadless/ # Console Test Application β”‚ β”œβ”€β”€ Vav2PlayerHeadless.vcxproj # ν—€λ“œλ¦¬μŠ€ ν…ŒμŠ€νŠΈ ν”„λ‘œμ νŠΈ β”‚ └── src/ # VavCore 기반 μ½˜μ†” ν…ŒμŠ€νŠΈ β”œβ”€β”€ Vav2UnitTest/ # Unit Test Project β”‚ β”œβ”€β”€ Vav2UnitTest.vcxproj # λ‹¨μœ„ ν…ŒμŠ€νŠΈ ν”„λ‘œμ νŠΈ β”‚ └── tests/ # VavCore 및 톡합 ν…ŒμŠ€νŠΈ └── README.md # μ†”λ£¨μ…˜ 전체 λ¬Έμ„œ ``` ### **ν”„λ‘œμ νŠΈ μ—­ν•  뢄리** #### **VavCore (Static Library)** - **순수 λ””μ½”λ”© 라이브러리**: AV1 λ””μ½”λ”© μ „λ¬Έ - **C API 제곡**: ν”Œλž«νΌ 독립적 μΈν„°νŽ˜μ΄μŠ€ - **κ²€μ¦λœ 디코더듀**: Vav2Playerμ—μ„œ μ΄μ „ν•œ λͺ¨λ“  디코더 - **μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄**: ν•˜λ“œμ›¨μ–΄ 가속 및 μ„±λŠ₯ μ΅œμ ν™” #### **Vav2Player (GUI Application)** - **VavCore μ†ŒλΉ„μž**: C APIλ₯Ό ν†΅ν•œ λ””μ½”λ”© μš”μ²­ - **WinUI3 GUI**: μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ 및 컨트둀 - **D3D12 λ Œλ”λ§**: GPU 기반 λΉ„λ””μ˜€ λ Œλ”λ§ - **톡합 ν…ŒμŠ€νŠΈ**: μ‹€μ œ μ‚¬μš©μž κ²½ν—˜ 검증 #### **Vav2PlayerHeadless (Console Application)** - **VavCore ν…ŒμŠ€νŠΈ**: 순수 λ””μ½”λ”© μ„±λŠ₯ λ²€μΉ˜λ§ˆν‚Ή - **μžλ™ν™” ν…ŒμŠ€νŠΈ**: CI/CD νŒŒμ΄ν”„λΌμΈ 톡합 - **μ„±λŠ₯ μΈ‘μ •**: λ””μ½”λ”© μ „μš© μ„±λŠ₯ 뢄석 #### **Vav2UnitTest (Test Project)** - **VavCore λ‹¨μœ„ ν…ŒμŠ€νŠΈ**: 디코더별 κ°œλ³„ ν…ŒμŠ€νŠΈ - **톡합 ν…ŒμŠ€νŠΈ**: GUI와 ν—€λ“œλ¦¬μŠ€ λͺ¨λ“œ 톡합 검증 - **μ„±λŠ₯ νšŒκ·€ ν…ŒμŠ€νŠΈ**: 버전별 μ„±λŠ₯ 비ꡐ ## 🎯 **C API 섀계 - Godot/C# 톡합 μ΅œμ ν™”** ### **핡심 C API** ```cpp // Library initialization VAVCORE_API VavCoreResult vavcore_initialize(void); VAVCORE_API void vavcore_cleanup(void); // Player lifecycle VAVCORE_API VavCorePlayer* vavcore_create_player(void); VAVCORE_API void vavcore_destroy_player(VavCorePlayer* player); // File operations VAVCORE_API VavCoreResult vavcore_open_file(VavCorePlayer* player, const char* filepath); VAVCORE_API VavCoreResult vavcore_decode_next_frame(VavCorePlayer* player, VavCoreVideoFrame* frame); // Quality control (from adaptive decoders) VAVCORE_API VavCoreResult vavcore_set_quality_mode(VavCorePlayer* player, VavCoreQualityMode mode); VAVCORE_API VavCoreResult vavcore_get_performance_metrics(VavCorePlayer* player, VavCorePerformanceMetrics* metrics); ``` ### **C# λž˜ν•‘ 라이브러리 섀계 (μΈν•˜μš°μŠ€ μ „μš©)** ```csharp // VavCore.Wrapper - λ‚΄λΆ€ ν”„λ‘œμ νŠΈμš© C# 래퍼 namespace VavCore.Wrapper { public static class VavCoreLibrary { [DllImport("VavCore.dll")] private static extern VavCoreResult vavcore_initialize(); [DllImport("VavCore.dll")] private static extern IntPtr vavcore_create_player(); [DllImport("VavCore.dll")] private static extern VavCoreResult vavcore_decode_next_frame( IntPtr player, out VavCoreVideoFrame frame); public static bool Initialize() => vavcore_initialize() == VavCoreResult.Success; } public class VavCorePlayer : IDisposable { private IntPtr _playerHandle; public VavCorePlayer() { _playerHandle = VavCoreLibrary.vavcore_create_player(); } public bool OpenFile(string filepath) => VavCoreLibrary.vavcore_open_file(_playerHandle, filepath) == VavCoreResult.Success; public bool DecodeNextFrame(out VavCoreVideoFrame frame) => VavCoreLibrary.vavcore_decode_next_frame(_playerHandle, out frame) == VavCoreResult.Success; // Godot νŠΉν™” λ©”μ„œλ“œ - YUV 데이터 직접 제곡 public bool GetYUVFrameData(out VavCoreVideoFrame yuvFrame) { return DecodeNextFrame(out yuvFrame); } public void Dispose() => VavCoreLibrary.vavcore_destroy_player(_playerHandle); } } ``` ## πŸ“¦ **Godot 톡합 μ „λž΅** ### **λ Œλ”λ§ 뢄리 섀계 μ² ν•™** VavCoreλŠ” **λ””μ½”λ”© μ „μš©**으둜 μ„€κ³„λ˜μ–΄ Godot의 λ Œλ”λ§ μ‹œμŠ€ν…œκ³Ό μ™„λ²½ν•˜κ²Œ λΆ„λ¦¬λ©λ‹ˆλ‹€. #### **VavCore μ—­ν• **: λ””μ½”λ”© 및 데이터 제곡 - βœ… AV1 λΉ„λ””μ˜€ λ””μ½”λ”© (YUV ν”„λ ˆμž„ 생성) - βœ… μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄ - βœ… ν•˜λ“œμ›¨μ–΄ 가속 λ””μ½”λ”© - βœ… C APIλ₯Ό ν†΅ν•œ YUV 데이터 제곡 #### **Godot μ—­ν• **: λ Œλ”λ§ 및 ν‘œμ‹œ - βœ… **YUV ν…μŠ€μ²˜ 생성**: 3개 ν…μŠ€μ²˜ (Y, U, V ν”Œλ ˆμΈ)둜 GPU μ—…λ‘œλ“œ - βœ… **GPU 셰이더 λ³€ν™˜**: YUV β†’ RGB λ³€ν™˜μ„ GPU μ…°μ΄λ”μ—μ„œ μ‹€μ‹œκ°„ 처리 - βœ… **λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ**: Godot λ„€μ΄ν‹°λΈŒ λ Œλ”λ§ μ‹œμŠ€ν…œ ν™œμš© - βœ… **UI 톡합**: VideoStreamPlayer λ˜λŠ” μ»€μŠ€ν…€ Control λ…Έλ“œ μ‚¬μš© - βœ… **μ„±λŠ₯ μ΅œμ ν™”**: GPU 병렬 처리둜 κ³ μ„±λŠ₯ λ³€ν™˜ 및 λ Œλ”λ§ ### **Vav2Player λ Œλ”λ§ μ½”λ“œ ν™œμš© μ „λž΅** #### **직접 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 이유** - ❌ **ν”Œλž«νΌ 쒅속성**: D3D12/WinUIλŠ” Godotκ³Ό ν˜Έν™˜ λΆˆκ°€ - ❌ **μ•„ν‚€ν…μ²˜ 좩돌**: Godot λ Œλ”λ§ μ‹œμŠ€ν…œκ³Ό κ°„μ„­ - ❌ **λ³΅μž‘μ„± 증가**: 두 λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ λ™μ‹œ 관리 #### **μž¬ν™œμš© κ°€λŠ₯ν•œ 핡심 μ•Œκ³ λ¦¬μ¦˜ (참쑰용)** ```glsl // Vav2Player SimpleGPURendererμ—μ„œ μΆ”μΆœ κ°€λŠ₯ν•œ λ Œλ”λ§ λ‘œμ§λ“€ 1. GPU 셰이더 YUVβ†’RGB λ³€ν™˜ (BT.709 λ³€ν™˜ 맀트릭슀) 2. AspectFit 계산 둜직 (λΉ„μœ¨ μœ μ§€ λ Œλ”λ§) 3. YUV ν…μŠ€μ²˜ μ—…λ‘œλ“œ μ΅œμ ν™” νŒ¨ν„΄ 4. ν”„λ ˆμž„ 버퍼링 및 동기화 μ „λž΅ // Godot 셰이더 μ˜ˆμ‹œ (Vav2Player 둜직 기반) shader_type canvas_item; uniform sampler2D y_texture : source_color; uniform sampler2D u_texture : source_color; uniform sampler2D v_texture : source_color; void fragment() { float y = texture(y_texture, UV).r; float u = texture(u_texture, UV).r; float v = texture(v_texture, UV).r; // BT.709 YUV to RGB conversion (from SimpleGPURenderer) y = (y - 16.0/255.0) * 255.0/(235.0-16.0); u = (u - 128.0/255.0); v = (v - 128.0/255.0); vec3 rgb; rgb.r = y + 1.5748 * v; rgb.g = y - 0.1873 * u - 0.4681 * v; rgb.b = y + 1.8556 * u; COLOR = vec4(rgb, 1.0); } ``` ### **단계별 Godot 톡합 λ°©μ•ˆ** #### **Phase 1: μ˜¬λ°”λ₯Έ GPU 기반 톡합 (ꢌμž₯ 방식)** ```csharp // VavCore YUV 데이터 β†’ Godot GPU ν…μŠ€μ²˜ νŒŒμ΄ν”„λΌμΈ using Godot; using VavCore.Net; public partial class VideoPlayer : Control { private VavCorePlayer _vavPlayer; private ShaderMaterial _yuvShaderMaterial; private TextureRect _videoDisplay; // YUV ν…μŠ€μ²˜λ“€ (GPU μ—…λ‘œλ“œμš©) private ImageTexture _yTexture, _uTexture, _vTexture; public override void _Ready() { VavCoreLibrary.Initialize(); _vavPlayer = new VavCorePlayer(); _vavPlayer.OpenFile("res://video.webm"); // YUV to RGB 셰이더 λ‘œλ“œ var shader = GD.Load("res://shaders/yuv_to_rgb.gdshader"); _yuvShaderMaterial = new ShaderMaterial(); _yuvShaderMaterial.Shader = shader; // VideoDisplay μ„€μ • _videoDisplay = GetNode("VideoDisplay"); _videoDisplay.Material = _yuvShaderMaterial; // YUV ν…μŠ€μ²˜ μ΄ˆκΈ°ν™” _yTexture = new ImageTexture(); _uTexture = new ImageTexture(); _vTexture = new ImageTexture(); } public override void _Process(double delta) { if (_vavPlayer.GetYUVFrameData(out var yuvFrame)) { // Y, U, V ν”Œλ ˆμΈμ„ 각각 ν…μŠ€μ²˜λ‘œ μ—…λ‘œλ“œ UpdateYUVTextures(yuvFrame); // 셰이더에 YUV ν…μŠ€μ²˜ 전달 (GPUμ—μ„œ RGB λ³€ν™˜) _yuvShaderMaterial.SetShaderParameter("y_texture", _yTexture); _yuvShaderMaterial.SetShaderParameter("u_texture", _uTexture); _yuvShaderMaterial.SetShaderParameter("v_texture", _vTexture); } } private void UpdateYUVTextures(VavCoreVideoFrame yuvFrame) { // Y ν”Œλ ˆμΈ (전체 해상도) var yImage = Image.CreateFromData(yuvFrame.Width, yuvFrame.Height, false, Image.Format.R8, yuvFrame.YPlaneData); _yTexture.SetImage(yImage); // U ν”Œλ ˆμΈ (1/2 해상도) var uImage = Image.CreateFromData(yuvFrame.Width/2, yuvFrame.Height/2, false, Image.Format.R8, yuvFrame.UPlaneData); _uTexture.SetImage(uImage); // V ν”Œλ ˆμΈ (1/2 해상도) var vImage = Image.CreateFromData(yuvFrame.Width/2, yuvFrame.Height/2, false, Image.Format.R8, yuvFrame.VPlaneData); _vTexture.SetImage(vImage); } } ``` **βœ… 핡심 μž₯점**: - **GPU 기반 λ³€ν™˜**: YUV β†’ RGB λ³€ν™˜μ΄ GPU μ…°μ΄λ”μ—μ„œ 병렬 처리 - **λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±**: YUV 원본 λ°μ΄ν„°λ§Œ μœ μ§€, RGB 쀑간 버퍼 λΆˆν•„μš” - **κ³ μ„±λŠ₯**: GPU ν…μŠ€μ²˜ μ—…λ‘œλ“œ + μ‹€μ‹œκ°„ 셰이더 λ³€ν™˜ - **Godot λ„€μ΄ν‹°λΈŒ**: Godot λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈκ³Ό μ™„λ²½ 톡합 #### **Phase 2: κ³ κΈ‰ μ΅œμ ν™” (μ„±λŠ₯ κ·ΉλŒ€ν™”)** ```csharp // ν…μŠ€μ²˜ 풀링 및 λ©€ν‹°μŠ€λ ˆλ”© μ΅œμ ν™” public partial class AdvancedVideoPlayer : Control { private VavCorePlayer _vavPlayer; private TexturePool _texturePool; private Task _decodingTask; // λ°±κ·ΈλΌμš΄λ“œ λ””μ½”λ”© + ν…μŠ€μ²˜ 슀트리밍 private async Task BackgroundDecoding() { while (_isPlaying) { if (_vavPlayer.GetYUVFrameData(out var yuvFrame)) { // ν…μŠ€μ²˜ ν’€μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν…μŠ€μ²˜ νšλ“ var textures = _texturePool.GetTextures(yuvFrame.Width, yuvFrame.Height); // λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œμ—μ„œ ν…μŠ€μ²˜ μ—…λ°μ΄νŠΈ await UpdateTexturesAsync(yuvFrame, textures); // 메인 μŠ€λ ˆλ“œλ‘œ λ Œλ”λ§ 큐 전달 CallDeferred(nameof(ApplyTexturesToShader), textures); } } } } ``` **βœ… κ³ κΈ‰ μ΅œμ ν™” 기법**: - **ν…μŠ€μ²˜ 풀링**: λ©”λͺ¨λ¦¬ μž¬ν• λ‹Ή μ΅œμ†Œν™” (Vav2Player FramePool νŒ¨ν„΄) - **비동기 λ””μ½”λ”©**: UI μŠ€λ ˆλ“œ λΈ”λ‘œν‚Ή λ°©μ§€ - **λ°±κ·ΈλΌμš΄λ“œ ν…μŠ€μ²˜ μ—…λ°μ΄νŠΈ**: GPU μ—…λ‘œλ“œ 병렬화 - **Zero-Copy νŒ¨ν„΄**: λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 볡사 제거 ### **λ Œλ”λ§ μ„±λŠ₯ μ΅œμ ν™” μ „λž΅** #### **Vav2Playerμ—μ„œ μŠΉκ³„ν•  μ΅œμ ν™” 기법** 1. **YUVβ†’RGB λ³€ν™˜ μ΅œμ ν™”**: - BT.709 색곡간 λ³€ν™˜ 맀트릭슀 - SIMD μ΅œμ ν™”λœ λ³€ν™˜ μ•Œκ³ λ¦¬μ¦˜ 2. **AspectFit 계산**: - λΉ„μœ¨ μœ μ§€ λ Œλ”λ§ μˆ˜μ‹ - UV μ’Œν‘œ μŠ€μΌ€μΌλ§ 둜직 3. **λ©”λͺ¨λ¦¬ μ΅œμ ν™”**: - ν…μŠ€μ²˜ 풀링 μ‹œμŠ€ν…œ - Zero-Copy 버퍼 관리 4. **μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§**: - ν”„λ ˆμž„ λ“œλ‘­ 감지 - λ Œλ”λ§ μ„±λŠ₯ λ©”νŠΈλ¦­ ### **C# 쀑심 μ•„ν‚€ν…μ²˜ 섀계** #### **μΈν•˜μš°μŠ€ Godot ν”„λ‘œμ νŠΈ ꡬ쑰** ``` MyGodotProject/ β”œβ”€β”€ VavCore/ # Git μ„œλΈŒλͺ¨λ“ˆ (from Vav2Player Solution) β”‚ β”œβ”€β”€ include/VavCore/VavCore.h # C API 헀더 β”‚ β”œβ”€β”€ lib/ β”‚ β”‚ β”œβ”€β”€ VavCore.lib # Static library (Windows) β”‚ β”‚ β”œβ”€β”€ libVavCore.a # Static library (Linux) β”‚ β”‚ └── libVavCore.a # Static library (macOS) β”‚ └── src/ # 전체 μ†ŒμŠ€μ½”λ“œ (λ””λ²„κΉ…μš©) β”œβ”€β”€ Scripts/ # Godot C# μŠ€ν¬λ¦½νŠΈλ“€ β”‚ β”œβ”€β”€ VavCore/ β”‚ β”‚ β”œβ”€β”€ VavCoreLibrary.cs # P/Invoke 래퍼 β”‚ β”‚ β”œβ”€β”€ VavCorePlayer.cs # κ³ μˆ˜μ€€ ν”Œλ ˆμ΄μ–΄ API β”‚ β”‚ β”œβ”€β”€ VavCoreTypes.cs # 데이터 ꡬ쑰체 β”‚ β”‚ └── GodotVideoPlayer.cs # Godot νŠΉν™” λΉ„λ””μ˜€ ν”Œλ ˆμ΄μ–΄ β”‚ └── Game/ β”‚ └── VideoPlayerScene.cs # μ‹€μ œ κ²Œμž„μ—μ„œ μ‚¬μš© └── project.godot # Godot ν”„λ‘œμ νŠΈ 파일 # VavCoreλŠ” Vav2Player μ†”λ£¨μ…˜μ˜ μ„œλΈŒλͺ¨λ“ˆλ‘œ 관리됨 ``` ### **톡합 개발 μ›Œν¬ν”Œλ‘œμš°** #### **단일 μ†”λ£¨μ…˜ 개발 사이클** 1. **VavCore μˆ˜μ •**: Vav2Player μ†”λ£¨μ…˜μ—μ„œ 디코더 κ°œμ„  2. **Vav2Player ν…ŒμŠ€νŠΈ**: GUIμ—μ„œ μ¦‰μ‹œ μ„±λŠ₯/κΈ°λŠ₯ 검증 3. **ν—€λ“œλ¦¬μŠ€ λ²€μΉ˜λ§ˆν‚Ή**: 순수 λ””μ½”λ”© μ„±λŠ₯ μΈ‘μ • 4. **Godot ν”„λ‘œμ νŠΈ μ—…λ°μ΄νŠΈ**: Git μ„œλΈŒλͺ¨λ“ˆ μ΅œμ‹ ν™” 5. **톡합 ν…ŒμŠ€νŠΈ**: λͺ¨λ“  ν”Œλž«νΌμ—μ„œ μΌκ΄€λœ μ„±λŠ₯ 확인 #### **Godot C# 톡합 예제** ```csharp // λ‚΄λΆ€ Godot ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš© using Godot; using VavCore.Wrapper; public partial class GameVideoPlayer : Control { private GodotVideoPlayer _videoPlayer; private TextureRect _videoDisplay; public override void _Ready() { _videoDisplay = GetNode("VideoDisplay"); _videoPlayer = new GodotVideoPlayer(); // μ μ‘ν˜• ν’ˆμ§ˆ μ„€μ • _videoPlayer.SetQualityMode(VavCoreQualityMode.Fast); _videoPlayer.OpenFile("res://cutscenes/intro.webm"); } public override void _Process(double delta) { // μžλ™μœΌλ‘œ ImageTexture μ—…λ°μ΄νŠΈ if (_videoPlayer.UpdateFrame()) { _videoDisplay.Texture = _videoPlayer.CurrentTexture; } // μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ var metrics = _videoPlayer.GetPerformanceMetrics(); GD.Print($"FPS: {metrics.CurrentFps:F1}, Quality: {metrics.CurrentQualityLevel}"); } } ``` ### **μΈν•˜μš°μŠ€ 배포 μ „λž΅** 1. **Git μ„œλΈŒλͺ¨λ“ˆ** - VavCoreλ₯Ό μ„œλΈŒλͺ¨λ“ˆλ‘œ Godot ν”„λ‘œμ νŠΈμ— 포함 2. **둜컬 라이브러리** - λΉŒλ“œλœ VavCore.dll을 ν”„λ‘œμ νŠΈ 디렉토리에 직접 배치 3. **C# 슀크립트** - VavCore 래퍼 ν΄λž˜μŠ€λ“€μ„ ν”„λ‘œμ νŠΈ Scripts 폴더에 포함 4. **버전 관리** - νŒ€ λ‚΄λΆ€ Git μ €μž₯μ†Œλ₯Ό ν†΅ν•œ 버전 관리 ## πŸ”§ **κ²€μ¦λœ 핡심 κΈ°λŠ₯λ“€** ### **μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄ (from Vav2Player)** - βœ… **3단계 ν’ˆμ§ˆ λͺ¨λ“œ**: CONSERVATIVE, FAST, ULTRA_FAST - βœ… **μ‹€μ‹œκ°„ μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§**: 30ν”„λ ˆμž„ 이동평균 기반 - βœ… **동적 해상도 μ‘°μ •**: 5%-100% λ²”μœ„ μŠ€μΌ€μΌλ§ - βœ… **4K AV1 μ„±λŠ₯**: 27.7fps 달성 (ULTRA_FAST λͺ¨λ“œ) ### **ν•˜λ“œμ›¨μ–΄ 가속 지원 (from Vav2Player)** - βœ… **NVDEC**: NVIDIA GPU ν•˜λ“œμ›¨μ–΄ λ””μ½”λ”© - βœ… **Media Foundation**: Intel QSV, AMD VCN 지원 - βœ… **μžλ™ Fallback**: NVDEC β†’ Media Foundation β†’ dav1d - βœ… **μ„±λŠ₯ 검증**: ν•˜λ“œμ›¨μ–΄ κ°€μ†μœΌλ‘œ 2-3λ°° μ„±λŠ₯ ν–₯상 ### **μ•ˆμ •μ„± 검증 (from Vav2Player)** - βœ… **47개 λ‹¨μœ„ ν…ŒμŠ€νŠΈ** (95.7% ν†΅κ³Όμœ¨) - βœ… **λ©”λͺ¨λ¦¬ 관리**: RAII νŒ¨ν„΄, λ©”λͺ¨λ¦¬ ν’€ μ΅œμ ν™” - βœ… **μ—λŸ¬ 처리**: μ™„μ „ν•œ μ˜ˆμ™Έ 처리 및 볡ꡬ λ©”μ»€λ‹ˆμ¦˜ ## ⚠️ **μ€‘μš” 섀계 원칙: VavCore μ—­ν•  뢄리** ### **❌ ν”Όν•΄μ•Ό ν•  λΆˆν•„μš”ν•œ κΈ°λŠ₯λ“€** #### **YUV to RGB λ³€ν™˜ λΆˆν•„μš”** **잘λͺ»λœ μ ‘κ·Ό**: VavCoreμ—μ„œ CPU 기반 YUV β†’ RGB λ³€ν™˜ 제곡 - ❌ **μ„±λŠ₯ μ˜€λ²„ν—€λ“œ**: CPU λ³€ν™˜μœΌλ‘œ μΈν•œ λΆˆν•„μš”ν•œ μ—°μ‚° - ❌ **λ©”λͺ¨λ¦¬ λ‚­λΉ„**: RGB λ³€ν™˜λœ 데이터 μΆ”κ°€ μ €μž₯ - ❌ **μ•„ν‚€ν…μ²˜ μœ„λ°˜**: λ Œλ”λ§ μ±…μž„μ„ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ‹΄λ‹Ή **μ˜¬λ°”λ₯Έ μ ‘κ·Ό**: 각 μ—”μ§„μ—μ„œ GPU μ…°μ΄λ”λ‘œ YUV β†’ RGB λ³€ν™˜ - βœ… **VavCore μ±…μž„**: YUV420P 원본 데이터 제곡 - βœ… **Godot μ±…μž„**: GPU μ…°μ΄λ”λ‘œ YUV β†’ RGB λ³€ν™˜ + λ Œλ”λ§ - βœ… **μ„±λŠ₯ μ΅œμ ν™”**: GPU 병렬 처리둜 μ‹€μ‹œκ°„ λ³€ν™˜ - βœ… **λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±**: YUV 원본 λ°μ΄ν„°λ§Œ μœ μ§€ **ꡬ체적 톡합 μ‹œλ‚˜λ¦¬μ˜€**: ```cpp // VavCore: YUV 데이터 제곡 VavCoreVideoFrame frame; vavcore_decode_next_frame(player, &frame); // Godot: 3개의 ν…μŠ€μ²˜λ‘œ GPU μ—…λ‘œλ“œ auto y_texture = create_texture_from_data(frame.y_plane, frame.y_stride, frame.height); auto u_texture = create_texture_from_data(frame.u_plane, frame.u_stride, frame.height/2); auto v_texture = create_texture_from_data(frame.v_plane, frame.v_stride, frame.height/2); // Godot 셰이더: GPUμ—μ„œ YUV β†’ RGB λ³€ν™˜ // shader: "YUV_to_RGB.gdshader" μ‚¬μš© ``` **핡심 κ΅ν›ˆ**: - **VavCore**: λ””μ½”λ”© μ „λ¬Έ 라이브러리 - **κ²Œμž„ μ—”μ§„**: λ Œλ”λ§ μ „λ¬Έ μ‹œμŠ€ν…œ - **μ—­ν•  뢄리**: 각자 μ „λ¬Έ μ˜μ—­μ—μ„œ μ΅œμ ν™” ## πŸš€ **μ‹€μ œ κ΅¬ν˜„ λ‘œλ“œλ§΅** ### **βœ… Phase 1: 핡심 λͺ¨λ“ˆ μΆ”μΆœ μ™„λ£Œ** - [x] Vav2Playerμ—μ„œ κ²€μ¦λœ 디코더 λͺ¨λ“ˆλ“€ 볡사 - [x] WebMFileReader, VideoDecoderFactory 이전 - [x] VideoTypes.h, IVideoDecoder.h μΈν„°νŽ˜μ΄μŠ€ μΆ”μΆœ - [x] 디렉토리 ꡬ쑰 생성 및 파일 정리 ### **βœ… Phase 2: C API κ΅¬ν˜„ μ™„λ£Œ** - [x] VavCore.h C API 헀더 섀계 - [x] VavCore.cpp C API κ΅¬ν˜„μ²΄ μž‘μ„± - [x] Godot/C# ν˜Έν™˜ 데이터 ꡬ쑰체 μ •μ˜ - [x] μ—λŸ¬ 처리 및 λ©”λͺ¨λ¦¬ 관리 API ### **βœ… Phase 3: VavCore Visual Studio ν”„λ‘œμ νŠΈ 생성 μ™„λ£Œ** - [x] **VavCore.vcxproj** 생성 (Static Library) - [x] **Vav2Player μ†”λ£¨μ…˜μ— μΆ”κ°€** 및 ν”„λ‘œμ νŠΈ μ°Έμ‘° μ„€μ • - [x] **κΈ°μ‘΄ 디코더 μ½”λ“œ** VavCore ν”„λ‘œμ νŠΈλ‘œ 이전 - [x] **C API 헀더 및 κ΅¬ν˜„** μ™„μ„± - [x] **Common μœ ν‹Έλ¦¬ν‹°** μΆ”κ°€ (D3D12Helpers.h) - [x] **λΉŒλ“œ 성곡** VavCore.lib 생성 확인 ### **πŸ“‹ Phase 4: Vav2Player λ¦¬νŒ©ν† λ§ (λ‹€μŒ 단계)** 1. **Vav2Playerλ₯Ό VavCore μ†ŒλΉ„μžλ‘œ μ „ν™˜** 2. **κΈ°μ‘΄ 디코더 직접 호좜** β†’ **VavCore C API 호좜** 3. **쀑볡 μ½”λ“œ 제거** 및 λ Œλ”λ§ μ „μš© μ½”λ“œλ§Œ μœ μ§€ 4. **μ„±λŠ₯ 동등성 검증** (λ¦¬νŒ©ν† λ§ μ „ν›„ 비ꡐ) ### **πŸ“‹ Phase 5: ν—€λ“œλ¦¬μŠ€ ν”„λ‘œμ νŠΈ 톡합 (λ‹€μŒ 단계)** 1. **Vav2PlayerHeadlessλ₯Ό VavCore 기반으둜 μž¬μž‘μ„±** 2. **순수 λ””μ½”λ”© λ²€μΉ˜λ§ˆν‚Ή** 도ꡬ κ΅¬ν˜„ 3. **μžλ™ν™” ν…ŒμŠ€νŠΈ 슀크립트** μž‘μ„± 4. **CI/CD νŒŒμ΄ν”„λΌμΈ** 톡합 ### **πŸ“‹ Phase 6: Godot C# 톡합 (λ‹€μŒ 단계)** 1. **C# 래퍼 클래슀** μž‘μ„± 및 P/Invoke κ΅¬ν˜„ 2. **GodotVideoPlayer 클래슀** κ΅¬ν˜„ 3. **Git μ„œλΈŒλͺ¨λ“ˆ** μ„€μ •μœΌλ‘œ VavCore 연동 4. **Godot ν…ŒμŠ€νŠΈ ν”„λ‘œμ νŠΈ** 생성 및 검증 ### **πŸ“‹ Phase 7: μ΅œμ ν™” 및 ν”„λ‘œλ•μ…˜ μ€€λΉ„ (μ΅œμ’… 단계)** 1. **μ„±λŠ₯ μ΅œμ ν™”** 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ κ°œμ„  2. **크둜슀 ν”Œλž«νΌ λΉŒλ“œ** μ‹œμŠ€ν…œ ꡬ좕 3. **톡합 λ¬Έμ„œν™”** 및 개발 κ°€μ΄λ“œ μž‘μ„± 4. **전체 μ‹œμŠ€ν…œ μ„±λŠ₯ λ²€μΉ˜λ§ˆν‚Ή** ## πŸ’‘ **Vav2Player 기반의 차별화 μš”μ†Œ** ### **κ²€μ¦λœ μ„±λŠ₯** - **4K AV1 λ””μ½”λ”©**: 27.7fps (이미 달성) - **λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±**: Zero-copy λ””μ½”λ”©, λ©”λͺ¨λ¦¬ ν’€ μ΅œμ ν™” - **μ•ˆμ •μ„±**: μˆ˜κ°œμ›”κ°„ 개발/ν…ŒμŠ€νŠΈλ‘œ κ²€μ¦λœ μ½”λ“œλ² μ΄μŠ€ ### **κ³ κΈ‰ κΈ°λŠ₯** - **μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄**: μ‹€μ‹œκ°„ μ„±λŠ₯에 λ”°λ₯Έ μžλ™ ν’ˆμ§ˆ μ‘°μ • - **ν•˜μ΄λΈŒλ¦¬λ“œ λ””μ½”λ”©**: GPU/CPU μžλ™ μ „ν™˜ - **μ‹€μ‹œκ°„ λ©”νŠΈλ¦­**: FPS, λ””μ½”λ”© μ‹œκ°„, ν”„λ ˆμž„ λ“œλ‘­ λͺ¨λ‹ˆν„°λ§ ### **Godot μ΅œμ ν™”** - **C API**: P/Invokeλ₯Ό ν†΅ν•œ μ™„λ²½ν•œ C# 톡합 - **ν”Œλž«νΌ 독립**: ν—€λ“œλ¦¬μŠ€ λΉŒλ“œλ‘œ GUI μ˜μ‘΄μ„± 제거 - **GDExtension μ€€λΉ„**: Godot 4.x λ„€μ΄ν‹°λΈŒ ν™•μž₯ 지원 ## πŸ“Š **μ„±λŠ₯ λͺ©ν‘œ (Vav2Player 기반)** ### **4K AV1 λ””μ½”λ”© μ„±λŠ₯ (이미 달성)** - **CONSERVATIVE λͺ¨λ“œ**: 25+ FPS (μ•ˆμ •μ„± μš°μ„ ) - **FAST λͺ¨λ“œ**: 35+ FPS (μ„±λŠ₯-ν’ˆμ§ˆ κ· ν˜•) - **ULTRA_FAST λͺ¨λ“œ**: 28+ FPS (κ·Ήν•œ μ΅œμ ν™”) ### **λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰** - **Base Memory**: 50MB μ΄ν•˜ - **Frame Buffer**: μ„€μ • κ°€λŠ₯ (κΈ°λ³Έ 30ν”„λ ˆμž„) - **Peak Usage**: 200MB μ΄ν•˜ (4K κΈ°μ€€) ## πŸ§ͺ **개발 μ „λž΅μ˜ 핡심 μž₯점** ### **μ‹œκ°„ νš¨μœ¨μ„±** - βœ… **μ¦‰μ‹œ ν™œμš© κ°€λŠ₯**: κ²€μ¦λœ μ½”λ“œ μž¬μ‚¬μš©μœΌλ‘œ 개발 μ‹œκ°„ 90% 단좕 - βœ… **λΉ λ₯Έ ν”„λ‘œν† νƒ€μ΄ν•‘**: 2-3μ£Ό λ‚΄ Godot 톡합 κ°€λŠ₯ ### **μ•ˆμ •μ„± 보μž₯** - βœ… **κ²€μ¦λœ λ””μ½”λ”© 둜직**: 이미 ν…ŒμŠ€νŠΈλœ AV1 디코더듀 - βœ… **μ—λŸ¬ 처리**: μ™„μ „ν•œ μ˜ˆμ™Έ 상황 λŒ€μ‘ λ©”μ»€λ‹ˆμ¦˜ - βœ… **λ©”λͺ¨λ¦¬ μ•ˆμ „μ„±**: RAII νŒ¨ν„΄κ³Ό 슀마트 포인터 ν™œμš© ### **ν™•μž₯μ„±** - βœ… **λͺ¨λ“ˆν˜• 섀계**: ν•„μš”ν•œ λ””μ½”λ”λ§Œ 선택적 μ‚¬μš© - βœ… **ν”ŒλŸ¬κ·ΈμΈ μ•„ν‚€ν…μ²˜**: μƒˆλ‘œμš΄ 코덱 μΆ”κ°€ 용이 - βœ… **크둜슀 ν”Œλž«νΌ**: Windows, Linux, macOS 지원 μ€€λΉ„ ## πŸ”₯ **λ‹€μŒ 개발 단계** ### **μ¦‰μ‹œ μ§„ν–‰ κ°€λŠ₯** 1. **VavCore.vcxproj** 생성 및 Vav2Player μ†”λ£¨μ…˜μ— μΆ”κ°€ 2. **κΈ°μ‘΄ 디코더 μ½”λ“œ** VavCore ν”„λ‘œμ νŠΈλ‘œ 이전 3. **C API κ΅¬ν˜„** μ™„λ£Œ 및 Static Library λΉŒλ“œ ### **톡합 개발 단계** 1. **Vav2Player λ¦¬νŒ©ν† λ§**: VavCore C API 기반으둜 μ „ν™˜ 2. **ν—€λ“œλ¦¬μŠ€ ν…ŒμŠ€νŠΈ**: VavCore μ „μš© μ„±λŠ₯ λ²€μΉ˜λ§ˆν‚Ή 3. **Godot 톡합**: Git μ„œλΈŒλͺ¨λ“ˆμ„ ν†΅ν•œ VavCore ν™œμš© --- ## 🎯 **핡심 섀계 κ²°λ‘ ** ### **톡합 μ•„ν‚€ν…μ²˜μ˜ 핡심 μž₯점** VavCoreλŠ” **Vav2Player μ†”λ£¨μ…˜ λ‚΄μ˜ Static Library**둜 μ„€κ³„λ˜μ–΄ λ‹€μŒκ³Ό 같은 이점을 μ œκ³΅ν•©λ‹ˆλ‹€: #### **단일 μ†ŒμŠ€ 관리** 1. **μ½”λ“œ 쀑볡 제거**: λ””μ½”λ”© λ‘œμ§μ„ VavCoreμ—μ„œ ν•œ 번만 κ΅¬ν˜„ 2. **μΌκ΄€λœ ν’ˆμ§ˆ**: Vav2Player와 Godotμ—μ„œ λ™μΌν•œ 디코더 μ‚¬μš© 3. **μœ μ§€λ³΄μˆ˜ νš¨μœ¨μ„±**: 버그 μˆ˜μ •μ΄λ‚˜ μ΅œμ ν™”κ°€ λͺ¨λ“  곳에 μžλ™ 적용 4. **톡합 ν…ŒμŠ€νŠΈ**: 단일 μ†”λ£¨μ…˜μ—μ„œ λͺ¨λ“  μ‹œλ‚˜λ¦¬μ˜€ 검증 #### **개발 μ›Œν¬ν”Œλ‘œμš° μ΅œμ ν™”** 1. **μ¦‰μ‹œ 검증**: VavCore μˆ˜μ • β†’ Vav2Playerμ—μ„œ μ¦‰μ‹œ ν…ŒμŠ€νŠΈ 2. **μ„±λŠ₯ λ²€μΉ˜λ§ˆν‚Ή**: ν—€λ“œλ¦¬μŠ€ λͺ¨λ“œλ‘œ 순수 λ””μ½”λ”© μ„±λŠ₯ μΈ‘μ • 3. **톡합 디버깅**: Visual Studioμ—μ„œ 전체 μŠ€νƒ 디버깅 κ°€λŠ₯ 4. **버전 일관성**: Git μ„œλΈŒλͺ¨λ“ˆμ„ ν†΅ν•œ Godot ν”„λ‘œμ νŠΈ 동기화 #### **Vav2Player μžμ‚° μ™„μ „ ν™œμš©** - βœ… **κ²€μ¦λœ 디코더**: λͺ¨λ“  AV1 디코더λ₯Ό κ·ΈλŒ€λ‘œ μž¬μ‚¬μš© - βœ… **μ μ‘ν˜• ν’ˆμ§ˆ μ œμ–΄**: 4K 27.7fps μ„±λŠ₯을 λͺ¨λ“  ν”Œλž«νΌμ—μ„œ ν™œμš© - βœ… **ν•˜λ“œμ›¨μ–΄ 가속**: NVDEC, Media Foundation 지원 μœ μ§€ - βœ… **μ΅œμ ν™” 기법**: Zero-copy, λ©”λͺ¨λ¦¬ ν’€ λ“± λͺ¨λ“  μ΅œμ ν™” μŠΉκ³„ #### **ν™•μž₯ κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜** - **Vav2Player**: WinUI3 GUI 개발/ν…ŒμŠ€νŠΈ ν”Œλž«νΌ - **ν—€λ“œλ¦¬μŠ€ λͺ¨λ“œ**: μžλ™ν™” ν…ŒμŠ€νŠΈ 및 μ„±λŠ₯ μΈ‘μ • - **Godot 톡합**: κ²Œμž„ μ—”μ§„μ—μ„œ λ™μΌν•œ κ³ μ„±λŠ₯ 디코더 ν™œμš© - **미래 ν™•μž₯**: λ‹€λ₯Έ ν”Œλž«νΌ(Unity, Unreal λ“±)에도 λ™μΌν•˜κ²Œ 적용 κ°€λŠ₯ **κ²°λ‘ **: 톡합 μ•„ν‚€ν…μ²˜λ₯Ό 톡해 Vav2Player의 λͺ¨λ“  기술적 μžμ‚°μ„ λ³΄μ‘΄ν•˜λ©΄μ„œλ„, 단일 μ†ŒμŠ€λ‘œ μ—¬λŸ¬ ν”Œλž«νΌμ„ μ§€μ›ν•˜λŠ” 졜적의 개발 ν™˜κ²½μ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” κΈ°μ‘΄ 투자λ₯Ό μ™„μ „νžˆ ν™œμš©ν•˜λ©΄μ„œλ„ μƒˆλ‘œμš΄ μš”κ΅¬μ‚¬ν•­μ— 효율적으둜 λŒ€μ‘ν•  수 μžˆλŠ” μ „λž΅μ  μ„€κ³„μž…λ‹ˆλ‹€. **λ¬Έμ„œ 버전**: 2.0 (μ‹€μ œ κ΅¬ν˜„ 기반) **μž‘μ„±μΌ**: 2025-09-24 **μ΅œμ’… μˆ˜μ •**: 2025-09-24