GStreamer Metal ํ๋ฌ๊ทธ์ธ
Apple ํ๋ซํผ์์ GStreamer๋ฅผ ์ํ GPU ๊ฐ์ ๋น๋์ค ์ฒ๋ฆฌ. 7๊ฐ์ Metal ๊ธฐ๋ฐ ์๋ฆฌ๋จผํธ๊ฐ CPU ๋ฐ์ด๋ ์์ ์ ์ ๋ก ์นดํผ, ์ฑ๊ธ ํจ์ค GPU ์ฒ๋ฆฌ๋ก ๋์ฒดํฉ๋๋ค.
GStreamer Metal์ด๋?
GStreamer Metal(gst-vf-metal)์ macOS ๋ฐ iOS์ฉ ์ผ๋ฐ์ ์ธ CPU ๋ฐ์ด๋ ๋น๋์ค ์๋ฆฌ๋จผํธ์ Metal ๊ธฐ๋ฐ ๊ตฌํ์ ์ ๊ณตํ๋ ์ ๋ฌธ๊ฐ๊ธ GStreamer ํ๋ฌ๊ทธ์ธ์ ๋๋ค. Apple์ Metal ํ๋ ์์ํฌ์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ํตํด ์ต์ํ์ CPU ์ค๋ฒํค๋๋ก ์ค์๊ฐ ๋น๋์ค ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค.
์ ๋ก ์นดํผ ์ํคํ ์ฒ
CVMetalTextureCache๊ฐ ๋ถํ์ํ CPU-GPU ๋ณต์ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์๋ฆฌ๋จผํธ๋ ์์ด๋ดํฐํฐ/๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก GPU ์์ ์ ๊ฑด๋๋๋๋ค.
์ฑ๊ธ ํจ์ค GPU ์ฒ๋ฆฌ
๋ชจ๋ ํํฐ ํจ๊ณผ(๋ฐ๊ธฐ, ๋๋น, ์์กฐ, ํฌ๋ก๋ง ํค, LUT ๋ฑ)๊ฐ ํ๋์ GPU ๋์คํจ์น๋ก ์ ์ฉ โ ํจ๊ณผ ๊ฐ ์ค๊ฐ ํ๋ ์ ๋ฒํผ ์์.
ํผํฉ ํฌ๋งท ํฉ์ฑ
์ปดํฌ์งํฐ๊ฐ ์ด์ข ์ ๋ ฅ ํฌ๋งท(์: BGRA + NV12 ๋์ ์ฌ์ฉ)์ ์๋ ํฌ๋งท ๋ณํ๊ณผ ํจ๊ป ํ์ฉํฉ๋๋ค.
6๊ฐ์ง ํฝ์ ํฌ๋งท
์ ์ฒด ์๋ฆฌ๋จผํธ ์ค์ํธ์์ BGRA, RGBA, NV12, I420, UYVY, YUY2 ํฝ์ ํฌ๋งท์ ์ง์ํฉ๋๋ค.
GPU ๊ฐ์ ์๋ฆฌ๋จผํธ
vfmetalcompositor
๋ค์ค ์ ๋ ฅ ๋น๋์ค ๋ฏน์ฑ ๋ฐ ํฉ์ฑ
- ํจ๋๋ณ ์์น, ์ค์ผ์ผ๋ง, ์ํ ๋ฐ Z ์์
- ๋ธ๋ ๋ ๋ชจ๋: source, over, add
- ํผํฉ ํฌ๋งท ์ ๋ ฅ(BGRA + NV12 ๋์ ์ฌ์ฉ)
- ์ข ํก๋น ๋ณด์กด ํฌ๊ธฐ ์ ์ฑ
vfmetalvideosink
ํ๋์จ์ด ๊ฐ์ ๋น๋์ค ๋ ๋๋ฌ ๋ฐ ๋์คํ๋ ์ด
- GstVideoOverlay ๋ฐ GstNavigation ์ง์
- ์ข ํก๋น ๋ณด์กด ์๋ ์ฐฝ ์์ฑ
- ๋ง์ฐ์ค/ํค๋ณด๋ ์ด๋ฒคํธ ์ ๋ฌ
- BGRA, RGBA, NV12, I420 ํฌ๋งท
vfmetalvideofilter
๋จ์ผ ์๋ฆฌ๋จผํธ์ 15๊ฐ์ง GPU ๊ฐ์ ์๊ฐ ํจ๊ณผ
- ์์: ๋ฐ๊ธฐ, ๋๋น, ์ฑ๋, ์์กฐ, ๊ฐ๋ง
- ํจ๊ณผ: ์ ๋ช ๋/ํ๋ฆผ, ์ธํผ์, ๋ฐ์ , ๋ ธ์ด์ฆ, ๋น๋คํธ
- ํฌ๋ก๋ง ํค(๊ทธ๋ฆฐ ์คํฌ๋ฆฐ) ํ์ฉ ์ค์ฐจ ์ ์ด
- 3D LUT ์์ ๊ทธ๋ ์ด๋ฉ(.cube ๋ฐ .png ํฌ๋งท)
vfmetalconvertscale
ํฌ๋งท ๋ณํ๊ณผ ์ค์ผ์ผ๋ง ํตํฉ
- 6๊ฐ์ง ํฌ๋งท ์ ๋ชจ๋ ์ง์(์: NV12โBGRA, UYVYโI420)
- ๋ฐ์ด๋ฆฌ๋์ด ๋ฐ ์ต๊ทผ์ ์ด์ ๋ณด๊ฐ
- ์ฌ์ฉ์ ์ ์ ํ ๋๋ฆฌ ์์์ ๋ ํฐ๋ฐ์ฑ
- videoconvert์ videoscale ๋ชจ๋ ๋์ฒด
vfmetaltransform
๊ธฐํํ์ ๋ณํ
- 8๊ฐ์ง ํ์ ๋ฐ ๋ค์ง๊ธฐ ๋ฐฉ๋ฒ
- ๊ฐ์ฅ์๋ฆฌ๋ณ ํฌ๋กญํ
- ๋ณํ ๋ถํ์ ์ ์์ด๋ดํฐํฐ ํจ์ค์ค๋ฃจ
- BGRA, RGBA, NV12, I420 ํฌ๋งท
vfmetaldeinterlace
GPU ๊ฐ์ ์ธํฐ๋ ์ด์ค ์ ๊ฑฐ
- Bob, weave, linear, greedy-H ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ์ ์ ์ํ ๋์ธํฐ๋ ์ด์ค(greedy-H)
- ์๋/์๋ ํ๋ ์์ ๊ฐ์ง
- BGRA, RGBA, NV12, I420 ํฌ๋งท
vfmetaloverlay
์ด๋ฏธ์ง ํฉ์ฑ ์ค๋ฒ๋ ์ด
- PNG ๋ฐ JPEG ์ค๋ฒ๋ ์ด ์ง์
- ์ ๋ ๋ฐ ์๋ ์์น ์ง์
- ์ํ ๋ธ๋ ๋ฉ ์ฌ์ฉ์ ์ ์ ํฌ๊ธฐ
- BGRA, RGBA, NV12, I420 ํฌ๋งท
15๊ฐ์ง ๋น๋์ค ํจ๊ณผ
๋ชจ๋ ํจ๊ณผ๋ ๋จ์ผ GPU ํจ์ค๋ก ์ ์ฉ๋๋ฉฐ GstController๋ฅผ ํตํด ์ ๋๋ฉ์ด์ ๊ฐ๋ฅ:
๋ฐ๊ธฐ ์กฐ์ (-1~1)
๋๋น ์ ์ด(0~2)
์ ์ฑ๋(0~2)
์์กฐ ํ์ (-1~1)
๊ฐ๋ง ๋ณด์ (0.01~10)
์ ๋ช ๋ ๋ฐ ํ๋ฆผ(-1~1)
์ธํผ์ ํค ํจ๊ณผ(0~1)
์ ๋ฐ์
๋ ธ์ด์ฆ/๊ทธ๋ ์ธ ์ค๋ฒ๋ ์ด(0~1)
๋น๋คํธ ์ด๋ก๊ฒ(0~1)
ํฌ๋ก๋ง ํค(๊ทธ๋ฆฐ ์คํฌ๋ฆฐ ์ ๊ฑฐ)
ํฌ๋ก๋ง ํค ๊ฐ์ฅ์๋ฆฌ ํ์ฉ ์ค์ฐจ
ํฌ๋ก๋ง ํค ๊ฐ์ฅ์๋ฆฌ ๋ถ๋๋ฌ์
.cube ํ์ผ์ ํตํ 3D LUT ๊ทธ๋ ์ด๋ฉ(DaVinci Resolve/Adobe)
.png ์คํธ๋ฆฝ ํ์ผ์ ํตํ 3D LUT ๊ทธ๋ ์ด๋ฉ
ํ๋ซํผ ์ง์
macOS
13.0+(Ventura)
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(gstvfmetal.dylib)
iOS
14.0+
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(libgstvfmetal.a)
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
GStreamer Metal์ด๋ ๋ฌด์์ธ๊ฐ์?
GStreamer Metal์ macOS ๋ฐ iOS์ฉ GPU ๊ฐ์ ๋น๋์ค ์ฒ๋ฆฌ ์๋ฆฌ๋จผํธ๋ฅผ ์ ๊ณตํ๋ ์คํ์์ค GStreamer ํ๋ฌ๊ทธ์ธ์ ๋๋ค. Apple์ Metal ํ๋ ์์ํฌ์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ CPU ๋ฐ์ด๋ ๋น๋์ค ์์ ์ ๋์ฒดํ๋ฉฐ, ํฉ์ฑ, ์์ ๋ณด์ , ํฌ๋งท ๋ณํ, ๋์ธํฐ๋ ์ด์ค์ ๊ฐ์ ์์ ์์ ํฌ๊ฒ ํฅ์๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ค ํ๋ซํผ์ด ์ง์๋๋์?
GStreamer Metal์ macOS 13.0(Ventura) ์ด์๊ณผ iOS 14.0 ์ด์์ ์ง์ํฉ๋๋ค. macOS์์๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(gstvfmetal.dylib)๋ก ๋น๋๋๊ณ , iOS์์๋ ๋ฑ๋ก ํค๋๊ฐ ํฌํจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(libgstvfmetal.a)๋ก ๋น๋๋ฉ๋๋ค.
์ด๋ค ํฝ์ ํฌ๋งท์ด ์ง์๋๋์?
์ด ํ๋ฌ๊ทธ์ธ์ 6๊ฐ์ง ํฝ์ ํฌ๋งท์ ์ง์ํฉ๋๋ค: BGRA, RGBA, NV12, I420, UYVY, YUY2. ๋๋ถ๋ถ์ ์๋ฆฌ๋จผํธ๋ BGRA, RGBA, NV12, I420์ ์ง์ํ๋ฉฐ, vfmetalconvertscale์ ์ต๋ ๋ณํ ์ ์ฐ์ฑ์ ์ํด 6๊ฐ์ง ํฌ๋งท ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ ์ด๋ป๊ฒ ์ค์นํ๋์?
GitHub ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ๊ณ macOS์ฉ ํฌํจ ๋น๋ ์คํฌ๋ฆฝํธ(./build.sh)๋ฅผ ์คํํฉ๋๋ค. iOS์ ๊ฒฝ์ฐ CMake ๊ธฐ๋ฐ ํฌ๋ก์ค ์ปดํ์ผ ์ค์ ์ ์ฌ์ฉํฉ๋๋ค. ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ GStreamer ํ๋ฌ๊ทธ์ธ ๊ฒฝ๋ก์ ๋ฐฐ์นํ๋ฉด ์๋์ผ๋ก ๊ฒ์๋ฉ๋๋ค.
๋ฌด๋ฃ์ธ๊ฐ์? ๋ผ์ด์ ์ค๋ ๋ฌด์์ธ๊ฐ์?
์, GStreamer Metal์ ์์ ํ ๋ฌด๋ฃ์ด๋ฉฐ ์คํ์์ค๋ก, GNU Library General Public License v2(LGPL v2)์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. ๋ผ์ด์ ์ค ๋น์ฉ ์์ด ์คํ์์ค ๋ฐ ์์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค GStreamer ์๋ฆฌ๋จผํธ๊ฐ ํฌํจ๋์ด ์๋์?
์ด ํ๋ฌ๊ทธ์ธ์ 7๊ฐ์ง GPU ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ์ ๊ณตํฉ๋๋ค: vfmetalcompositor(๋น๋์ค ๋ฏน์ฑ), vfmetalvideosink(๋์คํ๋ ์ด), vfmetalvideofilter(15๊ฐ์ง ์๊ฐ ํจ๊ณผ), vfmetalconvertscale(ํฌ๋งท ๋ณํ ๋ฐ ์ค์ผ์ผ๋ง), vfmetaltransform(ํ์ /๋ค์ง๊ธฐ/ํฌ๋กญ), vfmetaldeinterlace(์ธํฐ๋ ์ด์ค ์ ๊ฑฐ), vfmetaloverlay(์ด๋ฏธ์ง ํฉ์ฑ).
iOS ์ฑ์์ ์ฌ์ฉํ ์ ์๋์?
์. iOS์ฉ์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ์ ์ ๋ฑ๋ก์ฉ gstvfmetal_static.h ํค๋๊ฐ ํฌํจ๋ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(libgstvfmetal.a)๋ก ๋น๋๋ฉ๋๋ค. GStreamer iOS SDK์ ํตํฉ๋๋ฉฐ iOS์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋น๋์ค ํฌ๋งท์ ์ง์ํฉ๋๋ค.
GPU ์ฒ๋ฆฌ๋ CPU ๊ธฐ๋ฐ ์๋ฆฌ๋จผํธ์ ์ด๋ป๊ฒ ๋น๊ต๋๋์?
GPU ๊ฐ์ ์ฒ๋ฆฌ๋ CPU ๊ธฐ๋ฐ GStreamer ์๋ฆฌ๋จผํธ์ ๋นํด ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค. ์ ๋ก ์นดํผ ์ํคํ ์ฒ์ ์ฑ๊ธ ํจ์ค ์ฒ๋ฆฌ๊ฐ ๋ฐ์ดํฐ ์ ์ก๊ณผ ํ๋ ์ ๋ฒํผ๋ง์ ์ต์ํํฉ๋๋ค. ์๋ฆฌ๋จผํธ๋ ์์ด๋ดํฐํฐ ๊ฐ์์ ์๋์ผ๋ก GPU ์์ ์ ๋ฐ์ดํจ์คํ์ฌ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ ๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
GStreamer Metal ์์ํ๊ธฐ
GPU ๊ธฐ๋ฐ GStreamer ์๋ฆฌ๋จผํธ๋ก Apple ํ๋ซํผ์์ ๋น๋์ค ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๊ฐ์ํ์ธ์.
