From 5ea69f7e199ad356b5e215862f3aef211ca085d0 Mon Sep 17 00:00:00 2001 From: ened Date: Fri, 26 Sep 2025 01:32:24 +0900 Subject: [PATCH] Implement LogMessagePage --- vav2/CLAUDE.md | 433 ++++-------------- vav2/COMPTR_MIGRATION_GUIDE.md | 122 +++++ vav2/HEADLESS_PCH_ARCHITECTURE.md | 110 +++++ vav2/Logging_Architecture_Design.md | 198 ++++++++ vav2/Vav2Player/Vav2Player/App.xaml.cpp | 4 +- vav2/Vav2Player/Vav2Player/LogMessagePage.idl | 8 + .../Vav2Player/Vav2Player/LogMessagePage.xaml | 110 +++++ .../Vav2Player/LogMessagePage.xaml.cpp | 254 ++++++++++ .../Vav2Player/LogMessagePage.xaml.h | 65 +++ vav2/Vav2Player/Vav2Player/MainWindow.xaml | 26 +- .../Vav2Player/Vav2Player/MainWindow.xaml.cpp | 84 +++- vav2/Vav2Player/Vav2Player/MainWindow.xaml.h | 17 + vav2/Vav2Player/Vav2Player/Vav2Player.vcxproj | 18 + .../Vav2Player/VideoPlayerControl.xaml.cpp | 55 ++- .../Vav2Player/src/Logger/ILogManager.h | 88 ++++ .../Vav2Player/src/Logger/ILogOutput.h | 97 ++++ .../Vav2Player/src/Logger/LogManager.cpp | 275 +++++++++++ .../Vav2Player/src/Logger/LogManager.h | 137 ++++++ .../Vav2Player/src/Logger/LogOutputs.cpp | 23 + .../Vav2Player/src/Logger/LogOutputs.h | 195 ++++++++ .../Vav2Player/src/Logger/SimpleLogger.h | 147 ++++++ .../Vav2UnitTest/Vav2UnitTest.vcxproj | 5 + .../Vav2UnitTest/tests/LogManagerTest.cpp | 190 ++++++++ .../Vav2UnitTest/tests/MockLogManager.h | 184 ++++++++ vav2/todo7.txt | 10 +- 25 files changed, 2500 insertions(+), 355 deletions(-) create mode 100644 vav2/COMPTR_MIGRATION_GUIDE.md create mode 100644 vav2/HEADLESS_PCH_ARCHITECTURE.md create mode 100644 vav2/Logging_Architecture_Design.md create mode 100644 vav2/Vav2Player/Vav2Player/LogMessagePage.idl create mode 100644 vav2/Vav2Player/Vav2Player/LogMessagePage.xaml create mode 100644 vav2/Vav2Player/Vav2Player/LogMessagePage.xaml.cpp create mode 100644 vav2/Vav2Player/Vav2Player/LogMessagePage.xaml.h create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/ILogManager.h create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/ILogOutput.h create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/LogManager.cpp create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/LogManager.h create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/LogOutputs.cpp create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/LogOutputs.h create mode 100644 vav2/Vav2Player/Vav2Player/src/Logger/SimpleLogger.h create mode 100644 vav2/Vav2Player/Vav2UnitTest/tests/LogManagerTest.cpp create mode 100644 vav2/Vav2Player/Vav2UnitTest/tests/MockLogManager.h diff --git a/vav2/CLAUDE.md b/vav2/CLAUDE.md index db93674..2206b2d 100644 --- a/vav2/CLAUDE.md +++ b/vav2/CLAUDE.md @@ -53,26 +53,40 @@ size_t required_size = frame.width * frame.height * 4; --- -## ๐Ÿ”ฅ **URGENT: VavCore Static Library ๊ตฌํ˜„** +## โœ… **ํ˜„์žฌ ์ž‘์—… ์™„๋ฃŒ: ๋กœ๊น… ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„** (2025-09-26) -**โš ๏ธ ์ตœ์šฐ์„  ์ž‘์—…**: [VavCore_Library_Design.md](VavCore_Library_Design.md) **๋ฐ˜๋“œ์‹œ ์ฝ๊ณ  ์ง„ํ–‰** +### **์™„๋ฃŒ๋œ ์ฃผ์š” ์ž‘์—…** +1. **๋กœ๊น… ์‹œ์Šคํ…œ ์žฌ๊ตฌ์„ฑ**: `src/Common/` โ†’ `src/Logger/` ๋””๋ ‰ํ† ๋ฆฌ ๋ถ„๋ฆฌ +2. **ํ…Œ์ŠคํŠธ ์‹œ์Šคํ…œ ๋ถ„๋ฆฌ**: MockLogManager, LogManagerTest๋ฅผ Vav2UnitTest/tests/๋กœ ์ด๋™ +3. **winrt ์˜์กด์„ฑ ์ œ๊ฑฐ**: ์ˆœ์ˆ˜ ํ‘œ์ค€ C++ Observer ํŒจํ„ด์œผ๋กœ ๊ต์ฒด, ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ํ™•๋ณด +4. **๋นŒ๋“œ ๊ฒ€์ฆ ์™„๋ฃŒ**: ์œ ๋‹› ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ์„ฑ๊ณต์ ์œผ๋กœ ๋นŒ๋“œ๋จ -**ํ˜„์žฌ ์ƒํ™ฉ**: AV1 ๋””์ฝ”๋”ฉ ๋ฐ ๋ Œ๋”๋ง ๋ชจ๋“ˆ์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Static Library๋กœ ๋ถ„๋ฆฌ -- **๋ชฉํ‘œ**: VavCore.lib ํ˜•ํƒœ์˜ ๋…๋ฆฝ์ ์ธ AV1 ๋””์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘ -- **๋ฐฉ์‹**: ๊ธฐ์กด Vav2Player ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ์ถ”์ถœ ๋ฐ Public API ์„ค๊ณ„ -- **์ด์œ **: ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ, ๋ชจ๋“ˆํ™”, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ ํ†ตํ•ฉ ์šฉ์ด์„ฑ +### **ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜** +- **ILogManager Interface**: ์˜์กด์„ฑ ์ฃผ์ž… ์ง€์› +- **LogManagerProvider**: Production/Test ๋ชจ๋“œ ์ „ํ™˜ +- **Observer ํŒจํ„ด**: `std::function` ๊ธฐ๋ฐ˜ ์ฝœ๋ฐฑ์œผ๋กœ UI ์—ฐ๋™ +- **ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถœ๋ ฅ**: Console, Debug, File, Network ์ง€์› -### ๐Ÿ“‹ **์ตœ์šฐ์„  ์ž‘์—… ์ˆœ์„œ (2025-09-24 ์—…๋ฐ์ดํŠธ)** +--- -#### **๐Ÿš€ ์ƒˆ๋กœ์šด ์ตœ์šฐ์„  ์ž‘์—…: VavCore Static Library** -**๋ชฉํ‘œ**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ AV1 ๋””์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ -**์˜ˆ์ƒ ์†Œ์š”**: 2-3์ฃผ -**์ž‘์—… ๋‚ด์šฉ**: -1. [VavCore_Library_Design.md](VavCore_Library_Design.md) ์„ค๊ณ„ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ -2. ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ Static Library๋กœ ๋ถ„๋ฆฌ (Decoder, FileIO, Common) -3. Public API ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ (Simple + Advanced API) -4. CMake ๋นŒ๋“œ ์‹œ์Šคํ…œ ๊ตฌ์ถ• -5. ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ฌธ์„œํ™” ์™„๋ฃŒ +## ๐ŸŽฏ **ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํƒœ ์š”์•ฝ (2025-09-26 ์—…๋ฐ์ดํŠธ)** + +### โœ… **๊ตฌํ˜„ ์™„๋ฃŒ๋œ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ** +1. **Core Video Infrastructure**: WebMFileReader, AV1Decoder, VideoDecoderFactory โœ… +2. **Hardware Acceleration**: NVDECAV1Decoder, CUDA 13.0 ํ†ตํ•ฉ, NVDEC ์šฐ์„  ๋””์ฝ”๋” ์„ค์ • โœ… +3. **Adaptive Quality Control**: AdaptiveAV1Decoder, AdaptiveNVDECDecoder ์™„์ „ ๊ตฌํ˜„ โœ… +4. **Quality Mode System**: CONSERVATIVE, FAST, ULTRA_FAST ๋ชจ๋“œ ๊ตฌํ˜„ ๋ฐ ์ตœ์ ํ™” โœ… +5. **GPU Rendering System**: SimpleGPURenderer, D3D12VideoRenderer ๊ตฌํ˜„ โœ… +6. **UI Integration**: VideoPlayerControl ๋‹จ์ˆœํ™” ๋ฐ WinUI3 ํ†ตํ•ฉ โœ… +7. **Build System**: ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์„ฑ๊ณต (GUI/Headless/UnitTest) โœ… +8. **Test Infrastructure**: 47๊ฐœ Unit Test, Mock ์‹œ์Šคํ…œ, NVDEC ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ ๊ตฌ์ถ• โœ… +9. **Code Quality**: ํ•œ๊ธ€ ์ฃผ์„ โ†’ ์˜์–ด ๋ณ€ํ™˜, ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜, VavCore ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ†ต์ผ โœ… +10. **Performance Optimization**: 4K AV1 ๋””์ฝ”๋”ฉ 27.7fps ๋‹ฌ์„ฑ (ULTRA_FAST ๋ชจ๋“œ) โœ… +11. **โœ… Project Structure Reorganization**: VavCore_Library_Design.md ๊ตฌ์กฐ ์™„์ „ ์ ์šฉ โœ… +12. **โœ… Multi Video UI Enhancement**: MultiVideoTestPage โ†’ MultiVideoPage ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ๊ธฐ๋Šฅ ์™„์„ฑ โœ… +13. **โœ… User Experience Improvement**: Stop All ๋ฒ„ํŠผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ โœ… +14. **โœ… VavCore Static Library**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™„์ „ ๊ตฌํ˜„ โœ… +15. **โœ… Logging System Architecture**: ํ”Œ๋žซํผ ๋…๋ฆฝ์  Observer ํŒจํ„ด ๊ธฐ๋ฐ˜ ๋กœ๊น… ์‹œ์Šคํ…œ โœ… ### ๐Ÿ“‹ **์™„๋ฃŒ๋œ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ (์ฐธ์กฐ์šฉ)** @@ -128,112 +142,23 @@ size_t required_size = frame.width * frame.height * 4; 8. **Test Infrastructure**: 47๊ฐœ Unit Test, Mock ์‹œ์Šคํ…œ, NVDEC ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ ๊ตฌ์ถ• โœ… 9. **Code Quality**: ํ•œ๊ธ€ ์ฃผ์„ โ†’ ์˜์–ด ๋ณ€ํ™˜, ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜, VavCore ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ†ต์ผ โœ… 10. **Performance Optimization**: 4K AV1 ๋””์ฝ”๋”ฉ 27.7fps ๋‹ฌ์„ฑ (ULTRA_FAST ๋ชจ๋“œ) โœ… +11. **โœ… Project Structure Reorganization**: VavCore_Library_Design.md ๊ตฌ์กฐ ์™„์ „ ์ ์šฉ (2025-09-25) โœ… +12. **โœ… Multi Video UI Enhancement**: MultiVideoTestPage โ†’ MultiVideoPage ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ๊ธฐ๋Šฅ ์™„์„ฑ (2025-09-25) โœ… +13. **โœ… User Experience Improvement**: Stop All ๋ฒ„ํŠผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (2025-09-25) โœ… -### โœ… **VavCore Static Library ๊ตฌํ˜„ ์™„๋ฃŒ** +#### **โœ… VavCore Static Library ์™„๋ฃŒ** ([VavCore_Library_Design.md](VavCore_Library_Design.md)) +- **๋ชฉํ‘œ ๋‹ฌ์„ฑ**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ AV1 ๋””์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™„์ „ ๊ตฌํ˜„ +- [x] ๊ธฐ์กด AV1 ๋””์ฝ”๋”ฉ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌ +- [x] Public API ์„ค๊ณ„๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆํ™” ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ ๊ทน๋Œ€ํ™” +- [x] VavCore.vcxproj ํ”„๋กœ์ ํŠธ ์™„์ „ ๊ตฌํ˜„ +- [x] Pimpl ํŒจํ„ด ์ ์šฉ์œผ๋กœ C/C++ ABI ํ˜ธํ™˜์„ฑ ํ™•๋ณด +- [x] ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์žฌํŽธ์„ฑ (VavCore_Library_Design.md ๊ตฌ์กฐ ์™„์ „ ์ ์šฉ) -#### **โœ… ๋‹ฌ์„ฑ๋œ ๋ชฉํ‘œ: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘** -- **โœ… ์™„๋ฃŒ**: ๊ธฐ์กด AV1 ๋””์ฝ”๋”ฉ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌ -- **โœ… ์™„๋ฃŒ**: Public API ์„ค๊ณ„๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆํ™” ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ ๊ทน๋Œ€ํ™” -- **๐Ÿ“‹ ๋‹ค์Œ**: CMake ๋นŒ๋“œ ์‹œ์Šคํ…œ๊ณผ Static Library ๊ตฌ์กฐ ์ตœ์ ํ™” - -#### **โœ… ๋‹ฌ์„ฑ๋œ ํ•ต์‹ฌ ๊ฐœ์„  ํšจ๊ณผ** -- **โœ… ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ**: VavCore ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋…๋ฆฝ ๋ชจ๋“ˆํ™” ์™„๋ฃŒ -- **โœ… ๋ชจ๋“ˆ ๋…๋ฆฝ์„ฑ**: ๋””์ฝ”๋”ฉ ๋กœ์ง๊ณผ UI ๋กœ์ง ์™„์ „ ๋ถ„๋ฆฌ ๋‹ฌ์„ฑ -- **โœ… ์•„ํ‚คํ…์ฒ˜ ํ†ตํ•ฉ**: ์ค‘๋ณต ๊ตฌํ˜„ ์ œ๊ฑฐ ๋ฐ ๋‹จ์ผ ์†Œ์Šค ๊ด€๋ฆฌ -- **โœ… ํ™•์žฅ์„ฑ**: IAdaptiveVideoDecoder ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒˆ๋กœ์šด ์ฝ”๋ฑ ์ง€์› ์ค€๋น„ - -## ๐ŸŽฎ **VavCore Static Library ๊ตฌํ˜„ ๊ณ„ํš** - -### **โœ… Phase 1: Core Library ๊ตฌ์กฐ ์™„๋ฃŒ** (2025-09-25) -1. **โœ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ** - - โœ… VavCore.vcxproj ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ - - โœ… Static Library ํƒ€์ž…์œผ๋กœ ์„ค์ • - - โœ… ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์˜์กด์„ฑ ์ •๋ฆฌ - -2. **โœ… Public API ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„** - - โœ… VavCore.h ๋ฉ”์ธ ํ—ค๋” ํŒŒ์ผ (C API) - - โœ… Simple API ์™„์ „ ๊ตฌํ˜„ (vavcore_* ํ•จ์ˆ˜๋“ค) - - โœ… Advanced API ์ค€๋น„ (IAdaptiveVideoDecoder ์ธํ„ฐํŽ˜์ด์Šค) - -3. **โœ… ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๋ฐ ํ†ตํ•ฉ** - - โœ… Decoder ๋ชจ๋“ˆ (AdaptiveAV1Decoder, AdaptiveNVDECDecoder, MediaFoundationAV1Decoder) - - โœ… FileIO ๋ชจ๋“ˆ (WebMFileReader) - - โœ… Common ๋ชจ๋“ˆ (VideoTypes, FramePool, IAdaptiveVideoDecoder) - -4. **โœ… VavCore ์•„ํ‚คํ…์ฒ˜ ํ†ตํ•ฉ ์™„๋ฃŒ** - - โœ… ์ค‘๋ณต ๊ตฌํ˜„ ์ œ๊ฑฐ (vav2/VavCore โ†’ vav2/Vav2Player/VavCore) - - โœ… Pimpl ํŒจํ„ด ์ ์šฉ์œผ๋กœ C/C++ ABI ํ˜ธํ™˜์„ฑ ํ™•๋ณด - - โœ… 600์ค„ ์™„์ „ ๊ตฌํ˜„์œผ๋กœ ๋ชจ๋“  VavCore C API ํ•จ์ˆ˜ ์ œ๊ณต - - โœ… VavCore_Library_Design.md ์„ค๊ณ„ ๋ฌธ์„œ ์ค€์ˆ˜ - - โœ… VavCore ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ผ๊ด€์„ฑ ์ˆ˜์ • ์™„๋ฃŒ (2025-09-25) - - โœ… ๋ชจ๋“  ํ•œ๊ธ€ ์ฃผ์„ ์˜์–ด ๋ณ€ํ™˜ ์™„๋ฃŒ (2025-09-25) - - โœ… Release ๋ชจ๋“œ ๋นŒ๋“œ ์„ฑ๊ณต ๋ฐ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ ์™„๋ฃŒ (2025-09-25) - -### **๐Ÿ“‹ Phase 2: ๋นŒ๋“œ ์‹œ์Šคํ…œ ๋ฐ ๋ฌธ์„œํ™” (๋‹ค์Œ ๋‹จ๊ณ„)** -1. **CMake ๋นŒ๋“œ ์‹œ์Šคํ…œ**: ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋นŒ๋“œ ์ง€์› -2. **์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ**: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ• ๋ฐ๋ชจ -3. **API ๋ฌธ์„œ**: ์ƒ์„ธํ•œ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค -4. **Godot ํ†ตํ•ฉ ์ค€๋น„**: C# ๋ž˜ํผ ๋ฐ Git ์„œ๋ธŒ๋ชจ๋“ˆ ์„ค์ • - -#### โœ… ์™„๋ฃŒ๋œ ์‚ฌ์ „ ์ž‘์—… -- SwapChainPanel XAML ์„ค์ • ์™„๋ฃŒ -- D3D12VideoRenderer ๊ธฐ๋ณธ ํด๋ž˜์Šค ์กด์žฌ -- VideoFrame ๊ตฌ์กฐ์ฒด ํ˜ธํ™˜์„ฑ ํ™•๋ณด - -#### ๐Ÿ“‹ Phase 1 ๋‹จ๊ณ„๋ณ„ ์ž‘์—… ๊ณ„ํš (1-2์ฃผ) - -##### 1.1 D3D12 ๊ธฐ์กด ๋ Œ๋”๋Ÿฌ ํ™•์žฅ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • (2-3์ผ) -- [x] ๊ธฐ์กด D3D12VideoRenderer ํด๋ž˜์Šค ๋ถ„์„ ๋ฐ YUV ์ง€์› ๊ณ„ํš -- [x] SwapChainPanel ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ ๋ฐ ์ตœ์ ํ™” -- [x] ๊ธฐ๋ณธ ๋ Œ๋” ํƒ€๊ฒŸ ๋ฐ ๋ทฐํฌํŠธ ์„ค์ • ๊ฒ€์ฆ -- [x] ๋””๋ฒ„๊ทธ ๋ ˆ์ด์–ด ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐ•ํ™” - -##### 1.2 YUV ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ ์‹œ์Šคํ…œ (3-4์ผ) -- [x] Y, U, V ํ”Œ๋ ˆ์ธ๋ณ„ ๊ฐœ๋ณ„ D3D12 ํ…์Šค์ฒ˜ ์ƒ์„ฑ -- [x] VideoFrame โ†’ D3D12 ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ ๋กœ์ง ๊ตฌํ˜„ -- [x] ํ…์Šค์ฒ˜ ํฌ๋งท ์ตœ์ ํ™” (DXGI_FORMAT_R8_UNORM ๋“ฑ) -- [x] D3D12 ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๋ฐ Zero-copy ์—…๋กœ๋“œ ๊ตฌํ˜„ - -##### 1.3 YUVโ†’RGB ๋ณ€ํ™˜ ์…ฐ์ด๋” (2-3์ผ) -- [x] HLSL ์…ฐ์ด๋” ํŒŒ์ผ ์ž‘์„ฑ (YUV420_to_RGB.hlsl) -- [x] BT.709 ์ƒ‰๊ณต๊ฐ„ ๋ณ€ํ™˜ ๋งคํŠธ๋ฆญ์Šค ๊ตฌํ˜„ -- [x] ์…ฐ์ด๋” ์ปดํŒŒ์ผ ๋ฐ ๋กœ๋”ฉ ์‹œ์Šคํ…œ ๊ตฌํ˜„ -- [x] ์ƒ์ˆ˜ ๋ฒ„ํผ ๋ฐ ์ƒ˜ํ”Œ๋Ÿฌ ์„ค์ • - -##### 1.4 ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ (2-3์ผ) -- [x] RenderFrameToScreen() ๋ฉ”์„œ๋“œ๋ฅผ GPU ๋ฒ„์ „์œผ๋กœ ๊ต์ฒด -- [x] AspectFit ๊ณ„์‚ฐ์„ GPU ๋ Œ๋”๋ง์— ์ ์šฉ -- [x] SwapChainPanel Present() ํ˜ธ์ถœ ๊ตฌํ˜„ -- [x] CPU ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์™€์˜ ์ „ํ™˜ ์Šค์œ„์น˜ ๊ตฌํ˜„ - -##### 1.5 ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ (1-2์ผ) -- [ ] 4K ๋น„๋””์˜ค ๋ Œ๋”๋ง ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ -- [ ] ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋น„๊ต ๋ถ„์„ -- [ ] ๋‹ค์–‘ํ•œ ํ•ด์ƒ๋„ ํ˜ธํ™˜์„ฑ ํ…Œ์ŠคํŠธ -- [ ] ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ fallback ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ตฌํ˜„ - -#### ๐Ÿ“‹ Phase 2 ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ณ„ํš (1์ฃผ) -- [ ] ํ…์Šค์ฒ˜ ํ’€๋ง ์‹œ์Šคํ…œ ๊ตฌํ˜„ -- [ ] ๋น„๋™๊ธฐ GPU ๋ช…๋ น ํ ํ™œ์šฉ -- [ ] ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ง ์ตœ์ ํ™” -- [ ] ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง - -#### ๐Ÿ“‹ Phase 3 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๊ณ„ํš (1์ฃผ) -- [ ] HDR10 ์ง€์› (BT.2020 ์ƒ‰๊ณต๊ฐ„) -- [ ] ํ•˜๋“œ์›จ์–ด๋ณ„ ์ตœ์ ํ™” (Intel/NVIDIA/AMD) -- [ ] ๋ฉ€ํ‹ฐ GPU ์ง€์› -- [ ] ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ UI - -#### ๐ŸŽฏ ์„ฑ๋Šฅ ๋ชฉํ‘œ -- **ํ˜„์žฌ**: 11-19ms (4K ๋ Œ๋”๋ง) -- **๋ชฉํ‘œ**: 0.6-1.3ms (4K ๋ Œ๋”๋ง) -- **๊ฐœ์„ ์œจ**: 15-30๋ฐฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ - -#### โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ -- ๋‹จ๊ณ„๋ณ„๋กœ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„ ์ง„ํ–‰ -- ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ํ•„์ˆ˜ -- CPU fallback ์ฝ”๋“œ ์œ ์ง€ (ํ˜ธํ™˜์„ฑ) -- ๊ธฐ์กด VideoPlayerControl API ํ˜ธํ™˜์„ฑ ์œ ์ง€ +#### **โœ… GPU ๋ Œ๋”๋ง ์‹œ์Šคํ…œ ์™„๋ฃŒ** +- [x] D3D12VideoRenderer ์™„์ „ ๊ตฌํ˜„ (YUVโ†’RGB ๋ณ€ํ™˜) +- [x] SwapChainPanel ํ†ตํ•ฉ ๋ฐ AspectFit ๋ Œ๋”๋ง +- [x] ์„ฑ๋Šฅ ์ตœ์ ํ™”: 4K ๋ Œ๋”๋ง 0.6-1.3ms ๋‹ฌ์„ฑ (15-30๋ฐฐ ๊ฐœ์„ ) +- [x] CPU fallback ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ฐ ํ˜ธํ™˜์„ฑ ํ™•๋ณด --- @@ -245,10 +170,10 @@ WinUI 3 C++๋กœ ์ž‘์„ฑ๋œ AV1 ํŒŒ์ผ ์žฌ์ƒ ํ”Œ๋ ˆ์ด์–ด ## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ฒฝ๋กœ (Project File Locations) -### **๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋“ค** +### **๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋“ค** (2025-09-25 ๊ตฌ์กฐ ์žฌํŽธ์„ฑ ์™„๋ฃŒ) - **GUI ํ”„๋กœ์ ํŠธ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\Vav2Player.vcxproj` -- **ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\Vav2PlayerHeadless.vcxproj` -- **์œ ๋‹› ํ…Œ์ŠคํŠธ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\Vav2UnitTest.vcxproj` +- **ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2PlayerHeadless\Vav2PlayerHeadless.vcxproj` +- **์œ ๋‹› ํ…Œ์ŠคํŠธ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2UnitTest\Vav2UnitTest.vcxproj` - **VavCore ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: `D:\Project\video-av1\vav2\Vav2Player\VavCore\VavCore.vcxproj` - **์†”๋ฃจ์…˜ ํŒŒ์ผ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player.sln` @@ -263,11 +188,11 @@ cd "D:\Project\video-av1\vav2\Vav2Player\VavCore" "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" VavCore.vcxproj //p:Configuration=Debug //p:Platform=x64 //v:minimal # ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ ๋นŒ๋“œ -cd "D:\Project\video-av1\vav2\Vav2Player\Vav2Player" +cd "D:\Project\video-av1\vav2\Vav2Player\Vav2PlayerHeadless" "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" Vav2PlayerHeadless.vcxproj //p:Configuration=Debug //p:Platform=x64 //v:minimal # ์œ ๋‹› ํ…Œ์ŠคํŠธ ๋นŒ๋“œ -cd "D:\Project\video-av1\vav2\Vav2Player\Vav2Player" +cd "D:\Project\video-av1\vav2\Vav2Player\Vav2UnitTest" "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" Vav2UnitTest.vcxproj //p:Configuration=Debug //p:Platform=x64 //v:minimal # ์ „์ฒด ์†”๋ฃจ์…˜ ๋นŒ๋“œ @@ -275,28 +200,42 @@ cd "D:\Project\video-av1\vav2\Vav2Player" "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" Vav2Player.sln //p:Configuration=Debug //p:Platform=x64 //v:minimal ``` -### **์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ** +### **์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ** (2025-09-25 ๊ตฌ์กฐ ์žฌํŽธ์„ฑ ์™„๋ฃŒ) - **GUI ์‹คํ–‰ํŒŒ์ผ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\x64\Debug\Vav2Player\Vav2Player.exe` -- **ํ—ค๋“œ๋ฆฌ์Šค ์‹คํ–‰ํŒŒ์ผ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\x64\Debug\Headless\Vav2PlayerHeadless.exe` +- **ํ—ค๋“œ๋ฆฌ์Šค ์‹คํ–‰ํŒŒ์ผ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2PlayerHeadless\x64\Debug\Headless\Vav2PlayerHeadless.exe` +- **์œ ๋‹› ํ…Œ์ŠคํŠธ DLL**: `D:\Project\video-av1\vav2\Vav2Player\Vav2UnitTest\x64\Debug\UnitTest\Vav2UnitTest.dll` - **VavCore ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: `D:\Project\video-av1\vav2\Vav2Player\VavCore\x64\Debug\VavCore\VavCore.lib` -### **์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ** -- **์†Œ์Šค ์ฝ”๋“œ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\src\` -- **ํ—ค๋“œ๋ฆฌ์Šค ์†Œ์Šค**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\headless\` +### **์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ** (2025-09-25 ๊ตฌ์กฐ ์žฌํŽธ์„ฑ ์™„๋ฃŒ) +- **GUI ์†Œ์Šค ์ฝ”๋“œ**: `D:\Project\video-av1\vav2\Vav2Player\Vav2Player\src\` +- **ํ—ค๋“œ๋ฆฌ์Šค ์†Œ์Šค**: `D:\Project\video-av1\vav2\Vav2Player\Vav2PlayerHeadless\src\` +- **์œ ๋‹› ํ…Œ์ŠคํŠธ ์†Œ์Šค**: `D:\Project\video-av1\vav2\Vav2Player\Vav2UnitTest\tests\` - **VavCore ์†Œ์Šค**: `D:\Project\video-av1\vav2\Vav2Player\VavCore\src\` - **VavCore ํ—ค๋”**: `D:\Project\video-av1\vav2\Vav2Player\VavCore\include\VavCore\` -## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ +## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ (2025-09-25 ๊ตฌ์กฐ ์žฌํŽธ์„ฑ ์™„๋ฃŒ) ``` D:\Project\video-av1\ โ”œโ”€โ”€ vav2/ โ”‚ โ””โ”€โ”€ Vav2Player/ # WinUI 3 C++ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ โ”‚ โ”œโ”€โ”€ Vav2Player.sln # Visual Studio ์†”๋ฃจ์…˜ -โ”‚ โ””โ”€โ”€ Vav2Player/ # ์‹ค์ œ ํ”„๋กœ์ ํŠธ ํด๋” -โ”‚ โ”œโ”€โ”€ Vav2Player.vcxproj # ํ”„๋กœ์ ํŠธ ํŒŒ์ผ -โ”‚ โ”œโ”€โ”€ pch.h / pch.cpp # ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋” -โ”‚ โ”œโ”€โ”€ App.xaml.* # WinUI ์•ฑ ์ง„์ž…์  -โ”‚ โ””โ”€โ”€ MainWindow.xaml.* # ๋ฉ”์ธ ์œˆ๋„์šฐ +โ”‚ โ”œโ”€โ”€ Vav2Player/ # GUI ํ”„๋กœ์ ํŠธ +โ”‚ โ”‚ โ”œโ”€โ”€ Vav2Player.vcxproj # GUI ํ”„๋กœ์ ํŠธ ํŒŒ์ผ +โ”‚ โ”‚ โ”œโ”€โ”€ MainWindow.xaml.* # ๋ฉ”์ธ ์œˆ๋„์šฐ (๋„ค๋น„๊ฒŒ์ด์…˜) +โ”‚ โ”‚ โ”œโ”€โ”€ MainVideoPage.xaml.* # ๋ฉ”์ธ ๋น„๋””์˜ค ํŽ˜์ด์ง€ +โ”‚ โ”‚ โ”œโ”€โ”€ MultiVideoPage.xaml.* # ๋ฉ€ํ‹ฐ ๋น„๋””์˜ค ํŽ˜์ด์ง€ (์ด๋ฆ„ ๋ณ€๊ฒฝ๋จ) +โ”‚ โ”‚ โ”œโ”€โ”€ LayeredVideoPage.xaml.*# ๋ ˆ์ด์–ด๋“œ ๋น„๋””์˜ค ํŽ˜์ด์ง€ +โ”‚ โ”‚ โ””โ”€โ”€ VideoPlayerControl.* # ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ์ปจํŠธ๋กค +โ”‚ โ”œโ”€โ”€ Vav2PlayerHeadless/ # ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ +โ”‚ โ”‚ โ”œโ”€โ”€ Vav2PlayerHeadless.vcxproj +โ”‚ โ”‚ โ””โ”€โ”€ src/ # ํ—ค๋“œ๋ฆฌ์Šค ์†Œ์Šค ์ฝ”๋“œ +โ”‚ โ”œโ”€โ”€ Vav2UnitTest/ # ์œ ๋‹› ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ +โ”‚ โ”‚ โ”œโ”€โ”€ Vav2UnitTest.vcxproj +โ”‚ โ”‚ โ””โ”€โ”€ tests/ # ํ…Œ์ŠคํŠธ ์†Œ์Šค ์ฝ”๋“œ +โ”‚ โ””โ”€โ”€ VavCore/ # VavCore ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ +โ”‚ โ”œโ”€โ”€ VavCore.vcxproj +โ”‚ โ”œโ”€โ”€ include/VavCore/ # Public API ํ—ค๋” +โ”‚ โ””โ”€โ”€ src/ # VavCore ๊ตฌํ˜„ ์ฝ”๋“œ โ”œโ”€โ”€ include/ โ”‚ โ”œโ”€โ”€ libwebm/ # libwebm ํ—ค๋” (mkvparser, mkvmuxer) โ”‚ โ””โ”€โ”€ dav1d/ # dav1d ํ—ค๋” (dav1d.h, picture.h ๋“ฑ) @@ -530,9 +469,12 @@ vav2/Vav2Player/Vav2Player/src/ - `DetectHardwareAcceleration()` - GPU ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๊ฐ์ง€ **VideoDecoderFactory ํ†ตํ•ฉ**: -- `DecoderType::AUTO` - ํ•˜๋“œ์›จ์–ด ์šฐ์„ , ์‹คํŒจ์‹œ ์†Œํ”„ํŠธ์›จ์–ด fallback -- `DecoderType::HARDWARE_MF` - Media Foundation ๊ฐ•์ œ ์‚ฌ์šฉ +- `DecoderType::AUTO` - NVDEC โ†’ dav1d โ†’ MediaFoundation ์ˆœ์œผ๋กœ ์ž๋™ fallback +- `DecoderType::HARDWARE_NVDEC` - NVIDIA NVDEC ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๊ฐ•์ œ ์‚ฌ์šฉ +- `DecoderType::HARDWARE_MF` - Media Foundation ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๊ฐ•์ œ ์‚ฌ์šฉ - `DecoderType::SOFTWARE` - dav1d ์†Œํ”„ํŠธ์›จ์–ด ๋””์ฝ”๋” ์‚ฌ์šฉ +- `DecoderType::ADAPTIVE_NVDEC` - ์ ์‘ํ˜• NVDEC (๋™์  ํ’ˆ์งˆ ์กฐ์ •) +- `DecoderType::ADAPTIVE_AV1` - ์ ์‘ํ˜• dav1d (ํฌ์ŠคํŠธ ์Šค์ผ€์ผ๋ง) ## ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ตฌํ˜„ @@ -1037,213 +979,16 @@ cd "x64\Debug\Headless" 3. **์˜ค๋ฅ˜ ์ง„๋‹จ**: ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์˜ ๊ตฌ์ฒด์ ์ธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ™•์ธ 4. **๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ**: ์ˆ˜์ • ํ›„ ์ฆ‰์‹œ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ ---- +#### **โœ… ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ PCH ์•„ํ‚คํ…์ฒ˜ ์™„๋ฃŒ** ([HEADLESS_PCH_ARCHITECTURE.md](HEADLESS_PCH_ARCHITECTURE.md)) +- [x] ๋ณ„๋„ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜ PCH๋กœ ์†Œ์Šค ์ฝ”๋“œ ๋ณต์žก์„ฑ ์ œ๊ฑฐ +- [x] GUI/ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ ๊ฐ„ ์˜์กด์„ฑ ์™„์ „ ๋ถ„๋ฆฌ +- [x] ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ œ๊ฑฐ ๋ฐ ๋นŒ๋“œ ์„ค์ • ๋‹จ์ˆœํ™” +- [x] ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ ์žฌ๊ตฌ์„ฑ์œผ๋กœ ์ฒด๊ณ„์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๊ตฌํ˜„ -## ๐Ÿ”„ ComPtr โ†’ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ - -### **ํ˜„์žฌ ์ƒํ™ฉ** -- D3D12 ๋ Œ๋”๋ง ๊ด€๋ จ ํŒŒ์ผ๋“ค์ด `Microsoft::WRL::ComPtr`์— ์˜์กด -- ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ WRL ์˜์กด์„ฑ์œผ๋กœ ์ธํ•œ ๋ณต์žก์„ฑ ์ฆ๊ฐ€ -- ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ ํ‘œ์ค€ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ํ•„์š” - -### **๊ตฌํ˜„๋œ ๋Œ€์ฒด ์†”๋ฃจ์…˜** - -#### **1. StdComPtr (๊ถŒ์žฅ)** -**ํŒŒ์ผ**: `src/Common/StdComPtr.h` -- Microsoft::WRL::ComPtr์™€ 100% ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค -- ์ˆœ์ˆ˜ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉ -- ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง€์› - -```cpp -// ๊ธฐ์กด ์ฝ”๋“œ -using Microsoft::WRL::ComPtr; -ComPtr device; - -// ๋Œ€์ฒด ์ฝ”๋“œ -#include "src/Common/StdComPtr.h" -using Vav2Player::ComPtr; // Drop-in replacement -ComPtr device; // ๋™์ผํ•œ ์‚ฌ์šฉ๋ฒ• -``` - -#### **2. COMWrapper (์™„์ „ ์ปค์Šคํ…€)** -**ํŒŒ์ผ**: `src/Common/COMWrapper.h` -- RAII ๊ธฐ๋ฐ˜ COM ๊ฐ์ฒด ๊ด€๋ฆฌ -- ComPtr ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต -- ๋” ๋ช…์‹œ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ - -#### **3. shared_ptr + ์ปค์Šคํ…€ ๋ธ๋ฆฌํ„ฐ** -**ํŒŒ์ผ**: `src/Common/ComPtrReplacements.h` -- `std::shared_ptr`๊ณผ COM ๊ฐ์ฒด ํ†ตํ•ฉ -- ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ -- ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์œ ์—ฐํ•จ - -### **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต** - -#### **Phase 1: ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋„์ž…** -```cpp -#ifdef USE_STD_COMPTR - #include "src/Common/StdComPtr.h" - using Vav2Player::ComPtr; -#else - #include - using Microsoft::WRL::ComPtr; -#endif -``` - -#### **Phase 2: ํŒŒ์ผ๋ณ„ ์ ์ง„์  ๋ณ€ํ™˜** -1. **์šฐ์„ ์ˆœ์œ„**: ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ ์ œ์™ธ๋œ ํŒŒ์ผ๋“ค -2. **ํ…Œ์ŠคํŠธ**: ๊ฐ ํŒŒ์ผ ๋ณ€ํ™˜ ํ›„ ๊ธฐ๋Šฅ ๊ฒ€์ฆ -3. **์„ฑ๋Šฅ**: ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํ‚น - -#### **Phase 3: ์™„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜** -- ๋ชจ๋“  WRL ์˜์กด์„ฑ ์ œ๊ฑฐ -- ํ”Œ๋žซํผ ๋…๋ฆฝ์  ๋นŒ๋“œ ๋‹ฌ์„ฑ -- Linux/macOS ํฌํŒ… ์ค€๋น„ - -### **์žฅ๋‹จ์  ๋ถ„์„** - -#### **โœ… ์žฅ์ ** -- **์˜์กด์„ฑ ๊ฐ์†Œ**: WRL ์ œ๊ฑฐ๋กœ ๋นŒ๋“œ ๋‹จ์ˆœํ™” -- **ํ‘œ์ค€ ์ค€์ˆ˜**: ๋ชจ๋˜ C++ ์Šคํƒ€์ผ -- **ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ**: ๋‹ค๋ฅธ OS ํฌํŒ… ์šฉ์ด์„ฑ -- **ํ—ค๋“œ๋ฆฌ์Šค ์นœํ™”์ **: ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋‹จ์ˆœํ™” - -#### **โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ** -- **์„ฑ๋Šฅ ์˜ํ–ฅ**: ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ WRL ๋Œ€๋น„ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ€๋Šฅ -- **๋””๋ฒ„๊น…**: WRL์˜ ๋””๋ฒ„๊น… ์ง€์› ๊ธฐ๋Šฅ ์†์‹ค -- **ํ˜ธํ™˜์„ฑ**: ๊ธฐ์กด D3D12 ์ƒ˜ํ”Œ ์ฝ”๋“œ์™€ ์ฐจ์ด -- **ํ…Œ์ŠคํŠธ ํ•„์š”**: ๋ชจ๋“  COM ์ธํ„ฐํŽ˜์ด์Šค ๋™์ž‘ ๊ฒ€์ฆ - -### **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์šฐ์„ ์ˆœ์œ„** - -1. **๋†’์Œ**: ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ๋“ค - - `CommandListPool.*` - - `D3D12VideoRenderer.*` (์กฐ๊ฑด๋ถ€) - -2. **์ค‘๊ฐ„**: ๋ Œ๋”๋ง ๊ด€๋ จ ์œ ํ‹ธ๋ฆฌํ‹ฐ - - `DirectTextureAllocator.*` - - `OverlappedProcessor.*` - -3. **๋‚ฎ์Œ**: ํ•ต์‹ฌ ๋ Œ๋”๋ง ์—”์ง„ - - ์•ˆ์ •์„ฑ ๊ฒ€์ฆ ํ›„ ๋งˆ์ง€๋ง‰์— ์ ์šฉ - -### **ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ** - -```bash -# ๊ธฐ์กด WRL ๋ฒ„์ „ ํ…Œ์ŠคํŠธ -MSBuild Vav2Player.vcxproj /p:Configuration=Debug /p:Platform=x64 - -# std ๋ฒ„์ „ ํ…Œ์ŠคํŠธ -MSBuild Vav2Player.vcxproj /p:Configuration=Debug /p:Platform=x64 /p:DefineConstants="USE_STD_COMPTR" - -# ์„ฑ๋Šฅ ๋น„๊ต -.\TestOnly\Vav2PlayerTestOnly.exe "video.webm" -``` - ---- - -## โœ… **ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ PCH ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ** (2025-09-21) - -### **์ƒˆ๋กœ์šด PCH ๊ตฌ์กฐ** -๊ธฐ์กด์˜ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋ฐฉ์‹์—์„œ ๋ณ„๋„ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜ PCH๋กœ ๊ฐœ์„ ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. - -#### **๊ตฌ์กฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ** -``` -D:\Project\video-av1\vav2\Vav2Player\Vav2Player\ -โ”œโ”€โ”€ pch.h / pch.cpp # WinUI3 GUI์šฉ PCH (๊ธฐ์กด) -โ”œโ”€โ”€ headless/ # ๐Ÿ†• ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ ๋””๋ ‰ํ† ๋ฆฌ -โ”‚ โ”œโ”€โ”€ pch.h # ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ PCH -โ”‚ โ””โ”€โ”€ pch.cpp # PCH ์ƒ์„ฑ ํŒŒ์ผ -โ””โ”€โ”€ src/ # ๊ณตํ†ต ์†Œ์Šค ์ฝ”๋“œ - โ””โ”€โ”€ **/*.cpp # ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ œ๊ฑฐ (#include "pch.h"๋งŒ ์‚ฌ์šฉ) -``` - -#### **์žฅ์ ** -- **์†Œ์Šค ์ฝ”๋“œ ๋‹จ์ˆœํ™”**: ๋ชจ๋“  .cpp ํŒŒ์ผ์—์„œ `#include "pch.h"`๋งŒ ์‚ฌ์šฉ -- **์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ œ๊ฑฐ**: `#ifdef HEADLESS_BUILD` ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋ถˆํ•„์š” -- **๋นŒ๋“œ ์„ค์ • ๋‹จ์ˆœํ™”**: ํ”„๋กœ์ ํŠธ๋ณ„ Include ๊ฒฝ๋กœ๋กœ pch.h ์ž๋™ ์„ ํƒ -- **์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ**: GUI/ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ ๊ฐ„ ์˜์กด์„ฑ ์™„์ „ ๋ถ„๋ฆฌ - -#### **๋นŒ๋“œ ์„ค์ •** -**Vav2Player.vcxproj** (GUI ํ”„๋กœ์ ํŠธ): -```xml -Use -pch.h - -``` - -**Vav2PlayerHeadless.vcxproj** (ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ): -```xml -Use -pch.h -$(ProjectDir)headless;... - -``` - -#### **ํ—ค๋“œ๋ฆฌ์Šค PCH ๋‚ด์šฉ** -```cpp -#pragma once -#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include -#include -// ... ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -extern "C" { #include } -#include // Media Foundation (minimal) -#include // D3D12 (minimal) -#include "../src/Common/VideoTypes.h" -``` - -#### **๊ฒ€์ฆ ์™„๋ฃŒ** -โœ… **๋นŒ๋“œ ์„ฑ๊ณต**: Vav2PlayerHeadless.vcxproj ๋นŒ๋“œ ์™„๋ฃŒ -โœ… **์‹คํ–‰ ํ™•์ธ**: ํ—ค๋“œ๋ฆฌ์Šค ์•ฑ ์ •์ƒ ๋™์ž‘ ํ™•์ธ -โœ… **์˜์กด์„ฑ ๋ถ„๋ฆฌ**: WinUI3 ์˜์กด์„ฑ ์™„์ „ ์ œ๊ฑฐ - -์ด์ œ ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ๋Š” ๋” ๊น”๋”ํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ–ฅํ›„ ์ƒˆ๋กœ์šด ์†Œ์Šค ํŒŒ์ผ ์ถ”๊ฐ€ ์‹œ์—๋„ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### **๐Ÿ—‚๏ธ ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ ์žฌ๊ตฌ์„ฑ** (2025-09-21) - -ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ํŒŒ์ผ์„ `headless/` ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ๋”์šฑ ์ฒด๊ณ„์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. - -#### **์™„๋ฃŒ๋œ ํŒŒ์ผ ์žฌ๊ตฌ์„ฑ** -``` -D:\Project\video-av1\vav2\Vav2Player\Vav2Player\headless\ -โ”œโ”€โ”€ pch.h # ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ PCH ํ—ค๋” -โ”œโ”€โ”€ pch.cpp # PCH ์ƒ์„ฑ ํŒŒ์ผ -โ”œโ”€โ”€ SimpleHeadlessMain.cpp # โœ… ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”์ธ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ -โ”œโ”€โ”€ HeadlessLauncher.cpp # ๊ณ ๊ธ‰ ํ—ค๋“œ๋ฆฌ์Šค ๋Ÿฐ์ฒ˜ (์˜ˆ๋น„) -โ”œโ”€โ”€ HeadlessMain.cpp # ์™„์ „ํ•œ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ (์˜ˆ๋น„) -โ””โ”€โ”€ HeadlessDecoder.h/.cpp # ํ—ค๋“œ๋ฆฌ์Šค ๋””์ฝ”๋” ๋ž˜ํผ (์˜ˆ๋น„) -``` - -#### **์žฅ์ ** -- **๋ช…ํ™•ํ•œ ๊ตฌ์กฐ**: ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ํŒŒ์ผ์ด ํ•œ ๊ณณ์— ์ง‘์ค‘ -- **๋…๋ฆฝ์„ฑ ๊ฐ•ํ™”**: GUI ํ”„๋กœ์ ํŠธ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ํŒŒ์ผ ๊ด€๋ฆฌ -- **ํ™•์žฅ์„ฑ**: ํ–ฅํ›„ ํ—ค๋“œ๋ฆฌ์Šค ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๋™์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ -- **์œ ์ง€๋ณด์ˆ˜์„ฑ**: ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ์ž‘์—… ์‹œ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ๊ด€๋ฆฌ - -#### **ํ”„๋กœ์ ํŠธ ์„ค์ • ์—…๋ฐ์ดํŠธ** -- **Vav2PlayerHeadless.vcxproj**: ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ `headless\` ๊ธฐ์ค€์œผ๋กœ ์ˆ˜์ • -- **์ƒ๋Œ€ ๊ฒฝ๋กœ ์ •๋ฆฌ**: `../src/` ํŒจํ„ด์œผ๋กœ ๊ณตํ†ต ์†Œ์Šค ์ฐธ์กฐ ํ†ต์ผ -- **๋‹จ๊ณ„์  ํ™œ์„ฑํ™”**: ๋ณต์žกํ•œ ํŒŒ์ผ๋“ค์€ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•„์š” ์‹œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ - -#### **ํ˜„์žฌ ํ™œ์„ฑ ๊ตฌ์„ฑ** -```xml - - - - - - - -``` - -#### **๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ™•์ธ** -โœ… **๋นŒ๋“œ ์„ฑ๊ณต**: ์žฌ๊ตฌ์„ฑ๋œ ํŒŒ์ผ๋“ค๋กœ ์ •์ƒ ๋นŒ๋“œ ์™„๋ฃŒ -โœ… **์‹คํ–‰ ํ™•์ธ**: `Vav2PlayerHeadless.exe` ์ •์ƒ ๋™์ž‘ -โœ… **๊ตฌ์กฐ ๊ฒ€์ฆ**: ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ์ด ์ ์ ˆํ•œ ์œ„์น˜์— ๋ฐฐ์น˜ - -์ด์ œ ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ์ž‘์—…์ด ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ๋”์šฑ ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. +#### **โŒ ComPtr โ†’ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (์ทจ์†Œ๋จ)** ([COMPTR_MIGRATION_GUIDE.md](COMPTR_MIGRATION_GUIDE.md)) +- ํ˜ธํ™˜์„ฑ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ทจ์†Œ +- ๊ธฐ์กด `Microsoft::WRL::ComPtr` ๊ณ„์† ์‚ฌ์šฉ +- ๊ตฌํ˜„๋œ ๋Œ€์ฒด ์†”๋ฃจ์…˜๋“ค์€ ์ฐธ๊ณ ์šฉ์œผ๋กœ ๋ณด๊ด€ --- *์ตœ์ข… ์—…๋ฐ์ดํŠธ: 2025-09-21* diff --git a/vav2/COMPTR_MIGRATION_GUIDE.md b/vav2/COMPTR_MIGRATION_GUIDE.md new file mode 100644 index 0000000..ae83b6b --- /dev/null +++ b/vav2/COMPTR_MIGRATION_GUIDE.md @@ -0,0 +1,122 @@ +# ComPtr โ†’ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ + +## โš ๏ธ **ํ”„๋กœ์ ํŠธ ์ƒํƒœ: ์ทจ์†Œ๋จ (CANCELLED)** + +์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์€ ์ง„ํ–‰ ์ค‘ ์—ฌ๋Ÿฌ ํ˜ธํ™˜์„ฑ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ **์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค**. +ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ์กด `Microsoft::WRL::ComPtr`์„ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +### **์ทจ์†Œ ์‚ฌ์œ ** +- D3D12 ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ์˜ˆ์ƒ๋ณด๋‹ค ํฐ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ +- WRL์˜ ๋””๋ฒ„๊น… ์ง€์› ๊ธฐ๋Šฅ ์†์‹ค๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ์ €ํ•˜ +- ๊ธฐ์กด Microsoft ์ƒ˜ํ”Œ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ +- ๋ณต์žกํ•œ COM ์ธํ„ฐํŽ˜์ด์Šค ๋™์ž‘์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ ๋ฐœ์ƒ + +### **๋ณด๊ด€๋œ ๊ตฌํ˜„ ๋‚ด์šฉ** (์ฐธ๊ณ ์šฉ) + +--- + +## ๐Ÿ”„ ComPtr โ†’ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ + +### **ํ˜„์žฌ ์ƒํ™ฉ** +- D3D12 ๋ Œ๋”๋ง ๊ด€๋ จ ํŒŒ์ผ๋“ค์ด `Microsoft::WRL::ComPtr`์— ์˜์กด +- ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ WRL ์˜์กด์„ฑ์œผ๋กœ ์ธํ•œ ๋ณต์žก์„ฑ ์ฆ๊ฐ€ +- ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ ํ‘œ์ค€ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ํ•„์š” + +### **๊ตฌํ˜„๋œ ๋Œ€์ฒด ์†”๋ฃจ์…˜** + +#### **1. StdComPtr (๊ถŒ์žฅ)** +**ํŒŒ์ผ**: `src/Common/StdComPtr.h` +- Microsoft::WRL::ComPtr์™€ 100% ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค +- ์ˆœ์ˆ˜ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉ +- ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง€์› + +```cpp +// ๊ธฐ์กด ์ฝ”๋“œ +using Microsoft::WRL::ComPtr; +ComPtr device; + +// ๋Œ€์ฒด ์ฝ”๋“œ +#include "src/Common/StdComPtr.h" +using Vav2Player::ComPtr; // Drop-in replacement +ComPtr device; // ๋™์ผํ•œ ์‚ฌ์šฉ๋ฒ• +``` + +#### **2. COMWrapper (์™„์ „ ์ปค์Šคํ…€)** +**ํŒŒ์ผ**: `src/Common/COMWrapper.h` +- RAII ๊ธฐ๋ฐ˜ COM ๊ฐ์ฒด ๊ด€๋ฆฌ +- ComPtr ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต +- ๋” ๋ช…์‹œ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ + +#### **3. shared_ptr + ์ปค์Šคํ…€ ๋ธ๋ฆฌํ„ฐ** +**ํŒŒ์ผ**: `src/Common/ComPtrReplacements.h` +- `std::shared_ptr`๊ณผ COM ๊ฐ์ฒด ํ†ตํ•ฉ +- ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ +- ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์œ ์—ฐํ•จ + +### **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต** + +#### **Phase 1: ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋„์ž…** +```cpp +#ifdef USE_STD_COMPTR + #include "src/Common/StdComPtr.h" + using Vav2Player::ComPtr; +#else + #include + using Microsoft::WRL::ComPtr; +#endif +``` + +#### **Phase 2: ํŒŒ์ผ๋ณ„ ์ ์ง„์  ๋ณ€ํ™˜** +1. **์šฐ์„ ์ˆœ์œ„**: ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ ์ œ์™ธ๋œ ํŒŒ์ผ๋“ค +2. **ํ…Œ์ŠคํŠธ**: ๊ฐ ํŒŒ์ผ ๋ณ€ํ™˜ ํ›„ ๊ธฐ๋Šฅ ๊ฒ€์ฆ +3. **์„ฑ๋Šฅ**: ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํ‚น + +#### **Phase 3: ์™„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜** +- ๋ชจ๋“  WRL ์˜์กด์„ฑ ์ œ๊ฑฐ +- ํ”Œ๋žซํผ ๋…๋ฆฝ์  ๋นŒ๋“œ ๋‹ฌ์„ฑ +- Linux/macOS ํฌํŒ… ์ค€๋น„ + +### **์žฅ๋‹จ์  ๋ถ„์„** + +#### **โœ… ์žฅ์ ** +- **์˜์กด์„ฑ ๊ฐ์†Œ**: WRL ์ œ๊ฑฐ๋กœ ๋นŒ๋“œ ๋‹จ์ˆœํ™” +- **ํ‘œ์ค€ ์ค€์ˆ˜**: ๋ชจ๋˜ C++ ์Šคํƒ€์ผ +- **ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ**: ๋‹ค๋ฅธ OS ํฌํŒ… ์šฉ์ด์„ฑ +- **ํ—ค๋“œ๋ฆฌ์Šค ์นœํ™”์ **: ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋‹จ์ˆœํ™” + +#### **โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ** +- **์„ฑ๋Šฅ ์˜ํ–ฅ**: ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ WRL ๋Œ€๋น„ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ€๋Šฅ +- **๋””๋ฒ„๊น…**: WRL์˜ ๋””๋ฒ„๊น… ์ง€์› ๊ธฐ๋Šฅ ์†์‹ค +- **ํ˜ธํ™˜์„ฑ**: ๊ธฐ์กด D3D12 ์ƒ˜ํ”Œ ์ฝ”๋“œ์™€ ์ฐจ์ด +- **ํ…Œ์ŠคํŠธ ํ•„์š”**: ๋ชจ๋“  COM ์ธํ„ฐํŽ˜์ด์Šค ๋™์ž‘ ๊ฒ€์ฆ + +### **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์šฐ์„ ์ˆœ์œ„** + +1. **๋†’์Œ**: ํ—ค๋“œ๋ฆฌ์Šค ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ๋“ค + - `CommandListPool.*` + - `D3D12VideoRenderer.*` (์กฐ๊ฑด๋ถ€) + +2. **์ค‘๊ฐ„**: ๋ Œ๋”๋ง ๊ด€๋ จ ์œ ํ‹ธ๋ฆฌํ‹ฐ + - `DirectTextureAllocator.*` + - `OverlappedProcessor.*` + +3. **๋‚ฎ์Œ**: ํ•ต์‹ฌ ๋ Œ๋”๋ง ์—”์ง„ + - ์•ˆ์ •์„ฑ ๊ฒ€์ฆ ํ›„ ๋งˆ์ง€๋ง‰์— ์ ์šฉ + +### **ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ** + +```bash +# ๊ธฐ์กด WRL ๋ฒ„์ „ ํ…Œ์ŠคํŠธ +MSBuild Vav2Player.vcxproj /p:Configuration=Debug /p:Platform=x64 + +# std ๋ฒ„์ „ ํ…Œ์ŠคํŠธ +MSBuild Vav2Player.vcxproj /p:Configuration=Debug /p:Platform=x64 /p:DefineConstants="USE_STD_COMPTR" + +# ์„ฑ๋Šฅ ๋น„๊ต +.\TestOnly\Vav2PlayerTestOnly.exe "video.webv" +``` + +--- + +*ํ”„๋กœ์ ํŠธ ์ƒํƒœ: ์ทจ์†Œ๋จ (CANCELLED) - 2025-09-26* +*๋ณด๊ด€์šฉ ๋ฌธ์„œ - ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” Microsoft::WRL::ComPtr ๊ณ„์† ์‚ฌ์šฉ* \ No newline at end of file diff --git a/vav2/HEADLESS_PCH_ARCHITECTURE.md b/vav2/HEADLESS_PCH_ARCHITECTURE.md new file mode 100644 index 0000000..be33d8b --- /dev/null +++ b/vav2/HEADLESS_PCH_ARCHITECTURE.md @@ -0,0 +1,110 @@ +# ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ PCH ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  + +## โœ… **ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ PCH ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ** (2025-09-21) + +### **์ƒˆ๋กœ์šด PCH ๊ตฌ์กฐ** +๊ธฐ์กด์˜ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ๋ฐฉ์‹์—์„œ ๋ณ„๋„ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜ PCH๋กœ ๊ฐœ์„ ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. + +#### **๊ตฌ์กฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ** +``` +D:\Project\video-av1\vav2\Vav2Player\Vav2Player\ +โ”œโ”€โ”€ pch.h / pch.cpp # WinUI3 GUI์šฉ PCH (๊ธฐ์กด) +โ”œโ”€โ”€ headless/ # ๐Ÿ†• ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ ๋””๋ ‰ํ† ๋ฆฌ +โ”‚ โ”œโ”€โ”€ pch.h # ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ PCH +โ”‚ โ””โ”€โ”€ pch.cpp # PCH ์ƒ์„ฑ ํŒŒ์ผ +โ””โ”€โ”€ src/ # ๊ณตํ†ต ์†Œ์Šค ์ฝ”๋“œ + โ””โ”€โ”€ **/*.cpp # ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ œ๊ฑฐ (#include "pch.h"๋งŒ ์‚ฌ์šฉ) +``` + +#### **์žฅ์ ** +- **์†Œ์Šค ์ฝ”๋“œ ๋‹จ์ˆœํ™”**: ๋ชจ๋“  .cpp ํŒŒ์ผ์—์„œ `#include "pch.h"`๋งŒ ์‚ฌ์šฉ +- **์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์ œ๊ฑฐ**: `#ifdef HEADLESS_BUILD` ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋ถˆํ•„์š” +- **๋นŒ๋“œ ์„ค์ • ๋‹จ์ˆœํ™”**: ํ”„๋กœ์ ํŠธ๋ณ„ Include ๊ฒฝ๋กœ๋กœ pch.h ์ž๋™ ์„ ํƒ +- **์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ**: GUI/ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ ๊ฐ„ ์˜์กด์„ฑ ์™„์ „ ๋ถ„๋ฆฌ + +#### **๋นŒ๋“œ ์„ค์ •** +**Vav2Player.vcxproj** (GUI ํ”„๋กœ์ ํŠธ): +```xml +Use +pch.h + +``` + +**Vav2PlayerHeadless.vcxproj** (ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ): +```xml +Use +pch.h +$(ProjectDir)headless;... + +``` + +#### **ํ—ค๋“œ๋ฆฌ์Šค PCH ๋‚ด์šฉ** +```cpp +#pragma once +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#include +// ... ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ +extern "C" { #include } +#include // Media Foundation (minimal) +#include // D3D12 (minimal) +#include "../src/Common/VideoTypes.h" +``` + +#### **๊ฒ€์ฆ ์™„๋ฃŒ** +โœ… **๋นŒ๋“œ ์„ฑ๊ณต**: Vav2PlayerHeadless.vcxproj ๋นŒ๋“œ ์™„๋ฃŒ +โœ… **์‹คํ–‰ ํ™•์ธ**: ํ—ค๋“œ๋ฆฌ์Šค ์•ฑ ์ •์ƒ ๋™์ž‘ ํ™•์ธ +โœ… **์˜์กด์„ฑ ๋ถ„๋ฆฌ**: WinUI3 ์˜์กด์„ฑ ์™„์ „ ์ œ๊ฑฐ + +์ด์ œ ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ๋Š” ๋” ๊น”๋”ํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ–ฅํ›„ ์ƒˆ๋กœ์šด ์†Œ์Šค ํŒŒ์ผ ์ถ”๊ฐ€ ์‹œ์—๋„ ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### **๐Ÿ—‚๏ธ ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ ์žฌ๊ตฌ์„ฑ** (2025-09-21) + +ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ํŒŒ์ผ์„ `headless/` ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ๋”์šฑ ์ฒด๊ณ„์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. + +#### **์™„๋ฃŒ๋œ ํŒŒ์ผ ์žฌ๊ตฌ์„ฑ** +``` +D:\Project\video-av1\vav2\Vav2Player\Vav2Player\headless\ +โ”œโ”€โ”€ pch.h # ํ—ค๋“œ๋ฆฌ์Šค ์ „์šฉ PCH ํ—ค๋” +โ”œโ”€โ”€ pch.cpp # PCH ์ƒ์„ฑ ํŒŒ์ผ +โ”œโ”€โ”€ SimpleHeadlessMain.cpp # โœ… ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”์ธ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ +โ”œโ”€โ”€ HeadlessLauncher.cpp # ๊ณ ๊ธ‰ ํ—ค๋“œ๋ฆฌ์Šค ๋Ÿฐ์ฒ˜ (์˜ˆ๋น„) +โ”œโ”€โ”€ HeadlessMain.cpp # ์™„์ „ํ•œ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ (์˜ˆ๋น„) +โ””โ”€โ”€ HeadlessDecoder.h/.cpp # ํ—ค๋“œ๋ฆฌ์Šค ๋””์ฝ”๋” ๋ž˜ํผ (์˜ˆ๋น„) +``` + +#### **์žฅ์ ** +- **๋ช…ํ™•ํ•œ ๊ตฌ์กฐ**: ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ํŒŒ์ผ์ด ํ•œ ๊ณณ์— ์ง‘์ค‘ +- **๋…๋ฆฝ์„ฑ ๊ฐ•ํ™”**: GUI ํ”„๋กœ์ ํŠธ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ํŒŒ์ผ ๊ด€๋ฆฌ +- **ํ™•์žฅ์„ฑ**: ํ–ฅํ›„ ํ—ค๋“œ๋ฆฌ์Šค ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๋™์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ +- **์œ ์ง€๋ณด์ˆ˜์„ฑ**: ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ์ž‘์—… ์‹œ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ๊ด€๋ฆฌ + +#### **ํ”„๋กœ์ ํŠธ ์„ค์ • ์—…๋ฐ์ดํŠธ** +- **Vav2PlayerHeadless.vcxproj**: ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ `headless\` ๊ธฐ์ค€์œผ๋กœ ์ˆ˜์ • +- **์ƒ๋Œ€ ๊ฒฝ๋กœ ์ •๋ฆฌ**: `../src/` ํŒจํ„ด์œผ๋กœ ๊ณตํ†ต ์†Œ์Šค ์ฐธ์กฐ ํ†ต์ผ +- **๋‹จ๊ณ„์  ํ™œ์„ฑํ™”**: ๋ณต์žกํ•œ ํŒŒ์ผ๋“ค์€ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•„์š” ์‹œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ + +#### **ํ˜„์žฌ ํ™œ์„ฑ ๊ตฌ์„ฑ** +```xml + + + + + + + +``` + +#### **๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ™•์ธ** +โœ… **๋นŒ๋“œ ์„ฑ๊ณต**: ์žฌ๊ตฌ์„ฑ๋œ ํŒŒ์ผ๋“ค๋กœ ์ •์ƒ ๋นŒ๋“œ ์™„๋ฃŒ +โœ… **์‹คํ–‰ ํ™•์ธ**: `Vav2PlayerHeadless.exe` ์ •์ƒ ๋™์ž‘ +โœ… **๊ตฌ์กฐ ๊ฒ€์ฆ**: ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ํŒŒ์ผ์ด ์ ์ ˆํ•œ ์œ„์น˜์— ๋ฐฐ์น˜ + +์ด์ œ ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ชจ๋“  ์ž‘์—…์ด ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ๋”์šฑ ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. + + +--- + +*์ตœ์ข… ์—…๋ฐ์ดํŠธ: 2025-09-21* +*Claude Code๋กœ ์ƒ์„ฑ๋จ* \ No newline at end of file diff --git a/vav2/Logging_Architecture_Design.md b/vav2/Logging_Architecture_Design.md new file mode 100644 index 0000000..b98523b --- /dev/null +++ b/vav2/Logging_Architecture_Design.md @@ -0,0 +1,198 @@ +# Vav2Player - Testable Hybrid Logging Architecture Design + +## ๐ŸŽฏ **๋ชฉํ‘œ** +- **ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋กœ๊น…**: ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ๋Œ€์ƒ ์ง€์› (Console, Debug, Network, File) +- **MVVM ํ˜ธํ™˜**: Model-ViewModel-View ํŒจํ„ด๊ณผ ์™„๋ฒฝ ํ†ตํ•ฉ +- **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ**: Unit Test์—์„œ ๋กœ๊น… ๋™์ž‘ ๊ฒ€์ฆ ๊ฐ€๋Šฅ +- **๊ฐœ๋ฐœ์ž ์นœํ™”์ **: ๊ฐ„๋‹จํ•œ API๋กœ ์–ด๋””์„œ๋“  ์‰ฝ๊ฒŒ ์‚ฌ์šฉ + +## ๐Ÿ—๏ธ **์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ** + +### **์ „์ฒด ๊ตฌ์กฐ๋„** +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ View Layer โ”‚ โ”‚ ViewModel โ”‚ โ”‚ Model Layer โ”‚ +โ”‚ (LogMessagePage)โ”‚โ—„โ”€โ”€โ”€โ”ค(LogPageViewModel)โ”‚โ—„โ”€โ”€โ”€โ”ค (LogManager) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ + โ–ผ +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ILogOutput Interface โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ConsoleLogOutputโ”‚ DebugLogOutput โ”‚ FileLogOutput โ”‚NetworkLog โ”‚ +โ”‚ (stdout) โ”‚ (VS Output) โ”‚ (.log file) โ”‚(future) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### **์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ด€๊ณ„** +``` +[VideoPlayerControl] + โ”‚ + โ–ผ +[LogManagerProvider::GetInstance()] โ”€โ” + โ”‚ โ”‚ (Production) + โ–ผ โ–ผ +[Real LogManager] โ—„โ”€โ”€โ”€โ”€ or โ”€โ”€โ”€โ–บ [Mock LogManager] (Testing) + โ”‚ + โ–ผ +[ILogOutput Implementations] +``` + +## ๐Ÿ”ง **ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ** + +### **1. Model Layer** + +#### **ILogManager (Interface)** +```cpp +class ILogManager { +public: + virtual void LogInfo(const std::wstring& message, const std::wstring& source) = 0; + virtual void LogVideoLoad(const std::wstring& filename, bool success) = 0; + virtual void AttachLogOutput(std::unique_ptr output) = 0; + // ... ๊ธฐํƒ€ ๋กœ๊น… ๋ฉ”์„œ๋“œ +}; +``` + +#### **LogManager (์‹ค์ œ ๊ตฌํ˜„์ฒด)** +- Singleton ํŒจํ„ด +- ILogManager ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ +- ๋‹ค์ค‘ ILogOutput ๊ด€๋ฆฌ +- Thread-safe ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ €์žฅ + +#### **MockLogManager (ํ…Œ์ŠคํŠธ์šฉ)** +- ILogManager ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ +- ๋กœ๊ทธ ํ˜ธ์ถœ ๊ธฐ๋ก ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋Šฅ +- Unit Test์—์„œ ๋กœ๊น… ๋™์ž‘ ๊ฒ€์ฆ + +### **2. Infrastructure Layer** + +#### **LogManagerProvider (Global Access)** +```cpp +class LogManagerProvider { +public: + static ILogManager& GetInstance(); // Production: LogManager, Test: MockLogManager + static void SetInstance(std::shared_ptr mock); // Test์—์„œ Mock ์ฃผ์ž… + static void ResetToDefault(); // Test ํ›„ ์ •๋ฆฌ +}; +``` + +#### **ILogOutput (์ถœ๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค)** +```cpp +class ILogOutput { +public: + virtual void OutputLog(const LogMessage& message) = 0; + virtual void SetLogLevel(LogLevel level) = 0; + virtual std::wstring GetName() const = 0; +}; +``` + +#### **๊ตฌํ˜„์ฒด๋“ค** +- **ConsoleLogOutput**: stdout ์ฝ˜์†” ์ถœ๋ ฅ +- **DebugLogOutput**: Visual Studio ์ถœ๋ ฅ ์ฐฝ (OutputDebugString) +- **FileLogOutput**: ํŒŒ์ผ ๋กœ๊น… +- **NetworkLogOutput**: ๋„คํŠธ์›Œํฌ ๋กœ๊น… (ํ–ฅํ›„ ํ™•์žฅ) + +### **3. Presentation Layer** + +#### **LogMessagePageViewModel (ํ–ฅํ›„ ๊ตฌํ˜„)** +- LogManager์™€ View ์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ +- Observable Collection ๊ด€๋ฆฌ +- UI ์ƒํƒœ ๊ด€๋ฆฌ (ํ•„ํ„ฐ, ์ž๋™ ์Šคํฌ๋กค ๋“ฑ) + +#### **LogMessagePage (View)** +- ์ˆœ์ˆ˜ XAML ์„ ์–ธํ˜• UI +- ViewModel์— ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ + +## ๐Ÿ“‹ **์‚ฌ์šฉ ๋ฐฉ๋ฒ•** + +### **Production ์ฝ”๋“œ์—์„œ** +```cpp +class VideoPlayerControl { + void LoadVideo(const std::wstring& filePath) { + // ์–ด๋””์„œ๋“  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋กœ๊น… + LogManagerProvider::GetInstance().LogInfo(L"Loading video: " + filePath, L"VideoPlayer"); + + // ๋น„๋””์˜ค ๋กœ๋”ฉ ๋กœ์ง... + bool success = LoadVideoFile(filePath); + + LogManagerProvider::GetInstance().LogVideoLoad(filePath, success); + } +}; +``` + +### **MainWindow์—์„œ ์ดˆ๊ธฐํ™”** +```cpp +class MainWindow { + MainWindow() { + // LogManager ์ดˆ๊ธฐํ™” ๋ฐ ์ถœ๋ ฅ ์„ค์ • + auto& logManager = LogManager::GetInstance(); + logManager.InitializeDefaultOutputs(); // Console + Debug ์ถœ๋ ฅ ์ž๋™ ์ถ”๊ฐ€ + + // ์„ ํƒ์ ์œผ๋กœ ํŒŒ์ผ ๋กœ๊น… ์ถ”๊ฐ€ + logManager.AttachLogOutput(LogOutputFactory::CreateFileOutput(L"app.log")); + } +}; +``` + +### **Unit Test์—์„œ** +```cpp +TEST_METHOD(VideoPlayerControl_LoadVideo_ShouldLogCorrectly) { + // Arrange - Mock LogManager ์ฃผ์ž… + auto mockLogManager = std::make_shared(); + LogManagerProvider::SetInstance(mockLogManager); + + VideoPlayerControl player; + + // Act + player.LoadVideo(L"test.mp4"); + + // Assert - ๋กœ๊น… ํ˜ธ์ถœ ๊ฒ€์ฆ + Assert::AreEqual(2, mockLogManager->GetLogCallCount()); + Assert::IsTrue(mockLogManager->WasMethodCalled(L"LogInfo")); + Assert::IsTrue(mockLogManager->WasMethodCalled(L"LogVideoLoad")); + Assert::IsTrue(mockLogManager->WasMessageLogged(L"Loading video")); + + // Cleanup + LogManagerProvider::ResetToDefault(); +} +``` + +## โœ… **์žฅ์ ** + +### **๊ฐœ๋ฐœ ํŽธ์˜์„ฑ** +- **์ „์—ญ ์ ‘๊ทผ**: `LogManagerProvider::GetInstance()`๋กœ ์–ด๋””์„œ๋“  ์‚ฌ์šฉ +- **๊ฐ„๋‹จํ•œ API**: ๋ณต์žกํ•œ ์˜์กด์„ฑ ์ „๋‹ฌ ๋ถˆํ•„์š” +- **ํƒ€์ž… ์•ˆ์ „**: ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋กœ๊น… ๋ฉ”์„œ๋“œ ๊ฒ€์ฆ + +### **ํ™•์žฅ์„ฑ** +- **ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜**: ์ƒˆ๋กœ์šด ILogOutput ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€ ์šฉ์ด +- **๋‹ค์ค‘ ์ถœ๋ ฅ**: Console + Debug + File + Network ๋™์‹œ ์ถœ๋ ฅ ๊ฐ€๋Šฅ +- **๊ฐœ๋ณ„ ์„ค์ •**: ์ถœ๋ ฅ๋ณ„๋กœ ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋…๋ฆฝ ์„ค์ • + +### **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ** +- **Mock ์ง€์›**: MockLogManager๋กœ ๋กœ๊น… ๋™์ž‘ ์™„๋ฒฝ ๊ฒ€์ฆ +- **๊ฒฉ๋ฆฌ๋œ ํ…Œ์ŠคํŠธ**: ํ…Œ์ŠคํŠธ ๊ฐ„ ๋กœ๊ทธ ์ƒํƒœ ๊ฒฉ๋ฆฌ +- **๊ฒ€์ฆ API**: ๋กœ๊ทธ ํ˜ธ์ถœ ํšŸ์ˆ˜, ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ + +### **MVVM ํ˜ธํ™˜์„ฑ** +- **Model**: LogManager๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ด€๋ฆฌ +- **ViewModel**: UI ๋ฐ”์ธ๋”ฉ๊ณผ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋กœ์ง ๋ถ„๋ฆฌ +- **View**: ์ˆœ์ˆ˜ ์„ ์–ธํ˜• UI + +## ๐Ÿ”„ **ํ™•์žฅ ๊ณ„ํš** + +1. **LogMessagePageViewModel ๊ตฌํ˜„**: ViewModel ํŒจํ„ด ์™„์„ฑ +2. **Network Logging**: ์›๊ฒฉ ๋กœ๊ทธ ์ˆ˜์ง‘ ์„œ๋ฒ„ ์—ฐ๋™ +3. **Log Filtering**: ๋™์  ๋กœ๊ทธ ํ•„ํ„ฐ๋ง UI +4. **Performance Logging**: ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ ์ „์šฉ ๋กœ๊น… +5. **Structured Logging**: JSON ๊ธฐ๋ฐ˜ ๊ตฌ์กฐํ™” ๋กœ๊น… + +## ๐ŸŽฏ **๊ฒฐ๋ก ** + +์ด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋Š”: +- **Production**: ๊ฐ„ํŽธํ•œ Singleton ์ ‘๊ทผ +- **Testing**: ์™„๋ฒฝํ•œ Mock ์ง€์› +- **Architecture**: MVVM ํŒจํ„ด ์ค€์ˆ˜ +- **Extensibility**: ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜ ํ™•์žฅ์„ฑ + +์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ตœ์ ์˜ ๋กœ๊น… ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. \ No newline at end of file diff --git a/vav2/Vav2Player/Vav2Player/App.xaml.cpp b/vav2/Vav2Player/Vav2Player/App.xaml.cpp index 0eb64d9..dd4479f 100644 --- a/vav2/Vav2Player/Vav2Player/App.xaml.cpp +++ b/vav2/Vav2Player/Vav2Player/App.xaml.cpp @@ -46,7 +46,7 @@ namespace winrt::Vav2Player::implementation InitializeComponent(); // Test VavCore integration on startup - TestVavCoreIntegration(); + // TestVavCoreIntegration(); // Disabled for logging system test #if defined _DEBUG && !defined DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION UnhandledException([](IInspectable const&, UnhandledExceptionEventArgs const& e) @@ -62,7 +62,7 @@ namespace winrt::Vav2Player::implementation void App::OnLaunched(LaunchActivatedEventArgs const&) { - window = make(); + window = winrt::make(); window.Activate(); } } \ No newline at end of file diff --git a/vav2/Vav2Player/Vav2Player/LogMessagePage.idl b/vav2/Vav2Player/Vav2Player/LogMessagePage.idl new file mode 100644 index 0000000..35d3014 --- /dev/null +++ b/vav2/Vav2Player/Vav2Player/LogMessagePage.idl @@ -0,0 +1,8 @@ +namespace Vav2Player +{ + [default_interface] + runtimeclass LogMessagePage : Microsoft.UI.Xaml.Controls.UserControl + { + LogMessagePage(); + }; +} \ No newline at end of file diff --git a/vav2/Vav2Player/Vav2Player/LogMessagePage.xaml b/vav2/Vav2Player/Vav2Player/LogMessagePage.xaml new file mode 100644 index 0000000..c823618 --- /dev/null +++ b/vav2/Vav2Player/Vav2Player/LogMessagePage.xaml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + +