VisioForge
์˜คํ”ˆ์†Œ์Šค ยท LGPL v2

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 ํ”Œ๋žซํผ์—์„œ ๋น„๋””์˜ค ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€์†ํ•˜์„ธ์š”.