[๐Ÿ‡บ๐Ÿ‡ธ](/README.md "English") [๐Ÿ‡จ๐Ÿ‡ณ](/README-cn.md "Simplified Chinese") [๐Ÿ‡ฏ๐Ÿ‡ต](/README-ja.md "Japanese") [๐Ÿ‡ฎ๐Ÿ‡น](/README-it.md "Italian") [๐Ÿ‡ฐ๐Ÿ‡ท](/README-ko.md "Korean") [๐Ÿ‡ท๐Ÿ‡บ](/README-ru.md "Russian") [๐Ÿ‡ง๐Ÿ‡ท](/README-pt.md "Portuguese") [๐Ÿ‡ช๐Ÿ‡ธ](/README-es.md "Spanish") [![license](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg) # Intro ๋น„๋””์˜ค ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์นœ์ ˆํ•œ ์†Œ๊ฐœ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. ๋น„๋ก ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž/์—”์ง€๋‹ˆ์–ด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ž‘์„ฑ ํ–ˆ์ง€๋งŒ, **๋ˆ„๊ตฌ๋‚˜ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š”** ๊ธ€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” [๋น„๋””์˜ค ๊ธฐ์ˆ  ๋‰ด๋น„๋ฅผ ์œ„ํ•œ ๋ฏธ๋‹ˆ ์›Œํฌ์ƒต](https://docs.google.com/presentation/d/17Z31kEkl_NGJ0M66reqr9_uTG6tI5EDDVXpdPKVuIrs/edit#slide=id.p)์—์„œ ๋น„๋กฏ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ **์‰ฌ์šด ๋‹จ์–ด, ๋งŽ์€ ์‹œ๊ฐ ์ž๋ฃŒ ๊ทธ๋ฆฌ๊ณ  ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ**๋“ค๋กœ ๋””์ง€ํ„ธ ๋น„๋””์˜ค์˜ ์ปจ์…‰์„ ์†Œ๊ฐœํ•˜๋ฉฐ ์–ด๋””์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์‹์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ, ์ œ์•ˆ ๋“ฑ์„ ๋ณด๋‚ด์…”์„œ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”. **์‹ค์Šต** ์„น์…˜์—์„œ๋Š” **๋„์ปค**๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํด๋ก ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ```bash git clone https://github.com/leandromoreira/digital_video_introduction.git cd digital_video_introduction ./setup.sh ``` > **์•Œ๋ฆผ**: `./s/ffmpeg`๋‚˜ `./s/mediainfo` ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ,ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์ด ํฌํ•จ๋œ **๋„์ปค ์•ฑ**์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. **๋ชจ๋“  ์‹ค์Šต ๋‚ด์šฉ์€ ์—ฌ๋Ÿฌ๋ถ„์ด ํด๋ก ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํด๋”์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค**. **์ฃผํ”ผํ„ฐ ์˜ˆ์ œ**์˜ ๊ฒฝ์šฐ, `./s/start_jupyter.sh`๋กœ ์„œ๋ฒ„๋ฅผ ๋ฐ˜๋“œ์‹œ ์‹คํ–‰ํ•ด์•ผํ•˜๋ฉฐ URL์„ ๋ณต์‚ฌํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. # ๋ณ€๊ฒฝ๋กœ๊ทธ * DRM ์‹œ์Šคํ…œ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. * 1.0.0 ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์ฆˆ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. * ์š”์•ฝ ๋ฒ„์ „์˜ ์ค‘๊ตญ์–ด ๋ฒˆ์—ญ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. # ์ƒ‰์ธ - [Intro](#intro) - [๋ณ€๊ฒฝ๋กœ๊ทธ](#%EB%B3%80%EA%B2%BD%EB%A1%9C%EA%B7%B8) - [์ƒ‰์ธ](#%EC%83%89%EC%9D%B8) - [๊ธฐ์ดˆ ์šฉ์–ด](#%EA%B8%B0%EC%B4%88-%EC%9A%A9%EC%96%B4) - [์ค‘๋ณต ์ œ๊ฑฐ](#%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0) - [์ƒ‰์ƒ, ํœ˜๋„, ์‹œ๊ฐ](#%EC%83%89%EC%83%81-%ED%9C%98%EB%8F%84-%EC%8B%9C%EA%B0%81) - [์ƒ‰์ƒ ๋ชจ๋ธ](#%EC%83%89%EC%83%81-%EB%AA%A8%EB%8D%B8) - [YCbCr <-> RGB ๋ณ€ํ™˜](#ycbcr---rgb-%EB%B3%80%ED%99%98) - [ํฌ๋กœ๋งˆ ์„œ๋ธŒ์ƒ˜ํ”Œ๋ง](#%ED%81%AC%EB%A1%9C%EB%A7%88-%EC%84%9C%EB%B8%8C%EC%83%98%ED%94%8C%EB%A7%81) - [ํ”„๋ ˆ์ž„ ์œ ํ˜•](#%ED%94%84%EB%A0%88%EC%9E%84-%EC%9C%A0%ED%98%95) - [I Frame (์ธํŠธ๋ผ, ํ‚คํ”„๋ ˆ์ž„)](#i-frame-%EC%9D%B8%ED%8A%B8%EB%9D%BC-%ED%82%A4%ED%94%84%EB%A0%88%EC%9E%84) - [P Frame (predicted)](#p-frame-predicted) - [B Frame (bi-predictive)](#b-frame-bi-predictive) - [์š”์•ฝ](#%EC%9A%94%EC%95%BD) - [์‹œ๊ฐ„์  ์ค‘๋ณต (์ธํ„ฐ ํ”„๋ฆฌ๋”•์…˜)](#%EC%8B%9C%EA%B0%84%EC%A0%81-%EC%A4%91%EB%B3%B5-%EC%9D%B8%ED%84%B0-%ED%94%84%EB%A6%AC%EB%94%95%EC%85%98) - [๊ณต๊ฐ„์  ์ค‘๋ณต (์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜)](#%EA%B3%B5%EA%B0%84%EC%A0%81-%EC%A4%91%EB%B3%B5-%EC%9D%B8%ED%8A%B8%EB%9D%BC-%ED%94%84%EB%A6%AC%EB%94%95%EC%85%98) - [์ฝ”๋ฑ์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ์š”?](#%EC%BD%94%EB%8D%B1%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%A0%EA%B9%8C%EC%9A%94) - [๋ฌด์—‡์„? ์™œ? ์–ด๋–ป๊ฒŒ?](#%EB%AC%B4%EC%97%87%EC%9D%84-%EC%99%9C-%EC%96%B4%EB%96%BB%EA%B2%8C) - [์—ญ์‚ฌ](#%EC%97%AD%EC%82%AC) - [์ผ๋ฐ˜ ์ฝ”๋ฑ](#%EC%9D%BC%EB%B0%98-%EC%BD%94%EB%8D%B1) - [์ฒซ ๋ฒˆ์งธ ์Šคํ… - ์‚ฌ์ง„ ํŒŒํ‹ฐ์…”๋‹](#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%8A%A4%ED%85%9D---%EC%82%AC%EC%A7%84-%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9D) - [๋‘ ๋ฒˆ์งธ ์Šคํ… - ํ”„๋ฆฌ๋”•์…˜](#%EB%91%90-%EB%B2%88%EC%A7%B8-%EC%8A%A4%ED%85%9D---%ED%94%84%EB%A6%AC%EB%94%95%EC%85%98) - [์„ธ ๋ฒˆ์งธ ์Šคํƒญ - ๋ณ€ํ™˜](#%EC%84%B8-%EB%B2%88%EC%A7%B8-%EC%8A%A4%ED%83%AD---%EB%B3%80%ED%99%98) - [๋„ค ๋ฒˆ์งธ ๋‹จ๊ณ„ - ์–‘์žํ™”](#%EB%84%A4-%EB%B2%88%EC%A7%B8-%EB%8B%A8%EA%B3%84---%EC%96%91%EC%9E%90%ED%99%94) - [๋‹ค์„ฏ๋ฒˆ์งธ ๋‹จ๊ณ„ - ์—”ํŠธ๋กœํ”ผ ์ธ์ฝ”๋”ฉ](#%EB%8B%A4%EC%84%AF%EB%B2%88%EC%A7%B8-%EB%8B%A8%EA%B3%84---%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BC-%EC%9D%B8%EC%BD%94%EB%94%A9) - [VLC coding:](#vlc-coding) - [์‚ฐ์ˆ ์  ์ฝ”๋”ฉ:](#%EC%82%B0%EC%88%A0%EC%A0%81-%EC%BD%94%EB%94%A9) - [์—ฌ์„ฏ๋ฒˆ์งธ ๋‹จ๊ณ„ - ๋น„ํŠธ ์ŠคํŠธ๋ฆผ ํฌ๋งท](#%EC%97%AC%EC%84%AF%EB%B2%88%EC%A7%B8-%EB%8B%A8%EA%B3%84---%EB%B9%84%ED%8A%B8-%EC%8A%A4%ED%8A%B8%EB%A6%BC-%ED%8F%AC%EB%A7%B7) - [H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ](#h264-%EB%B9%84%ED%8A%B8%EC%8A%A4%ED%8A%B8%EB%A6%BC) - [๋ฆฌ๋ทฐ](#%EB%A6%AC%EB%B7%B0) - [์–ด๋–ป๊ฒŒ H.265๋Š” H.264๋ณด๋‹ค ๋” ๋†’์€ ์••์ถ•๋ฅ ์„ ๋‹ฌ์„ฑํ–ˆ๋Š”๊ฐ€](#%EC%96%B4%EB%96%BB%EA%B2%8C-h265%EB%8A%94-h264%EB%B3%B4%EB%8B%A4-%EB%8D%94-%EB%86%92%EC%9D%80-%EC%95%95%EC%B6%95%EB%A5%A0%EC%9D%84-%EB%8B%AC%EC%84%B1%ED%96%88%EB%8A%94%EA%B0%80) - [์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ](#%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D) - [์ผ๋ฐ˜์ ์ธ ์•„ํ‚คํ…์ณ](#%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90) - [์ ์ง„์  ๋‹ค์šด๋กœ๋“œ์™€ ์ ์‘ํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ](#%EC%A0%90%EC%A7%84%EC%A0%81-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C%EC%99%80-%EC%A0%81%EC%9D%91%ED%98%95-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D) - [์ปจํ…์ธ  ๋ณดํ˜ธ](#%EC%BB%A8%ED%85%90%EC%B8%A0-%EB%B3%B4%ED%98%B8) - [DRM](#drm) - [Main systems](#main-systems) - [๋ฌด์—‡์ธ๊ฐ€?](#%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80) - [์™œ?](#%EC%99%9C) - [์–ด๋–ป๊ฒŒ?](#%EC%96%B4%EB%96%BB%EA%B2%8C) - [How to use jupyter](#how-to-use-jupyter) - [Conferences](#conferences) - [References](#references) # ๊ธฐ์ดˆ ์šฉ์–ด **์ด๋ฏธ์ง€**๋Š” 2์ฐจ์› ๋งคํŠธ๋ฆญ์Šค๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— **์ƒ‰์ƒ**์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด, **์ƒ‰์ƒ ๋ฐ์ดํ„ฐ** ์ œ๊ณต์— ์‚ฌ์šฉ๋˜๋Š” **์ถ”๊ฐ€์ ์ธ ์ฐจ์›**์ด ์žˆ๋Š” **3์ฐจ์› ๋งคํŠธ๋ฆญ์Šค**๋กœ ์—ฌ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [์‚ผ์›์ƒ‰(๋นจ๊ฐ„์ƒ‰, ์ดˆ๋ก์ƒ‰, ํŒŒ๋ž€์ƒ‰)](https://en.wikipedia.org/wiki/Primary_color)์„ ์‚ฌ์šฉํ•ด ์ƒ‰์ƒ๋“ค์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ, **๋นจ๊ฐ„์ƒ‰**, **์ดˆ๋ก์ƒ‰**, **ํŒŒ๋ž€์ƒ‰** ์ˆœ์˜ ์„ธ ๊ฐ€์ง€ ํ‰๋ฉด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![an image is a 3d matrix RGB](/i/image_3d_matrix_rgb.png "An image is a 3D matrix") ์ด ๋งคํŠธ๋ฆญ์Šค์˜ ๊ฐ๊ฐ์˜ ์ ์„ **ํ”ฝ์…€**(ํ™”์†Œ)๋ผ ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”ฝ์…€์€ ์ฃผ์–ด์ง„ ์ƒ‰์ƒ์˜ **๊ฐ•๋„**(๋ณดํ†ต ์ˆซ์ž ๊ฐ’)๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, **๋นจ๊ฐ„ ํ”ฝ์…€**์€ ์ดˆ๋ก์ƒ์ด 0, ํŒŒ๋ž€์ƒ‰์ด 0์ด๊ณ  ๋นจ๊ฐ„์ƒ‰์ด ์ตœ๋Œ€์ธ ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€์š”. **ํ•‘ํฌ ์ƒ‰์ƒ ํ”ฝ์…€**์€ ์„ธ ๊ฐ€์ง€ ์ƒ‰์ƒ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ 0๋ถ€ํ„ฐ 255๊นŒ์ง€์˜ ์ˆซ์ž ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•‘ํฌ์ƒ‰ ํ”ฝ์…€์€ **๋นจ๊ฐ„์ƒ‰=255, ์ดˆ๋ก์ƒ‰=192, ํŒŒ๋ž€์ƒ‰=203**์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. > #### ์ƒ‰์ƒ ์ด๋ฏธ์ง€๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• > ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ƒ‰์ƒ๋“ค์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ์—๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด RGB ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๋•Œ 3๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋Œ€์‹ , ๊ฐ ํ”ฝ์…€์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ํ•œ ๋ฐ”์ดํŠธ๋งŒ ํ•„์š”ํ•œ ์ธ๋ฑ์Šค ํŒ”๋ ˆํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€์š”. ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์—์„œ๋Š” 3์ฐจ์› ๋งคํŠธ๋ฆญ์Šค ๋Œ€์‹  2์ฐจ์› ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ‰์ƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ‰์ƒ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜๋“ค์„ ํฌ๊ธฐํ•ด์•ผํ•˜์ฃ . > > ![NES palette](/i/nes-color-palette.png "NES palette") ์˜ˆ๋ฅผ๋“ค์–ด ์•„๋ž˜์˜ ์‚ฌ์ง„์„ ํ•œ ๋ฒˆ ๋ณด์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ์–ผ๊ตด์€ ๋ชจ๋“  ์ƒ‰์ƒ์ด ํ‘œํ˜„๋˜์–ด์žˆ์ง€์š”. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋นจ๊ฐ„์ƒ‰, ์ดˆ๋ก์ƒ‰, ํŒŒ๋ž€์ƒ‰ ํ‰๋ฉด์ž…๋‹ˆ๋‹ค. (ํšŒ์ƒ‰ ํ†ค์œผ๋กœ ๋‚˜์˜ด) ![RGB channels intensity](/i/rgb_channels_intensity.png "RGB channels intensity") ์—ฌ๊ธฐ์„œ **๋นจ๊ฐ„์ƒ‰**(๋‘ ๋ฒˆ์งธ ์–ผ๊ตด์˜ ๋ฐ์€ ๋ถ€๋ถ„๋“ค)์ด ์ƒ‰์ƒ์— ๋งŽ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด **ํŒŒ๋ž€์ƒ‰**(๋งˆ์ง€๋ง‰ ์–ผ๊ตด)์€ ๋Œ€๋ถ€๋ถ„ **๋งˆ๋ฆฌ์˜ค์˜ ๋ˆˆ**๊ณผ ์˜ท์˜ ์ผ๋ถ€์—๋งŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. **๋ชจ๋“  ์ƒ‰์ƒ**์˜ ์˜ํ–ฅ๋ ฅ์ด ๋‚ฎ์€ ๋ถ€๋ถ„์€ **๋งˆ๋ฆฌ์˜ค์˜ ์ˆ˜์—ผ**(๊ฐ€์žฅ ์–ด๋‘์šด ๋ถ€๋ถ„)์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ƒ‰์ƒ ๊ฐ•๋„๋Š” ํŠน์ •ํ•œ ์–‘์˜ ๋น„ํŠธ๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์–‘์ด๋ž€ **๋น„ํŠธ ๊นŠ์ด** ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ƒ‰์ƒ ํ‰๋ฉด๋‹น 8๋น„ํŠธ(0๋ถ€ํ„ฐ 255 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š”)๋ฅผ ํ• ์• ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด **24๋น„ํŠธ**์˜ **์ƒ‰ ๊นŠ์ด**(8 ๋น„ํŠธ * R/G/B์˜ 3๊ฐ€์ง€ ํ‰๋ฉด)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉฐ, 2์˜ 24์Šน ๊ฐ€์ง€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. > [์„ธ์ƒ์—์„œ ๋น„ํŠธ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ์บก์ณ๋˜๋Š” ์›๋ฆฌ](http://www.cambridgeincolour.com/tutorials/camera-sensors.htm)์— ๋Œ€ํ•ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” **ํ›Œ๋ฅญํ•œ ๊ธ€** ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ๋˜ ๋‹ค๋ฅธ ์†์„ฑ์€ **ํ•ด์ƒ๋„**์ž…๋‹ˆ๋‹ค. ํ•ด์ƒ๋„๋Š” ์ฐจ์› ํ•˜๋‚˜์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ํ”ฝ์…€์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณดํ†ต width x height๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ ์•„๋ž˜์—๋Š” **4x4** ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ![image resolution](/i/resolution.png "image resolution") > #### ์‹ค์Šต: ์ด๋ฏธ์ง€์™€ ์ƒ‰์ƒ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ > [์ฃผํ”ผํ„ฐ](#how-to-use-jupyter)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [์ด๋ฏธ์ง€์™€ ์ƒ‰ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ](/image_as_3d_array.ipynb)๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”. > > > [์ด๋ฏธ์ง€ ํ•„ํ„ฐ(์™ธ๊ณฝ์„  ๊ฒ€์ถœ, ๊ฐ•์กฐ, ๋ธ”๋Ÿฌ)](/filters_are_easy.ipynb)์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋‚˜ ๋น„๋””์˜ค๋ฅผ ๋‹ค๋ฃจ๋‹ค๋ณด๋ฉด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์†์„ฑ์ธ **์ข…ํšก๋น„(aspect ratio)** ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ์ง€๋‚˜ ํ”ฝ์…€์˜ ํญ๊ณผ ๋†’์ด์˜ ๋น„๋ก€ ๊ด€๊ณ„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด ์˜์ƒ ํ˜น์€ ์‚ฌ์ง„์€ **16x9**์•ผ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ **ํ™”๋ฉด ์ข…ํšก๋น„(DAR)** ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๊ฐ๊ฐ์˜ ํ”ฝ์…€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•ํƒœ์— ๋Œ€ํ•œ ๊ฒƒ์€ **ํ”ฝ์…€ ์ข…ํšก๋น„(PAR)** ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ![display aspect ratio](/i/DAR.png "display aspect ratio") ![pixel aspect ratio](/i/PAR.png "pixel aspect ratio") > #### DVD๋Š” DAR 4:3์ด๋‹ค. > DVD์˜ ์‹ค์ œ ํ•ด์ƒ๋„๋Š” 704x480์ด์ง€๋งŒ 10:11(704x10/480x11)์˜ PAR๋กœ ์ธํ•ด 4:3์˜ ์ข…ํšก๋น„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ **๋น„๋””์˜ค**๋Š” ๋˜๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์˜ ์ถ•์— ๋‚˜์—ด๋œ **n๊ฐœ์˜ ํ”„๋ ˆ์ž„์˜ ์—ฐ์†**์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ n์€ ํ”„๋ ˆ์ž„๋ ˆ์ดํŠธ ํ˜น์€ ์ดˆ๋‹น ํ”„๋ ˆ์ž„ ์ˆ˜ ์ž…๋‹ˆ๋‹ค. ![video](/i/video.png "video") ๋น„๋””์˜ค์˜ **๋น„ํŠธ ๋ ˆ์ดํŠธ**๋Š” ๋™์˜์ƒ์„ ํ‘œ์‹œํ•˜๋Š”๋ฐ ์ดˆ๋‹น ํ•„์š”ํ•œ ๋น„ํŠธ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. > ๋น„ํŠธ๋ ˆ์ดํŠธ = ํญ * ๋†’์ด * ๋น„ํŠธ ๊นŠ์ด * ์ดˆ๋‹น ํ”„๋ ˆ์ž„ ์ˆ˜ ์˜ˆ๋ฅผ๋“ค์–ด ์–ด๋–ค ์˜์ƒ์ด 30fps, 24๋น„ํŠธ ํ”ฝ์…€ ๊นŠ์ด, 480x240์˜ ํ•ด์ƒ๋„์— ์••์ถ•์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ผ๋ฉด **์ดˆ๋‹น 82,944,000๋น„ํŠธ** ํ˜น์€ 82.944 Mbps (30x480x240x24)๊ฐ€ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. **๋น„ํŠธ ๋ ˆ์ดํŠธ**๊ฐ€ ๊ฑฐ์˜ ์ผ์ •ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ณ ์ • ๋น„ํŠธ๋ ˆ์ดํŠธ(**CBR**)๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ๊ฐ€๋ณ€์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋ณ€ ๋น„ํŠธ๋ ˆ์ดํŠธ(**VBR**)๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. > ์ด ๊ทธ๋ž˜ํ”„๋Š” ํ”„๋ ˆ์ž„์ด ๊ฒ€์€์ƒ‰์ธ ๋™์•ˆ์—๋Š” ๊ทธ๋ฆฌ ๋งŽ์€ ๋น„ํŠธ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š๋Š” ์ œํ•œ๋œ VBR์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. > > ![constrained vbr](/i/vbr.png "constrained vbr") ์ดˆ๊ธฐ์—๋Š” ์—”์ง€๋‹ˆ์–ด๋“ค์ด **์—ฌ๋ถ„์˜ ๋Œ€์—ญํญ ์†Œ๋ชจ ์—†์ด** ๋‘ ๋ฐฐ์˜ ์ธ์ง€ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ๋กœ ๋น„๋””์˜ค๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ **์ธํ„ฐ๋ ˆ์ด์‹ฑ ๋น„๋””์˜ค**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” 1ํ”„๋ ˆ์ž„์—์„œ ํ™”๋ฉด์˜ ์ ˆ๋ฐ˜์„ ๋ณด๋‚ด๊ณ  ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์„ ๊ทธ ๋‹ค์Œ ํ”„๋ ˆ์ž„์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ํ™”๋ฉด์€ ๋Œ€๋ถ€๋ถ„ **ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ ์Šค์บ” ๊ธฐ์ˆ **์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ๋Š” ๊ฐ ํ”„๋ ˆ์ž„์˜ ๋ชจ๋“  ๋ผ์ธ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋ฆฌ๋Š” ์˜์ƒ์„ ์ถœ๋ ฅ, ์ €์žฅ, ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ![interlaced vs progressive](/i/interlaced_vs_progressive.png "interlaced vs progressive") ์ด์ œ ์–ด๋–ป๊ฒŒ **์ด๋ฏธ์ง€**๊ฐ€ ๋””์ง€ํ„ธ๋กœ ํ‘œํ˜„๋˜๋Š”์ง€, **์ƒ‰์ƒ**์ด ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜๋˜์–ด ์˜์ƒ ํ‘œํ˜„์— ์–ด๋А ์ •๋„์˜ **์ดˆ๋‹น ๋น„ํŠธ ์ˆ˜**๊ฐ€ ํ•„์š”ํ•œ์ง€, ๊ทธ๊ฒŒ ๊ณ ์ •(CBR)์ธ์ง€ ๊ฐ€๋ณ€(VBR)์ธ์ง€์— ๋Œ€ํ•œ ๊ฒƒ๊ณผ **ํ•ด์ƒ๋„**์™€ **ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ**์™€ ์ธํ„ฐ๋ ˆ์ด์Šค๋“œ, PAR์™€ ๊ฐ™์€ ๋งŽ์€ ์šฉ์–ด๋“ค์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. > #### ์—ฐ์Šต: ๋น„๋””์˜ค ์†์„ฑ ํ™•์ธ > [ffmpeg์ด๋‚˜ mediainfo๋กœ ์†์„ฑ ์‚ดํŽด๋ณด๊ธฐ](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#inspect-stream) # ์ค‘๋ณต ์ œ๊ฑฐ ์••์ถ• ์—†์ด๋Š” ๋น„๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. 30fps์ธ 720p ํ•ด์ƒ๋„์˜ **ํ•œ ์‹œ๊ฐ„ ์งœ๋ฆฌ ์˜์ƒ**์€ **278GB***๋ฅผ ํ•„์š”๋กœํ•ฉ๋‹ˆ๋‹ค. DEFLATE(PKZIP, Gzip, PNG์— ์‚ฌ์šฉ๋˜๋Š”)์™€ ๊ฐ™์€ **๋ฌด์†์‹ค ๋ฐ์ดํ„ฐ ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜**์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์—ญํญ์„ ์ถฉ๋ถ„ํžˆ ์ค„์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋น„๋””์˜ค๋ฅผ ์••์ถ•ํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. > * 1280 x 720 x 24 x 30 x 3600 (ํญ, ๋†’์ด, ํ”ฝ์…€ ๋‹น ๋น„ํŠธ ์ˆ˜, fps, ์˜์ƒ ์‹œ๊ฐ„) ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š”, **์šฐ๋ฆฌ์˜ ๋ˆˆ์„ ์†์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค**. ๋ˆˆ์€ ์ƒ‰์ƒ๋ณด๋‹ค ๋ช…์•” ๊ตฌ๋ถ„์„ ๋” ์ž˜ํ•ฉ๋‹ˆ๋‹ค. ์˜์ƒ์€ ๋ณ€ํ™”๊ฐ€ ๊ฑฐ์˜ ์—†๋Š” ๋งŽ์€ ์ด๋ฏธ์ง€๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์œผ๋ฉฐ, ๊ฐ ํ”„๋ ˆ์ž„๋“ค์€ ๊ฐ™๊ฑฐ๋‚˜ ์œ ์‚ฌํ•œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์˜์—ญ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ## ์ƒ‰์ƒ, ํœ˜๋„, ์‹œ๊ฐ ์‹œ๊ฐ์€ [์ƒ‰์ƒ๋ณด๋‹ค ๋ช…์•”์— ๋” ๋ฏผ๊ฐํ•˜๋ฉฐ](http://vanseodesign.com/web-design/color-luminance/), ์ด๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์ง„์„ ๋ณด์„ธ์š”. ![luminance vs color](/i/luminance_vs_color.png "luminance vs color") ๋งŒ์ผ ์™ผ์ชฝ์˜ ์ด๋ฏธ์ง€์—์„œ ์‚ฌ๊ฐํ˜• **A์™€ B๊ฐ€ ๋™์ผํ•œ ์ƒ‰์ƒ**์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•˜์…จ๋‹ค๋ฉด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋‡Œ๋Š” **์ƒ‰์ƒ๋ณด๋‹ค๋Š” ๋ช…์•”์— ๋” ์‹ ๊ฒฝ์“ฐ๋„๋ก** ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”. ์˜ค๋ฅธ์ชฝ์˜ ์‚ฌ์ง„์—์„œ๋Š” ๊ฐ™์€ ์ƒ‰์ƒ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ปค๋„ฅํ„ฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ๋‡Œ๋Š” ๋‘ ์‚ฌ๊ฐํ˜•์ด ๋™์ผํ•œ ์ƒ‰์ƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > **์‹œ๊ฐ์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…** > > [๋ˆˆ์€ ๋ณต์žกํ•œ ์žฅ๊ธฐ์ด๋ฉฐ](http://www.biologymad.com/nervoussystem/eyenotes.htm), ๋งŽ์€ ๊ฒƒ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ๋Œ€๋ถ€๋ถ„์€ ์›์ถ”์„ธํฌ์™€ ๊ฐ„์ƒ์„ธํฌ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋ˆˆ์€ [์•ฝ 1์–ต 2์ฒœ๊ฐœ์˜ ๊ฐ„์ƒ์„ธํฌ์™€ 6๋ฐฑ๋งŒ๊ฐœ์˜ ์›์ถ”์„ธํฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค](https://en.wikipedia.org/wiki/Photoreceptor_cell). > **๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด**, ์ƒ‰์ƒ๊ณผ ๋ช…์•”์„ ๋ˆˆ์˜ ๊ฐ ๊ธฐ๋Šฅ๋“ค์— ์ž…๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. > **[๊ฐ„์ƒ์„ธํฌ](https://en.wikipedia.org/wiki/Rod_cell) ๋Š” ๋Œ€๋ถ€๋ถ„ ๋น›์— ๋ฐ˜์‘ํ•˜๋Š” ๋ฐ˜๋ฉด์—**, **[์›์ถ”์„ธํฌ](https://en.wikipedia.org/wiki/Cone_cell)๋Š” ์ƒ‰์ƒ์— ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค**. ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰์†Œ๋ฅผ ์ง€๋‹Œ ์„ธ ๊ฐ€์ง€ ํƒ€์ž…์˜ ์›์ถ” ์„ธํฌ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: [S-cones (ํŒŒ๋ž€์ƒ‰), M-cones (์ดˆ๋ก์ƒ‰) and L-cones (๋นจ๊ฐ„์ƒ‰)](https://upload.wikimedia.org/wikipedia/commons/1/1e/Cones_SMJ2_E.svg). > > ๊ฐ„์ƒ ์„ธํฌ(๋ช…์•”)๊ฐ€ ์›์ถ” ์„ธํฌ(์ƒ‰์ƒ)๋ณด๋‹ค ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ‰์ƒ๋ณด๋‹ค ๋ช…์•”์„ ๋” ์ž˜ ๊ตฌ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. > > ![eyes composition](/i/eyes.jpg "eyes composition") > > **๋Œ€๋น„ ์ธ์‹ ๋Šฅ๋ ฅ** > > ์‹คํ—˜ ์‹ฌ๋ฆฌํ•™ ๋ฐ ๋‹ค๋ฅธ ๋ถ„์•ผ๋“ค์˜ ์—ฐ๊ตฌ์ž๋“ค์€ ์‚ฌ๋žŒ์˜ ์‹œ๊ฐ์— ๋Œ€ํ•œ ๋งŽ์€ ์ด๋ก ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Œ€๋น„ ์ธ์‹ ๋Šฅ๋ ฅ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋น›์˜ ๊ณต๊ฐ„๊ณผ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ ์žˆ์œผ๋ฉฐ, ์ฃผ์–ด์ง„ ์ดˆ๊ธฐ์— ๊ด€์ธกํ•œ ๋น›์ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด, ๊ด€์ธก์ž๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋งํ•˜๊ธฐ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. `function`์ด ๋ณต์ˆ˜ํ˜•์œผ๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ ๋Œ€๋น„ ์ธ์‹ ๋Šฅ๋ ฅ์€ ๋ช…์•” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ‰์ƒ๋„ ๊ด€๊ณ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์‹คํ—˜์˜ ๊ฒฐ๊ณผ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์šฐ๋ฆฌ์˜ ๋ˆˆ์ด ์ƒ‰์ƒ๋ณด๋‹ค ๋ช…์•”์— ๋” ๋ฏผ๊ฐํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋งํ•ด์ค๋‹ˆ๋‹ค. ์ด์ œ **๋ฃจ๋งˆ**(์ด๋ฏธ์ง€์˜ ๋ช…๋„)์— ๋” ๋ฏผ๊ฐํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### ์ƒ‰์ƒ ๋ชจ๋ธ ์ดˆ๋ฐ˜์— ๋ฐฐ์› ๋˜ **RGB ๋ชจ๋ธ**์„ ์ด์šฉํ•œ [์ด๋ฏธ์ง€์— ์ƒ‰์ƒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•](#basic-terminology)์™ธ์—๋„ ๋‹ค๋ฅธ ๋ชจ๋ธ๋“ค๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋ชจ๋ธ ์ค‘ ํฌ๋กœ๋ฏธ๋„Œ์Šค(์ƒ‰์ƒ)๋กœ๋ถ€ํ„ฐ ๋ฃจ๋งˆ(๋ช…๋„)๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” **YCbCr***์ด๋ผ๊ณ ๋„ ์•Œ๋ ค์ ธ์žˆ์Šต๋‹ˆ๋‹ค. > * ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ๋“ค๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒ‰์ƒ ๋ชจ๋ธ์€ ๋ช…๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” **Y**์™€ ๋‘ ๊ฐ€์ง€ ์ƒ‰์ƒ ์ฑ„๋„์ธ **Cb**(ํฌ๋กœ๋งˆ ๋ธ”๋ฃจ)์™€ **Cr**(ํฌ๋กœ๋งˆ ๋ ˆ๋“œ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [YCbCr](https://en.wikipedia.org/wiki/YCbCr)์€ RGB๋กœ๋ถ€ํ„ฐ ์œ ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋˜ํ•œ ๋ฐ˜๋Œ€๋กœ RGB๋กœ ์—ญ๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์— ๋ณด์ด๋Š” ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ์™„์ „ํ•œ ์ƒ‰์ƒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![ycbcr example](/i/ycbcr.png "ycbcr example") ### YCbCr <-> RGB ๋ณ€ํ™˜ ๋…ผ์Ÿ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, **์–ด๋–ป๊ฒŒ ์ดˆ๋ก์ƒ‰์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ** ๋ชจ๋“  ์ƒ‰์ƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด RGB๋ฅผ YCbCr๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ์„ ๊ฐ™์ด ํ•ด๋ด…์‹œ๋‹ค. **[ITU-R ๊ทธ๋ฃน*](https://en.wikipedia.org/wiki/ITU-R)** ์—์„œ ๊ถŒ์žฅํ•˜๋Š” **[ํ‘œ์ค€ BT.601](https://en.wikipedia.org/wiki/Rec._601)** ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” **๋ฃจ๋งˆ ๊ณ„์‚ฐ**์ž…๋‹ˆ๋‹ค. ITU์—์„œ ์ œ์•ˆํ•œ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  RGB ๊ฐ’์„ ๋Œ€์ฒดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ``` Y = 0.299R + 0.587G + 0.114B ``` ๋ฃจ๋งˆ๋ฅผ ์–ป์—ˆ์œผ๋‹ˆ ์ด์ œ **์ƒ‰์ƒ ๋ถ„๋ฆฌ**(ํฌ๋กœ๋งˆ ๋ธ”๋ฃจ, ํฌ๋กœ๋งˆ ๋ ˆ๋“œ)๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ``` Cb = 0.564(B - Y) Cr = 0.713(R - Y) ``` ๋˜ํ•œ ์ด๋ฅผ **์—ญ๋ณ€ํ™˜** ๊ฐ€๋Šฅํ•˜๋ฉฐ **YCbCr์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๋ก์ƒ‰**์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ``` R = Y + 1.402Cr B = Y + 1.772Cb G = Y - 0.344Cb - 0.714Cr ``` > * ๋ฌด์—‡์ด ํ‘œ์ค€์ธ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ น [4K๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ์–ด๋–ค ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ํ•ด์ƒ๋„๋Š”? ์ปฌ๋Ÿฌ ๋ชจ๋ธ์€?](https://en.wikipedia.org/wiki/Rec._2020)๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ **๋””์Šคํ”Œ๋ ˆ์ด**(๋ชจ๋‹ˆํ„ฐ, TV, ์Šคํฌ๋ฆฐ ๋“ฑ)๋Š” **์˜ค์ง RGB ๋ชจ๋ธ**๋งŒ ํ™œ์šฉํ•˜๋ฉฐ ์ด๋ฅผ ๊ฐ์ž ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์—ดํ•ฉ๋‹ˆ๋‹ค. ํ™•๋Œ€๋œ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ![pixel geometry](/i/new_pixel_geometry.jpg "pixel geometry") ### ํฌ๋กœ๋งˆ ์„œ๋ธŒ์ƒ˜ํ”Œ๋ง ๋ฃจ๋งˆ์™€ ํฌ๋กœ๋งˆ๋กœ ํ‘œํ˜„๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ธ๊ฐ„์˜ ์‹œ๊ฐ์ด ํฌ๋กœ๋งˆ๋ณด๋‹ค ๋ฃจ๋งˆ ํ•ด์ƒ๋„์— ๋ฏผ๊ฐํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•˜์—ฌ ์„ ํƒ์ ์œผ๋กœ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๋Š”๋ฐ์— ์žˆ์–ด ์ด์ ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **ํฌ๋กœ๋งˆ ์„œ๋ธŒ์ƒ˜ํ”Œ๋ง**์€ **๋ฃจ๋งˆ ๋Œ€๋น„ ํฌ๋กœ๋งˆ ์ •๋ณด๋ฅผ ์ค„์—ฌ** ์ด๋ฏธ์ง€๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ![ycbcr subsampling resolutions](/i/ycbcr_subsampling_resolution.png "ycbcr subsampling resolutions") ์–ผ๋งˆ๋งŒํผ์˜ ํฌ๋กœ๋งˆ ํ•ด์ƒ๋„๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?! ์ด๋ฏธ ๋‹ต์€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์ƒ๋„์™€ ๋ณ‘ํ•ฉ(`final color = Y + Cb + Cr`)์„ ๋‹ค๋ฃจ๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํ‚ค๋งˆ๋Š” ์„œ๋ธŒ ์ƒ˜ํ”Œ๋ง ์‹œ์Šคํ…œ์œผ๋กœ ์•Œ๋ ค์ ธ์žˆ์œผ๋ฉฐ ๋ฃจ๋งˆ ํ”ฝ์…€์˜ `a x 2` ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ๋กœ๋งˆ ํ•ด์ƒ๋„๋ฅผ ์ •์˜ํ•˜๋Š” 3 ๋ถ€๋ถ„์˜ ๋น„์œจ `a:x:y`๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. * `a`๋Š” ์ˆ˜ํ‰ ์ƒ˜ํ”Œ๋ง ๋ ˆํผ๋Ÿฐ์Šค์ž…๋‹ˆ๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ 4) * `x`๋Š” `a` ํ”ฝ์…€์˜ ํ–‰(row)์˜ ํฌ๋กœ๋งˆ ์ƒ˜ํ”Œ ์ˆ˜์ž…๋‹ˆ๋‹ค. (`a`์— ๋Œ€ํ•œ ์ˆ˜ํ‰ํ•ด์ƒ๋„) * `y`๋Š” `a` ํ”ฝ์…€์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ํ–‰ ์‚ฌ์ด์˜ ํฌ๋กœ๋งˆ ์ƒ˜ํ”Œ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. > ์˜ˆ์™ธ์ ์œผ๋กœ 4:1:0์€ ๊ฐ๊ฐ์˜ ๋ฃจ๋งˆ ํ•ด์ƒ๋„์˜ `4 x 4`๋ธ”๋ก ๋‚ด์˜ ๋‹จ์ผ ํฌ๋กœ๋งˆ ์ƒ˜ํ”Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ˜„๋Œ€ ์ฝ”๋ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋ณดํŽธ์ ์ธ ๊ธฐ๋ฒ•์€ **4:4:4(์„œ๋ธŒ ์ƒ˜ํ”Œ๋ง ์—†์Œ)**, **4:2:2, 4:1:1, 4:2:0, 4:1:0 and 3:1:1**์ž…๋‹ˆ๋‹ค. > **YCbCr 4:2:0 ๋ณ‘ํ•ฉ** > > ์—ฌ๊ธฐ์— YCbCr 4:2:0์„ ์‚ฌ์šฉํ•œ ์ด๋ฏธ์ง€์˜ ๋ณ‘ํ•ฉ๋œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. ํ”ฝ์…€ ๋‹น 12 ๋น„ํŠธ๋งŒ ์†Œ๋ชจํ–ˆ์„ ๋ฟ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•˜์„ธ์š”. > > ![YCbCr 4:2:0 merge](/i/ycbcr_420_merge.png "YCbCr 4:2:0 merge") ๋™์ผํ•œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ฃผ์š”ํ•œ ํฌ๋กœ๋งˆ ์„œ๋ธŒ์ƒ˜ํ”Œ๋ง ํƒ€์ž…๋“ค๋กœ ์ธ์ฝ”๋”ฉํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ–‰์˜ ์ด๋ฏธ์ง€๋“ค์€ ์ตœ์ข… YCbCr ์ด๋ฏธ์ง€์ด๋ฉฐ ๋‘ ๋ฒˆ์งธ ์—ด์˜ ์ด๋ฏธ์ง€๋“ค์€ ํฌ๋กœ๋งˆ ํ•ด์ƒ๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ ์€ ์†์‹ค๋กœ ํ›Œ๋ฅญํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ![chroma subsampling examples](/i/chroma_subsampling_examples.jpg "chroma subsampling examples") ์•ž์„œ ์šฐ๋ฆฌ๋Š” [ํ•œ ์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ 720p ํ•ด์ƒ๋„์— 30fps์ธ ์˜์ƒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 278GB๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ณ„์‚ฐ](#redundancy-removal)ํ•˜์˜€์Šต๋‹ˆ๋‹ค. **YCbCr 4:2:0**์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ **์ ˆ๋ฐ˜(139GB)์˜ ํฌ๊ธฐ***๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ๊ทธ๋ฆฌ ์ด์ƒ์ ์ด์ง„ ์•Š๋„ค์š”. > * ์ด ๊ฐ’์€ width, height, ํ”ฝ์…€ ๋‹น ๋น„ํŠธ ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  fps๋ฅผ ๊ณฑํ•˜์—ฌ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” 24๋น„ํŠธ๊ฐ€ ํ•„์š”ํ–ˆ์ง€๋งŒ ์ด์   12๋น„ํŠธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
> ### ์‹ค์Šต: YCbCr ํžˆ์Šคํ† ๊ทธ๋žจ ํ™•์ธํ•˜๊ธฐ > [ffmpeg๋กœ YCbCr ํžˆ์Šคํ† ๊ทธ๋žจ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.](/encoding_pratical_examples.md#generates-yuv-histogram) ์ด ์žฅ๋ฉด์€ [ํžˆ์Šคํ† ๊ทธ๋žจ](https://en.wikipedia.org/wiki/Histogram)์— ๋ณด์—ฌ์ง€๋Š” ๋ฐ”์™€ ๊ฐ™์ด ํŒŒ๋ž€์ƒ‰ ๋น„์œจ์ด ๋†’์Šต๋‹ˆ๋‹ค. > > ![ycbcr color histogram](/i/yuv_histogram.png "ycbcr color histogram") ## ํ”„๋ ˆ์ž„ ์œ ํ˜• ์ด์ œ ๊ณ„์†ํ•ด์„œ **์‹œ๊ฐ„ ์ƒ์—์„œ์˜ ์ค‘๋ณต ์ œ๊ฑฐ**๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ ์ „์— ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ์šฉ์–ด๋ฅผ ์ •๋ฆฝํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 30fps์˜ ์˜ํ™”๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์— ์ด ์˜ํ™”์˜ ์ฒซ ๋ฒˆ์งธ๋ถ€๋ถ„์˜ 4์žฅ์˜ ํ”„๋ ˆ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ![ball 1](/i/smw_background_ball_1.png "ball 1") ![ball 2](/i/smw_background_ball_2.png "ball 2") ![ball 3](/i/smw_background_ball_3.png "ball 3") ![ball 4](/i/smw_background_ball_4.png "ball 4") **ํŒŒ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ**๊ณผ ๊ฐ™์ด ํ”„๋ ˆ์ž„ ๋‚ด์— **๋งŽ์€ ์ค‘๋ณต**์„ ๋ณผ ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„ 0๋ถ€ํ„ฐ 3๊นŒ์ง€ ๋ณ€ํ•œ๊ฒŒ ์—†์ง€์š”. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ ˆ์ž„์„ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ **์ถ”์ƒ์ ์œผ๋กœ ๋ถ„๋ฅ˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### I Frame (์ธํŠธ๋ผ, ํ‚คํ”„๋ ˆ์ž„) `I-frame(๋ ˆํผ๋Ÿฐ์Šค, ํ‚คํ”„๋ ˆ์ž„, ์ธํŠธ๋ผ)`์€ **๋…๋ฆฝ์ ์ธ ํ”„๋ ˆ์ž„**์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฒƒ์—๋„ ์˜์กด์ ์ด์ง€ ์•Š์ง€์š”. I-frame์€ ๋งˆ์น˜ ์ •์ ์ธ ์‚ฌ์ง„๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ”„๋ ˆ์ž„์€ ๋ณดํ†ต I-frame์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ I-frame์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ”„๋ ˆ์ž„์˜ ์‚ฌ์ด์‚ฌ์ด์— ์‚ฝ์ž…๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ![ball 1](/i/smw_background_ball_1.png "ball 1") ### P Frame (predicted) `P-frame`์€ ํ•ญ์ƒ **์ด์ „์˜ ํ”„๋ ˆ์ž„์„ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ **์„ ์ด์ ์œผ๋กœ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ๋ฒˆ์งธ ํ”„๋ ˆ์ž„์—์„œ ๋ณ€ํ™”๋ผ๊ณค ๊ณต์ด ์•ž์œผ๋กœ ์›€์ง์ธ ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. **๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•ด์„œ ์ด ์ „์˜ ํ”„๋ ˆ์ž„์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ”„๋ ˆ์ž„ 1๋ฒˆ์„ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€์š”.** ![ball 1](/i/smw_background_ball_1.png "ball 1") <- ![ball 2](/i/smw_background_ball_2_diff.png "ball 2") > #### ์‹ค์Šต: I-frame์ด ํ•œ์žฅ ๋ฟ์ธ ๋™์˜์ƒ > P-frame์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์™œ ์ „์ฒด๋ฅผ [I-frame ํ•œ์žฅ์— ๋‚˜๋จธ์ง€ ์ „๋ถ€๊ฐ€ p-frame์ธ ์˜์ƒ](/encoding_pratical_examples.md#1-i-frame-and-the-rest-p-frames)์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š์„๊นŒ์š”? > > ์ด ๋น„๋””์˜ค๋ฅผ ์ธ์ฝ”๋”ฉ ํ›„ ์˜์ƒ์„ ์žฌ์ƒํ•ด ๋น„๋””์˜ค์˜ **์•ž๋ถ€๋ถ„์œผ๋กœ ์ด๋™**ํ•ด๋ณด๋ฉด, ์ด๋™ํ•˜๋Š”๋ฐ **์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆผ**์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด **P-frame์€ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆํผ๋Ÿฐ์Šค ํ”„๋ ˆ์ž„(๊ฐ€๋ น I-frame)์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ**์ž…๋‹ˆ๋‹ค. > > ๋นจ๋ฆฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ I-frame ํ•œ ์žฅ์œผ๋กœ ๋น„๋””์˜ค๋ฅผ ์ธ์ฝ”๋”ฉํ•œ ๋’ค, [2์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ I-frame์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ธ์ฝ”๋”ฉํ•œ ๋’ค](/encoding_pratical_examples.md#1-i-frames-per-second-vs-05-i-frames-per-second) **๊ฐ ๋ Œ๋””์…˜์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.** ### B Frame (bi-predictive) ์ด์ „๊ณผ ์•ž์˜ ํ”„๋ ˆ์ž„์„ ์ฐธ์กฐํ•˜์—ฌ ๋” ๋‚˜์€ ์••์ถ•๋ฅ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด?! ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ B-Frame์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ![ball 1](/i/smw_background_ball_1.png "ball 1") <- ![ball 2](/i/smw_background_ball_2_diff.png "ball 2") -> ![ball 3](/i/smw_background_ball_3.png "ball 3") > #### ์‹ค์Šต: B-frame์œผ๋กœ ๋น„๋””์˜ค ๋น„๊ตํ•˜๊ธฐ > ๋‘ ๊ฐœ์˜ ๋ Œ๋””์…˜์„ ์ƒ์„ฑํ•ด, ์ฒซ ๋ฒˆ์งธ์—๋Š” B-frame์„ ์ฃผ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์—๋Š” [B-frame์„ ์ฃผ์ง€ ์•Š๊ณ ](/encoding_pratical_examples.md#no-b-frames-at-all) ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋น„๋กฏํ•˜์—ฌ ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋„ ํ™•์ธ์„ ํ•ด๋ณด์„ธ์š”. ### ์š”์•ฝ ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„๋“ค์€ **๋” ๋‚˜์€ ์••์ถ• ์„ฑ๋Šฅ์„ ์ œ๊ณต**ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋‹ค์Œ ์„น์…˜์—์„œ ์•Œ์•„๋ณผ ๊ฑฐ์—์š”. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ **I-frame์€ ์ฝ”์ŠคํŠธ๊ฐ€ ๋†’๊ณ  P-frame์€ ์ข€ ๋” ๋‚ฎ๊ณ  B-frame์ด ์ œ์ผ ๋‚ฎ๋‹ค๋Š” ์‚ฌ์‹ค**์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ![frame types example](/i/frame_types.png "frame types example") ## ์‹œ๊ฐ„์  ์ค‘๋ณต (์ธํ„ฐ ํ”„๋ฆฌ๋”•์…˜) ๋ฐ˜๋“œ์‹œ ์ค„์—ฌ์•ผ ํ•˜๋Š” **์‹œ๊ฐ„ ์ƒ์—์„œ์˜ ๋ฐ˜๋ณต**์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ์ด๋Ÿฌํ•œ ์ค‘๋ณต์˜ ์œ ํ˜•์€ **์ธํ„ฐ ํ”„๋ฆฌ๋”•์…˜**์ด๋ผ๋Š” ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„ 0๊ณผ 1์˜ ์‹œํ€€์Šค๋ฅผ **๋” ์ ์€ ๋น„ํŠธ๋ฅผ ํ™œ์šฉํ•ด** ์ธ์ฝ”๋”ฉ ํ•ด๋ณผ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ![original frames](/i/original_frames.png "original frames") ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋ฐ”๋กœ ์ œ๊ฑฐ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ **ํ”„๋ ˆ์ž„ 0์—์„œ ํ”„๋ ˆ์ž„ 1์„ ๋นผ๋ฉด** ์˜ค๋กœ์ง€ **๋‚จ์€ ๋ถ€๋ถ„๋งŒ ์ธ์ฝ”๋”ฉ**ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ![delta frames](/i/difference_frames.png "delta frames") ํ•˜์ง€๋งŒ ์ด๋ณด๋‹ค ๋” ์ ์€ ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” **๋” ๋‚˜์€ ๋ฐฉ๋ฒ•**์ด ์žˆ๋‹ค๋ฉด ์–ด๋– ์‹œ๊ฒ ๋‚˜์š”? ์šฐ์„ , `frame 0`์„ ์ž˜ ์ •์˜๋œ ํŒŒํ‹ฐ์…˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ์—ฌ๊ธฐ๊ณ , `frame 0`์— `frame 1`์„ ๋งค์นญ์‹œ์ผœ๋ณด์„ธ์š”. ์ด๋ฅผ **๋ชจ์…˜ ์ถ”์ •**์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€์š”. > ### ์œ„ํ‚คํŽ˜๋””์•„ - ๋ธ”๋ก ๋ชจ์…˜ ๋ณด์ • > "**๋ธ”๋ก ๋ชจ์…˜ ๋ณด์ •**์€ ํ˜„์žฌ ํ”„๋ ˆ์ž„์„ ๊ฒน์น˜์ง€ ์•Š์€ ๋ธ”๋ก์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๋ชจ์…˜ ๋ณด์ • ๋ฒกํ„ฐ๊ฐ€ **๋ธ”๋ก์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.** (์ผ๋ฐ˜์ ์ธ ์˜ค๊ฐœ๋…์œผ๋กœ ์ด์ „์˜ ํ”„๋ ˆ์ž„์ด ๊ฒน์น˜์ง€ ์•Š์€ ๋ธ”๋ก์œผ๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ๊ณ , ๋ชจ์…˜ ๋ณด์ • ๋ฒกํ„ฐ๊ฐ€ ์ด ๋ธ”๋ก๋“ค์ด ์–ด๋””๋กœ ์ด๋™ํ•  ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด๋ผ๊ณ  ์—ฌ๊ธฐ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.) ์›๋ณธ ๋ธ”๋ก์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์›๋ณธ ํ”„๋ ˆ์ž„์— ๊ฒน์นฉ๋‹ˆ๋‹ค. ๋ช‡๋ช‡์˜ ๋น„๋””์˜ค ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ด์ „์— ์ „์†ก๋œ ํ”„๋ ˆ์ž„์˜ ์ผ๋ถ€ ์กฐ๊ฐ์„ ํ˜„์žฌ ํ”„๋ ˆ์ž„๊ณผ ํ•ฉ์นฉ๋‹ˆ๋‹ค." ![delta frames](/i/original_frames_motion_estimation.png "delta frames") ์—ฌ๊ธฐ์„œ `x=0, y=25`์—์„œ `x=7, y=26`์œผ๋กœ ๊ณต์ด ์›€์ง์˜€๋‹ค๊ณ  ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **x**์™€ **y**์˜ ๊ฐ’๋“ค์ด **๋ชจ์…˜ ๋ฒกํ„ฐ**์ž…๋‹ˆ๋‹ค. ๋น„ํŠธ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” **์ถ”๊ฐ€์ ์ธ ๋‹จ๊ณ„**๋กœ๋Š” ์ตœ์ข… ๋ธ”๋ก์˜ ์œ„์น˜์™€ ์˜ˆ์ธก๋˜๋Š” ๋ฒกํ„ฐ์˜ **๋ชจ์…˜ ๋ฒกํ„ฐ์˜ ์ฐจ์ด๋งŒ ์ธ์ฝ”๋”ฉ ํ•˜๋Š” ๊ฒƒ**์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์ธ ๋ชจ์…˜ ๋ฒกํ„ฐ๋Š” `x=7 (7-0), y=1 (26-25)`๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. > ํ˜„์‹ค ์„ธ๊ณ„์—์„œ๋Š” ์ด **๊ณต์ด n๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ์กฐ๊ฐ**๋‚˜์ง€๋งŒ ๊ณผ์ •์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„ ์ƒ์˜ ๊ฐ์ฒด๋Š” **3์ฐจ์› ์ƒ์œผ๋กœ ์›€์ง์ด๋ฉฐ**, ์ด ๊ณต์ด ๋ฐฐ๊ฒฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋” ์ž‘์•„์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์น˜์ ์„ ์ฐพ์œผ๋ ค ํ–ˆ๋˜ ๋ธ”๋ก๊ณผ **์™„์ „ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์ผ์€** ์ผ๋ฐ˜์ ์ด์ง€์š”. ![motion estimation](/i/motion_estimation.png "motion estimation") ๊ทธ๋Ÿผ์—๋„ **๋ชจ์…˜ ์ถ”์ •**์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํžˆ ๋ธํƒ€ ํ”„๋ ˆ์ž„ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค **์ธ์ฝ”๋”ฉ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์ ๋‹ค๋Š”** ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ![motion estimation vs delta ](/i/comparison_delta_vs_motion_estimation.png "motion estimation delta") > ### ๋ชจ์…˜ ๋ณด์ •์€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”๊ฐ€ > ์ด ๊ธฐ๋ฒ•์€ ๋ชจ๋“  ๋ธ”๋ก์— ๋Œ€ํ•ด ์ ์šฉ๋˜๋ฉฐ, ๊ณต์ด ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ธ”๋ก์—์„œ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. > ![real world motion compensation](/i/real_world_motion_compensation.png "real world motion compensation") > Source: https://web.stanford.edu/class/ee398a/handouts/lectures/EE398a_MotionEstimation_2012.pdf [์ฃผํ”ผํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•๋“ค์„ ์‹คํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](/frame_difference_vs_motion_estimation_plus_residual.ipynb). > #### Hands-on: See the motion vectors > We can [generate a video with the inter prediction (motion vectors) with ffmpeg.](/encoding_pratical_examples.md#generate-debug-video) > > ![inter prediction (motion vectors) with ffmpeg](/i/motion_vectors_ffmpeg.png "inter prediction (motion vectors) with ffmpeg") > > Or we can use the [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer) (which is paid but there is a free trial version which limits you to only the first 10 frames). > > ![inter prediction intel video pro analyzer](/i/inter_prediction_intel_video_pro_analyzer.png "inter prediction intel video pro analyzer") ## ๊ณต๊ฐ„์  ์ค‘๋ณต (์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜) ์˜์ƒ์˜ **๊ฐ๊ฐ์˜ ํ”„๋ ˆ์ž„์„** ๋ถ„์„ํ•ด๋ณด๋ฉด **๋งŽ์€ ์˜์—ญ์ด ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค**์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ![](/i/repetitions_in_space.png) ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ฃ . ์ด ์žฅ๋ฉด์€ ๋Œ€๋ถ€๋ถ„ ํŒŒ๋ž€์ƒ‰๊ณผ ํ•˜์–€์ƒ‰์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ![](/i/smw_bg.png) ์ด๋Š” `I-frame`์ด๋ฉฐ **์ด์ „์˜ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ** ์˜ˆ์ธกํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์—ฌ์ „ํžˆ ์••์ถ•ํ•  ์—ฌ์ง€๋Š” ๋‚จ์•„ ์žˆ์ง€์š”. **๋นจ๊ฐ„ ๋ธ”๋ก ๋ถ€๋ถ„์„** ์ธ์ฝ”๋”ฉํ•ด๋ณผ๊ฑฐ์—์š”. **์ธ์ ‘ํ•œ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด**, **๋ธ”๋ก ์ฃผ๋ณ€์˜ ์ƒ‰์ƒ์˜ ๊ฒฝํ–ฅ์„ ์ถ”์‚ฐ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![](/i/smw_bg_block.png) ํ”„๋ ˆ์ž„์ด ๊ณ„์†ํ•˜์—ฌ **์ˆ˜์ง์œผ๋กœ ์ƒ‰์ƒ์ด ํ™•์‚ฐ๋  ๊ฒƒ**์ด๋ผ๊ณ  ์˜ˆ์ธกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜๋ฏธ๋Š” **๋ธ”๋ก์˜ ์ธ์ ‘ํ•œ ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†๋Š” ํ”ฝ์…€์˜** ์ƒ‰์ƒ์ด ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ง€์š”. ![](/i/smw_bg_prediction.png) **์˜ˆ์ธก์ด ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.** ๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ ์ด ๊ธฐ๋ฒ•(**์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜**)์„ ์ ์šฉํ•œ ๋’ค ์ž”์—ฌ ๋ธ”๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” **์‹ค์ œ ๊ฐ’์„ ๋นผ์•ผํ• ** ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์›๋ณธ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ํ›จ์”ฌ ๋” ์••์ถ•๋ฅ ์ด ๋†’์€ ํ–‰๋ ฌ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ![](/i/smw_residual.png) > #### ์‹ค์Šต: ์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜ ํ™•์ธํ•ด๋ณด๊ธฐ > [๋งคํฌ๋กœ ๋ธ”๋ก๊ณผ ํ”„๋ฆฌ๋”•์…˜์„ ์‚ฌ์šฉํ•ด ffmpeg๋กœ ์˜์ƒ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.](/encoding_pratical_examples.md#generate-debug-video) [๊ฐ ๋ธ”๋ก์˜ ์ƒ‰์ƒ์˜ ์˜๋ฏธ](https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors?version=7#AnalyzingMacroblockTypes)๋ฅผ ffmpeg ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ์ดํ•ดํ•ด๋ณด์„ธ์š”. > > ![intra prediction (macro blocks) with ffmpeg](/i/macro_blocks_ffmpeg.png "inter prediction (motion vectors) with ffmpeg") > > ํ˜น์€ [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer)(์œ ๋ฃŒ์ง€๋งŒ ์ฒ˜์Œ 10 ํ”„๋ ˆ์ž„ ์ œํ•œ์ด ๊ฑธ๋ ค ์žˆ๋Š” ๋ฌด๋ฃŒ ํŠธ๋ผ์ด์–ผ ๋ฒ„์ „๋„ ์žˆ์Šต๋‹ˆ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. > > ![intra prediction intel video pro analyzer](/i/intra_prediction_intel_video_pro_analyzer.png "intra prediction intel video pro analyzer") # ์ฝ”๋ฑ์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ์š”? ## ๋ฌด์—‡์„? ์™œ? ์–ด๋–ป๊ฒŒ? **๋ฌด์—‡์„?** ์ฝ”๋ฑ์€ ๋””์ง€ํ„ธ ๋น„๋””์˜ค๋ฅผ ์••์ถ• ํ˜น์€ ํ•ด์ œํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด/ํ•˜๋“œ์›จ์–ด ์ž…๋‹ˆ๋‹ค. **์™œ?** ์‹œ์žฅ๊ณผ ์‚ฌํšŒ๋Š” ์ œํ•œ์ ์ธ ๋Œ€์—ญํญ๊ณผ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ™œ์šฉํ•œ ๋†’์€ ํ€„๋ฆฌํ‹ฐ์˜ ์˜์ƒ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. 30fps, ํ”ฝ์…€๋‹น 24๋น„ํŠธ, 480x240 ํ•ด์ƒ๋„์˜ ๋น„๋””์˜ค์— [ํ•„์š”ํ•œ ๋Œ€์—ญํญ ๊ณ„์‚ฐ](#%EA%B8%B0%EC%B4%88-%EC%9A%A9%EC%96%B4)์„ ๋– ์˜ฌ๋ ค๋ณด์„ธ์š”. ์••์ถ•์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ **82.944 Mbps**์˜€์ง€์š”. TV์™€ ์ธํ„ฐ๋„ท์—์„œ HD/FullHD/4K๋ฅผ ์ „์†กํ•  ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. **์–ด๋–ป๊ฒŒ?** ์—ฌ๊ธฐ์„œ๋Š” ์ฃผ์š” ๊ธฐ๋ฒ•๋“ค์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. > **์ฝ”๋ฑ vs ์ปจํ…Œ์ด๋„ˆ** > > ์ดˆ์‹ฌ์ž๋“ค์ด ํ”ํžˆ ๋ฒ”ํ•˜๋Š” ์‹ค์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋””์ง€ํ„ธ ๋™์˜์ƒ ์ฝ”๋ฑ๊ณผ [๋””์ง€ํ„ธ ๋น„๋””์˜ค ์ปจํ…Œ์ด๋„ˆ](https://en.wikipedia.org/wiki/Digital_container_format)๋ฅผ ํ˜ผ๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. **์ปจํ…Œ์ด๋„ˆ**๋ฅผ ๋™์˜์ƒ์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ(์˜ค๋””์˜ค ํฌํ•จ)๋ฅผ ํฌํ•จํ•˜๋Š” ๋ž˜ํผ ํฌ๋งท์œผ๋กœ ์—ฌ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ **์••์ถ•๋œ ๋น„๋””์˜ค**๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ ํŽ˜์ด๋กœ๋“œ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. > > ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์˜์ƒ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋Š” ๋น„๋””์˜ค ํŒŒ์ผ์˜ ๋™์˜์ƒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด `video.mp4` ํŒŒ์ผ์€ **[MPEG-4 Part 14](https://en.wikipedia.org/wiki/MPEG-4_Part_14)** ์ปจํ…Œ์ด๋„ˆ์ผ ๊ฒƒ์ด๊ณ  ํŒŒ์ผ ์ด๋ฆ„์€ `video.mkv`๋กœ **[matroska](https://en.wikipedia.org/wiki/Matroska)** ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋ฑ๊ณผ ์ปจํ…Œ์ด๋„ˆ ํฌ๋ฉง์„ ์ •ํ™•ํžˆ ํ™•์ธํ•˜๋ ค๋ฉด [ffmpeg๋‚˜ mediainfo](/encoding_pratical_examples.md#inspect-stream)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ## ์—ญ์‚ฌ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋ฑ์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ํŒŒํ—ค์น˜๊ธฐ์— ์•ž์„œ, ๊ตฌ์„ธ๋Œ€ ๋™์˜์ƒ ์ฝ”๋ฑ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๋น„๋””์˜ค ์ฝ”๋ฑ์ธ [H.261](https://en.wikipedia.org/wiki/H.261)๋Š” 1990๋…„(์ •ํ™•ํžˆ๋Š” 1988๋…„)์— ํƒ„์ƒํ•˜์˜€์œผ๋ฉฐ **64 kibt/s์˜ ๋ฐ์ดํ„ฐ ์ „์†ก๋น„**๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋ฑ์—์„œ ์ด๋ฏธ ํฌ๋กœ๋งˆ ์„œ๋ธŒ์ƒ˜ํ”Œ๋ง, ๋งคํฌ๋กœ ๋ธ”๋ก ๋“ฑ์˜ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 1995๋…„, **H.263** ๋น„๋””์˜ค ์ฝ”๋ฑ ํ‘œ์ค€์ด ํƒ„์ƒํ•˜์˜€์œผ๋ฉฐ 2001๋…„๊นŒ์ง€ ์ง€์†์ ์œผ๋กœ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. **H.264/AVC**์˜ ์ฒซ ๋ฒ„์ „์€ 2003๋…„์— ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•ด์—, **TrueMotion**์ด๋ผ๋Š” ํšŒ์‚ฌ๊ฐ€ **๋กœ์–„ํ‹ฐ๊ฐ€ ์—†๋Š”** **VP3**์ด๋ผ ๋ถ€๋ฅด๋Š” ์˜์ƒ ์••์ถ• ์ฝ”๋ฑ์„ ๊ณต๊ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. 2008๋…„, **๊ตฌ๊ธ€์ด ์ด ํšŒ์‚ฌ๋ฅผ ์ธ์ˆ˜ํ•˜๊ณ ** ๊ฐ™์€ ํ•ด์— **VP8**์„ ๊ณต๊ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. 2012๋…„ 12์›”, ๊ตฌ๊ธ€์€ **VP9**์„ ์ถœ์‹œํ•˜์˜€์œผ๋ฉฐ VP9์€ **๋ธŒ๋ผ์šฐ์ € ์‹œ์žฅ์˜ ์•ฝ ยพ(๋ชจ๋ฐ”์ผ ํฌํ•จ)์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.** **[AV1](https://en.wikipedia.org/wiki/AOMedia_Video_1)** ์€ **๊ตฌ๊ธ€, ๋ชจ์งˆ๋ผ, ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ, ์•„๋งˆ์กด, ๋„ทํ”Œ๋ฆญ์Šค, AMD, ARM, ์—”๋น„๋””์•„, ์ธํ…” ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šค์ฝ”**๋ฅผ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ํšŒ์‚ฌ๋กœ ๊ตฌ์„ฑ๋œ [์˜คํ”ˆ ๋ฏธ๋””์–ด ์—ฐํ•ฉ (AOMedia)](http://aomedia.org/)์ด ์„ค๊ณ„๋ฅผ ์ฃผ๋„ํ•˜๋Š” **๋กœ์–„ํ‹ฐ ์—†๋Š”** ์ƒˆ๋กœ์šด ์˜คํ”ˆ ์†Œ์Šค ๋™์˜์ƒ ์ฝ”๋ฑ์ž…๋‹ˆ๋‹ค. ![codec history timeline](/i/codec_history_timeline.png "codec history timeline") > #### AV1์˜ ํƒ„์ƒ > > 2015๋…„ ์ดˆ, ๊ตฌ๊ธ€์€ [VP10](https://en.wikipedia.org/wiki/VP9#Successor:_from_VP10_to_AV1)๋ฅผ, Xiph(๋ชจ์งˆ๋ผ)๋Š” [Daala](https://xiph.org/daala/) ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šค์ฝ”๋Š” [Thor](https://tools.ietf.org/html/draft-fuldseth-netvc-thor-03)๋ผ๋Š” ๋กœ์–„ํ‹ฐ ํ”„๋ฆฌ ๋น„๋””์˜ค ์ฝ”๋ฑ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. > > MPEG LA๋Š” HEVC(H.265)์— ๋Œ€ํ•œ ์• ๋‰ด์–ผ ์บก์„ ๋ฐœํ‘œํ•˜๊ณ , H.264๋ณด๋‹ค 8๋ฐฐ ๋†’์€ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ๋ฐœํ‘œํ–ˆ์œผ๋‚˜ ํƒœ์„ธ์ „ํ™˜์„ ํ•˜๊ณ  ๊ทœ์น™์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค: > * **์• ๋‰ด์–ผ ์บก ์—†์Œ**, > * **์ปจํ…์ธ  ์ˆ˜์ˆ˜๋ฃŒ** (์ˆ˜์ต์˜ 0.5%) ๊ทธ๋ฆฌ๊ณ  > * **๋‹จ์œ„๋‹น ์ˆ˜์ˆ˜๋ฃŒ๋Š” H.264๋ณด๋‹ค ์•ฝ 10๋ฐฐ ๋†’์Œ**. > > [์˜คํ”ˆ ๋ฏธ๋””์–ด ์—ฐํ•ฉ](http://aomedia.org/about/)์€ ํ•˜๋“œ์›จ์–ด ์ œ์กฐ์‚ฌ(์ธํ…”, AMD, ARM, ์—”๋น„๋””์•„, ์‹œ์Šค์ฝ”), ์ปจํ…์ธ  ๋”œ๋ฆฌ๋ฒ„๋ฆฌ(๊ตฌ๊ธ€, ๋„ทํ”Œ๋ฆญ์Šค, ์•„๋งˆ์กด), ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธํ…Œ์ด๋„ˆ(๊ตฌ๊ธ€, ๋ชจ์งˆ๋ผ)๋ฅผ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํšŒ์‚ฌ๋“ค์— ์˜ํ•ด ์„ค๋ฆฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. > > ์ด ํšŒ์‚ฌ๋“ค์€ ๋™์ผํ•œ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์œผ๋ฉฐ, ๋กœ์–„ํ‹ฐ ํ”„๋ฆฌ์˜ ๋™์˜์ƒ ์ฝ”๋ฑ๊ณผ ํ›จ์”ฌ [๋‹จ์ˆœํ•œ ํŠนํ—ˆ ๋ผ์ด์„ผ์Šค](http://aomedia.org/license/patent/)๋กœ ๋ฌด์žฅํ•œ AV1์˜ ํƒ„์ƒ์ด์˜€์ฃ . **ํ‹ฐ๋ชจ์‹œ B. ํ…Œ๋ฆฌ๋ฒ ๋ฆฌ**๋Š” [AV1 ์ปจ์…‰, ๋ผ์ด์„ผ์Šค ๋ชจ๋ธ, ํ˜„ํ™ฉ](https://www.youtube.com/watch?v=lzPaldsmJbk)์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ์ถœ์ฒ˜์ด๊ธฐ๋„ ํ•˜์ง€์š”. > > **๋ธŒ๋ผ์šฐ์ €๋กœ AV1 ์ฝ”๋ฑ์„ ๋ถ„์„** ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜๋ฉด ์•„์ฃผ ๋†€๋ผ์‹ค๊ฑฐ์—์š”. https://arewecompressedyet.com/analyzer/ ์— ๋ฐฉ๋ฌธํ•ด๋ณด์„ธ์š”. > ![av1 browser analyzer](/i/av1_browser_analyzer.png "av1 browser analyzer") > > ์ถ”์‹ : ์ฝ”๋ฑ์˜ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด [๋™์˜์ƒ ์••์ถ• ํŠนํ—ˆ](https://www.vcodex.com/video-compression-patents/)์— ๋Œ€ํ•œ ๊ธฐ์ดˆ๋ฅผ ๊ณต๋ถ€ํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค. ## ์ผ๋ฐ˜ ์ฝ”๋ฑ **์ผ๋ฐ˜ ์ฝ”๋ฑ์˜ ๋ฐ”ํƒ•์ด ๋˜๋Š” ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„** ์†Œ๊ฐœํ•  ๊ฒƒ์ด๋ฉฐ, ์ด๋Ÿฌํ•œ ์ปจ์…‰๋“ค์˜ ๋Œ€๋ถ€๋ถ„์€ ์œ ์šฉํ•˜๊ณ  VP9, AV1, HEVC์™€ ๊ฐ™์€ ํ˜„๋Œ€ ์ฝ”๋ฑ๋“ค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์„ ์•„์ฃผ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ™”ํ•œ๋‹ค๋Š” ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ธ€์˜ ๊ฐ„๊ฐ„ํžˆ ํ˜„์—… ์˜ˆ์ œ(๋Œ€๋ถ€๋ถ„ H.264)๋ฅผ ์‹œ์—ฐํ•ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ## ์ฒซ ๋ฒˆ์งธ ์Šคํ… - ์‚ฌ์ง„ ํŒŒํ‹ฐ์…”๋‹ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” **ํ”„๋ ˆ์ž„์„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜, ์„œ๋ธŒ ํŒŒํ‹ฐ์…˜** ๊ทธ ์ด์ƒ์œผ๋กœ **๋ถ„ํ• **ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ![picture partitioning](/i/picture_partitioning.png "picture partitioning") **๊ทธ๋Ÿฐ๋ฐ ์™œ?** ๋งŽ์€ ์ด์œ ๊ฐ€ ์žˆ์–ด์š”. ์˜ˆ๋กœ, ์‚ฌ์ง„์„ ๋ถ„ํ• ํ•˜๊ฒŒ ๋˜๋ฉด ์ •์ ์ธ ๋ฐฐ๊ฒฝ์— ์ปค๋‹ค๋ž€ ํŒŒํ‹ฐ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ , ์ ์€ ์›€์ง์ž„๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์ž‘์€ ํŒŒํ‹ฐ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ฆฌ๋”•์…˜์„ ๋ณด๋‹ค ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋ฑ์€ **์ด๋Ÿฌํ•œ ํŒŒํ‹ฐ์…˜๋“ค์„ ์Šฌ๋ผ์ด์Šค(ํ˜น์€ ํƒ€์ผ), ๋งคํฌ๋กœ(ํ˜น์€ ์ฝ”๋”ฉ ํŠธ๋ฆฌ ์œ ๋‹›) ๊ทธ๋ฆฌ๊ณ  ์ˆ˜ ๋งŽ์€ ์„œ๋ธŒ ํŒŒํ‹ฐ์…˜**์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒํ‹ฐ์…˜์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” ๋‹ค์–‘ํ•œ๋ฐ, AVC๋Š” 16x16์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด HEVC๋Š” 64x64๋ฅผ ์„ค์ •ํ•˜์ง€๋งŒ ์„œ๋ธŒ ํŒŒํ‹ฐ์…˜๋“ค์€ 4x4์˜ ์‚ฌ์ด์ฆˆ๊นŒ์ง€๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ๊ณต๋ถ€ํ•œ **ํ”„๋ ˆ์ž„ ์œ ํ˜•**์„ ๋– ์˜ฌ๋ ค๋ด…์‹œ๋‹ค. **์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋“ค์„ ๋ธ”๋ก๋“ค์—๋„** ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์ง€์š”. ๊ทธ๋Ÿฌ๋ฏ€๋กœ I-Slice, B-Slice, I-Macroblock๋“ฑ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > ### ์‹ค์Šต: ํŒŒํ‹ฐ์…˜ ํ™•์ธํ•ด๋ณด๊ธฐ > ์—ฌ๊ธฐ์„œ๋„ [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer)(์œ ๋ฃŒ๋„ ์žˆ์ง€๋งŒ ์ฒซ 10ํ”„๋ ˆ์ž„ ์ œ์•ฝ์˜ ๋ฌด๋ฃŒ ํŠธ๋ผ์ด์–ผ ๋ฒ„์ „๋„ ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. [VP9 ํŒŒํ‹ฐ์…˜](/encoding_pratical_examples.md#transcoding) ๋ถ„์„๋ณธ์ž…๋‹ˆ๋‹ค. > > ![VP9 partitions view intel video pro analyzer ](/i/paritions_view_intel_video_pro_analyzer.png "VP9 partitions view intel video pro analyzer") ## ๋‘ ๋ฒˆ์งธ ์Šคํ… - ํ”„๋ฆฌ๋”•์…˜ ํŒŒํ‹ฐ์…˜์„ ํ™•๋ณดํ•˜๊ณ  ๋‚˜๋ฉด, ์ด์ œ ์ด์— ๋Œ€ํ•œ ํ”„๋ฆฌ๋”•์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [์ธํ„ฐ ํ”„๋ฆฌ๋”•์…˜](#temporal-redundancy-inter-prediction)์— ๋Œ€ํ•ด์„œ๋Š” **๋ชจ์…˜ ๋ฒกํ„ฐ์™€ ๋‚˜๋จธ์ง€**๋ฅผ ์ „์†กํ•ด์•ผํ•˜๊ณ , [์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜](#spatial-redundancy-intra-prediction)์— ๋Œ€ํ•ด์„œ๋Š” **ํ”„๋ฆฌ๋”•์…˜์˜ ๋ฐฉํ–ฅ๊ณผ ๋‚˜๋จธ์ง€๋ฅผ ์ „์†กํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.** ## ์„ธ ๋ฒˆ์งธ ์Šคํƒญ - ๋ณ€ํ™˜ ์ž”์—ฌ ๋ธ”๋ก(`์˜ˆ์ธก๋œ ํŒŒํ‹ฐ์…˜ - ์‹ค์ œ ํŒŒํ‹ฐ์…˜`)์„ ํ™•๋ณดํ•˜๊ณ  ๋‚œ ํ›„์—๋Š” **๋ณ€ํ™˜**์„ ํ†ตํ•˜์—ฌ **์ „๋ฐ˜์ ์ธ ํ’ˆ์งˆ์„** ์œ ์ง€ํ•˜๋ฉด์„œ **๋ฒ„๋ ค์•ผ ํ•  ํ”ฝ์…€**์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด ์ •ํ™•ํ•œ ๋™์ž‘์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณ€ํ™˜๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. [๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ๋ณ€ํ™˜](https://en.wikipedia.org/wiki/List_of_Fourier-related_transforms#Discrete_transforms)๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์ด์‚ฐ ์ฝ”์‚ฌ์ธ ๋ณ€ํ™˜(DCT)์— ๋Œ€ํ•ด ์ฃผ๋„ ๋ฉด๋ฐ€ํžˆ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. [**DCT**](https://en.wikipedia.org/wiki/Discrete_cosine_transform)์˜ ์ฃผ๋œ ์„ฑ์งˆ๋กœ๋Š”: * **ํ”ฝ์…€๋“ค์˜** ๋ธ”๋ก์„ ๋™์ผํ•œ ์‚ฌ์ด์ฆˆ์˜ **์ฃผํŒŒ์ˆ˜ ๊ณ„์ˆ˜**์˜ ๋ธ”๋ก์œผ๋กœ ๋ณ€ํ™˜ํ•จ * ์—๋„ˆ์ง€๋ฅผ **์••์ถ•**ํ•˜์—ฌ ๊ณต๊ฐ„์  ์ค‘๋ณต์„ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•จ * **๊ฐ€์—ญ์ ์ž„**. ๋ฐ”๊ฟ”๋งํ•ด ํ”ฝ์…€๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป > 2017๋…„ 2์›” 2์ผ, ์‹ ํŠธ๋ผ R.J. ์™€ ๋ฐ”์ด์—˜ F.M์€ [14๊ฐœ์˜ ๋ง์…ˆ๋งŒ ํ•„์š”๋กœํ•˜๋Š” ์ด๋ฏธ์ง€ ์••์ถ•์— ๋Œ€ํ•œ DCT ์œ ์‚ฌ ๋ณ€ํ™˜](https://arxiv.org/abs/1702.00817)์„ ๋…ผ๋ฌธ์œผ๋กœ ๋ฐœํ‘œํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์—ญ์ž: 8-ํฌ์ธํŠธ ์ง๊ต ๊ทผ์‚ฌ ์ด์‚ฐ ์ฝ”์‚ฌ์ธ ๋ณ€ํ™˜์œผ๋กœ, ๊ณฑ์…ˆ์ด๋‚˜ ๋น„ํŠธ ์‹œํ”„ํŠธ๊ฐ€ ํ•„์š”๊ฐ€ ์—†์Œ) ๋ชจ๋“  ๋ถˆ๋ ›์— ์†Œ๊ฐœ๋œ ์ด์ ๋“ค์— ๋Œ€ํ•ด ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ•ด๋ณผ๊ฑฐ์—์š”. ๋‹ค์Œ **ํ”ฝ์…€์˜ ๋ธ”๋ก** (8x8)์„ ์‚ฌ์šฉํ•ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค: ![pixel values matrix](/i/pixel_matrice.png "pixel values matrix") ๋ Œ๋”๋ง๋œ ๋ธ”๋ก ์ด๋ฏธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(8x8): ![pixel values matrix](/i/gray_image.png "pixel values matrix") ํ”ฝ์…€์˜ ๋ธ”๋ก์— ๋Œ€ํ•˜์—ฌ **์ด์‚ฐ ์ฝ”์‚ฌ์ธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉด** **๊ณ„์ˆ˜์˜ ๋ธ”๋ก**(8x8)์„ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค: ![coefficients values](/i/dct_coefficient_values.png "coefficients values") ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณ„์ˆ˜์˜ ๋ธ”๋ก์„ ๋ Œ๋”๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค: ![dct coefficients image](/i/dct_coefficient_image.png "dct coefficients image") ๋ณด์‹œ๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์›๋ณธ ์ด๋ฏธ์ง€๊ฐ™์ด ์ƒ๊ธฐ์ง„ ์•Š์ฃ . ๋ˆˆ์น˜ ์ฑ„์…จ์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ **์ฒซ ๋ฒˆ์งธ ๊ณ„์ˆ˜**๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค๊ณผ ์•„์ฃผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ณ„์ˆ˜๋Š” DC ๊ณ„์ˆ˜๋กœ, ์ž…๋ ฅ ๋ฐฐ์—ด์—์„œ **์ƒ˜ํ”Œ์˜ ๋ชจ๋“  ๊ฒƒ**์„ ํ‘œํ˜„ํ•˜๋ฉฐ **ํ‰๊ท ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.** ์ด ๊ณ„์ˆ˜ ๋ธ”๋ก์€ ํฅ๋ฏธ๋กœ์šด ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ๋†’์€ ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„์„ ๋‚ฎ์€ ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„๊ณผ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ์ ์ด์ง€์š”. ![dct frequency coefficients property](/i/dctfrequ.jpg "dct frequency coefficients property") ์ด๋ฏธ์ง€ ์ƒ์—์„œ, **์—๋„ˆ์ง€์˜ ๋Œ€๋ถ€๋ถ„์€** [**๋‚ฎ์€ ์ฃผํŒŒ์ˆ˜**](https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm)์— ์ง‘์ค‘๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ์ง€๋ฅผ ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  **๋†’์€ ์ฃผํŒŒ์ˆ˜ ๊ณ„์ˆ˜๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๋ฉด**, ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ๊ทธ๋ฆฌ ๋งŽ์ด ํฌ์ƒํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ **๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** > ์ฃผํŒŒ์ˆ˜๋Š” ์‹ ํ˜ธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ ์–ป์€ ์ง€์‹์„ ํ™œ์šฉํ•˜์—ฌ DCT๋ฅผ ์‚ฌ์šฉํ•ด ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ฃผํŒŒ์ˆ˜(๊ณ„์ˆ˜ ๋ธ”๋ก)๋ฅผ ๋ณ€ํ™˜ ํ›„ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ณ„์ˆ˜๋“ค์„ ๋‚ ๋ ค๋ด…์‹œ๋‹ค. ์šฐ์„ , ์ด๋ฅผ **์ฃผํŒŒ์ˆ˜ ์˜์—ญ**์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ![coefficients values](/i/dct_coefficient_values.png "coefficients values") ๋‹ค์Œ์œผ๋กœ, ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์˜ ๋Œ€๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ๊ณ„์ˆ˜์˜ ๋ถ€๋ถ„(67%)๋ฅผ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ![zeroed coefficients](/i/dct_coefficient_zeroed.png "zeroed coefficients") ๋งˆ์นจ๋‚ด, ํ๊ธฐํ•œ ๊ณ„์ˆ˜ ๋ธ”๋ก์œผ๋กœ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ์žฌ๊ตฌ์„ฑํ•ด๋ณด๊ณ  ์ด๋ฅผ ์›๋ณธ๊ณผ ๋น„๊ตํ•ด๋ด…์‹œ๋‹ค. (๋ช…์‹ฌํ•˜์„ธ์š”. ์ด๋Š” ๊ฐ€์—ญ์ ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.) ![original vs quantized](/i/original_vs_quantized.png "original vs quantized") ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์‹œ๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋‹ฎ๊ธด ํ–ˆ์ง€๋งŒ ์›๋ณธ๊ณผ ๋น„๊ตํ•˜๋ฉด ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋งŽ์ด ๋ณด์ž…๋‹ˆ๋‹ค. **67.1875%๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ ๋„** ์›๋ณธ๊ณผ ์œ ์‚ฌํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์ง€์š”. ๋” ๋†’์€ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ์œ„ํ•ด ๋” ๋˜‘๋˜‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์ˆ˜๋ฅผ ํ๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์ด๋Š” ๋‹ค์Œ์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. > **๊ฐ ๊ณ„์ˆ˜๋Š” ๋ชจ๋“  ํ”ฝ์…€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ญ๋‹ˆ๋‹ค** > > ์—ฌ๊ธฐ์„œ ๊ธฐ์–ตํ•˜์…”์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€ ๊ฐ ๊ณ„์ˆ˜๊ฐ€ ๊ฐ๊ฐ์˜ ํ”ฝ์…€๊ณผ ์ง์ ‘์ ์œผ๋กœ ๋งคํ•‘๋˜์ง€๋Š” ์•Š์œผ๋‚˜ ๊ณ„์ˆ˜๋Š” ๋ชจ๋“  ํ”ฝ์…€์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ด ๋†€๋ผ์šด ๋„์‹์€ ์–ด๋–ป๊ฒŒ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ๊ณ„์ˆ˜๊ฐ€ ๊ฐ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. > > ![dct calculation](/i/applicat.jpg "dct calculation") > > ์ถœ์ฒ˜: https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm > > ๋˜ํ•œ DCT๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ [๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ํ˜•์„ฑ์„ ๋ณด๋ฉฐ DCT๋ฅผ ์‹œ๊ฐํ™”](/dct_better_explained.ipynb)ํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ ๊ฐ ๊ณ„์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [์•ŒํŒŒ๋ฒณ A๊ฐ€ ํ˜•์„ฑ๋˜๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.](https://en.wikipedia.org/wiki/Discrete_cosine_transform#Example_of_IDCT) > > ![](https://upload.wikimedia.org/wikipedia/commons/5/5e/Idct-animation.gif )
> ### ์‹ค์Šต: ๋‹ค๋ฅธ ๊ณ„์ˆ˜ ๋‚ ๋ฆฌ๊ธฐ > [DCT ๋ณ€ํ™˜](/uniform_quantization_experience.ipynb) ## ๋„ค ๋ฒˆ์งธ ๋‹จ๊ณ„ - ์–‘์žํ™” ๋ช‡๋ช‡ ๊ณ„์ˆ˜๋ฅผ ๋ฒ„๋ฆด ๋•Œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„(๋ณ€ํ™˜)์—์„œ ์ผ์ข…์˜ ์–‘์žํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์žƒ์„ ์ •๋ณด(๊ฐ„๋‹จํ•œ ์šฉ์–ด๋กœ **์†์‹ค๋ถ€**)๋ฅผ ์„ ํƒํ•˜๊ณ , **๊ณ„์ˆ˜๋ฅผ ์–‘์žํ™” ํ•˜์—ฌ ์••์ถ•์„ ํ•ฉ๋‹ˆ๋‹ค.** ์–ด๋–ป๊ฒŒ ๊ณ„์ˆ˜ ๋ธ”๋ก์„ ์–‘์žํ™” ์‹œํ‚ฌ๊นŒ์š”? ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ท ์ผ ์–‘์žํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท ์ผ ์–‘์žํ™”๋Š” ๋ธ”๋ก์„ ๊ฐ€์ง€๊ณ  **๋‹จ์ผ ๊ฐ’(10)์œผ๋กœ ์ด๋ฅผ ๋‚˜๋ˆ„์–ด** ์ด ๊ฐ’์„ ๋‚ด๋ฆผํ•ฉ๋‹ˆ๋‹ค. ![quantize](/i/quantize.png "quantize") ์ด ๊ณ„์ˆ˜ ๋ธ”๋ก์„ ์–ด๋–ป๊ฒŒ **๋ณ€ํ™˜**(์žฌ์–‘์žํ™”) ํ• ๊นŒ์š”? ์ฒ˜์Œ์— ๋‚˜๋ˆ„์—ˆ๋˜ ๊ฐ’๊ณผ **๋™์ผํ•œ ๊ฐ’์„ ๊ณฑํ•˜์—ฌ** ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![re-quantize](/i/re-quantize.png "re-quantize") **์ด ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์€ ์•„๋‹™๋‹ˆ๋‹ค.** ์™œ๋ƒํ•˜๋ฉด ๊ฐ ๊ณ„์ˆ˜์˜ ์ค‘์š”์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ๊ฐ’ ๋Œ€์‹  **์–‘์žํ™” ํ–‰๋ ฌ**์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ–‰๋ ฌ์€ DCT์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์šฐ์ธก ํ•˜๋‹จ์˜ ๋Œ€๋ถ€๋ถ„์„ ์–‘์žํ™”ํ•˜๊ณ  ์ขŒ์ธก ์ƒ๋‹จ์€ ๋œํ•œ๋‹ค๋Š” ํŠน์„ฑ์œผ๋กœ, [JPEG๊ฐ€ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค](https://www.hdm-stuttgart.de/~maucher/Python/MMCodecs/html/jpegUpToQuant.html). [์ด ํ–‰๋ ฌ์„ ์†Œ์Šค์ฝ”๋“œ](https://github.com/google/guetzli/blob/master/guetzli/jpeg_data.h#L40)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > ### ์‹ค์Šต: ์–‘์žํ™” > [์–‘์žํ™”](/dct_experiences.ipynb)๋ฅผ ์‹ค์Šตํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## ๋‹ค์„ฏ๋ฒˆ์งธ ๋‹จ๊ณ„ - ์—”ํŠธ๋กœํ”ผ ์ธ์ฝ”๋”ฉ ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€ ๋ธ”๋ก/์Šฌ๋ผ์ด์Šค/ํ”„๋ ˆ์ž„)๋ฅผ ์–‘์žํ™” ํ•˜๊ณ  ๋‚˜๋ฉด ์†์‹ค ์—†์ด ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ•(์•Œ๊ณ ๋ฆฌ์ฆ˜)์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ฐ„๋žตํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๊นŠ์€ ์ดํ•ด๋ฅผ ๋ฐ”๋ž€๋‹ค๋ฉด [์••์ถ•์— ๋Œ€ํ•œ ์ดํ•ด: ํ˜„๋Œ€ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์••์ถ•](https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/)์ด๋ผ๋Š” ๋†€๋ผ์šด ์ฑ…์„ ์ฝ์–ด๋ณด์„ธ์š”. ### VLC coding: ์‹ฌ๋ณผ ์ŠคํŠธ๋ฆผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค: **a**, **e**, **r**, **t**์ด๋ฉฐ ์ด ์‹ฌ๋ณผ๋“ค์— ๋Œ€ํ•œ ํ™•๋ฅ (0๊ณผ 1์‚ฌ์ด)์€ ๋‹ค์Œ ํ…Œ์ด๋ธ”์— ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. | | a | e | r | t | |-------------|-----|-----|------|-----| | ํ™•๋ฅ  | 0.3 | 0.3 | 0.2 | 0.2 | ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๊ณ  ํฐ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋‚ฎ์€ ๊ฒƒ๊นŒ์ง€ ๊ณ ์œ ํ•œ ์ด์ง„ ์ฝ”๋“œ(์ž‘์€ ๊ฐ’ ์ถ”์ฒœ)๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. | | a | e | r | t | |-------------|-----|-----|------|-----| | ํ™•๋ฅ  | 0.3 | 0.3 | 0.2 | 0.2 | | ์ด์ง„ ์ฝ”๋“œ | 0 | 10 | 110 | 1110 | ์ŠคํŠธ๋ฆผ **eat**๋ฅผ ์••์ถ•ํ•ด๋ด…์‹œ๋‹ค. ๊ฐ ์‹ฌ๋ณผ๋‹น 8๋น„ํŠธ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์••์ถ•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— 24๋น„ํŠธ๋ฅผ ์†Œ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ๊ฐ์˜ ์‹ฌ๋ณผ์„ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•˜๋ฉด ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” `10`์— ํ•ด๋‹นํ•˜๋Š” ์‹ฌ๋ณผ **e**๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์‹ฌ๋ณผ **a**๋ฅผ ๋”ํ•˜๊ณ (์‚ฐ์ˆ  ์—ฐ์‚ฐ ์•„๋‹˜) `[10][0]` ๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ข… ์••์ถ•๋œ ๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ `[10][0][1110]` ํ˜น์€ `1001110`์œผ๋กœ ๋งŒ๋“œ๋Š” ์‹ฌ๋ณผ **t**๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ์˜ค์ง **7๋น„ํŠธ**๋งŒ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. (์›๋ณธ๋ณด๋‹ค 3.4๋ฐฐ ์ ์€ ๊ณต๊ฐ„) ๊ฐ๊ฐ์˜ ์ฝ”๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•œ ์ ‘๋‘์‚ฌ ์ฝ”๋“œ์—ฌ์•ผ ํ•˜๋ฉฐ [ํ—ˆํ”„๋งŒ์ด ์ด๋Ÿฌํ•œ ์ˆซ์ž๋“ค์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.](https://en.wikipedia.org/wiki/Huffman_coding) ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์—๋„ **๋น„๋””์˜ค ์ฝ”๋ฑ๋“ค์€ ์—ฌ์ „ํžˆ ์ด ๋ฐฉ๋ฒ•์„ ์ œ๊ณต**ํ•˜๋ฉฐ ์••์ถ•์„ ํ•„์š”๋กœํ•˜๋Š” ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์„ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์—”์ฝ”๋”์™€ ๋””์ฝ”๋” ๋ชจ๋‘ **๋ฐ˜๋“œ์‹œ ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ…Œ์ด๋ธ”๋„ ํ•จ๊ป˜ ๋ณด๋‚ด์•ผํ•˜์ฃ . ### ์‚ฐ์ˆ ์  ์ฝ”๋”ฉ: ์‹ฌ๋ณผ ์ŠคํŠธ๋ฆผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค: **a**, **e**, **r**, **s**, **t**์ด๋ฉฐ ์ด ๋“ค์˜ ํ™•๋ฅ ์€ ๋‹ค์Œ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. | | a | e | r | s | t | |-------------|-----|-----|------|------|-----| | ํ™•๋ฅ  | 0.3 | 0.3 | 0.15 | 0.05 | 0.2 | ์ด ํ…Œ์ด๋ธ”์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋นˆ๋„์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ชจ๋“  ์‹ฌ๋ณผ์„ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![initial arithmetic range](/i/range.png "initial arithmetic range") ์ด์ œ ์ŠคํŠธ๋ฆผ **eat**๋ฅผ ์ธ์ฝ”๋”ฉํ•ด๋ณด์ฃ . ํ•˜์œ„ ๋ฒ”์œ„ **0.3๋ถ€ํ„ฐ 0.6** ์•ˆ์— ์žˆ๋Š” (๊ทธ๋Ÿฌ๋‚˜ ํฌํ•จ๋˜์ง„ ์•Š์Œ) ์ฒซ ๋ฒˆ์งธ ์‹ฌ๋ณผ **e**๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด ํ•˜์œ„ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์ด์ „์— ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋น„์œจ๋กœ ๋ถ„ํ• ํ•ด ์ƒˆ๋กœ์šด ๋ฒ”์œ„ ๋‚ด์—์„œ ๋‹ค์‹œ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ![second sub range](/i/second_subrange.png "second sub range") ์ŠคํŠธ๋ฆผ **eat**๋ฅผ ์ด์–ด์„œ ์ธ์ฝ”๋”ฉ ํ•ด๋ด…์‹œ๋‹ค. ์ƒˆ๋กœ์šด ํ•˜์œ„ ๋ฒ”์œ„ **0.3๋ถ€ํ„ฐ 0.39**์— ํฌํ•จ๋œ ๋‘ ๋ฒˆ์งธ ์‹ฌ๋ณผ **e**๋ฅผ ์ทจํ•œ ๋’ค ๋งˆ์ง€๋ง‰ ์‹ฌ๋ณผ **t**๋กœ ๋™์ผํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ํ•˜์œ„ ๋ฒ”์ฃผ์ธ **0.354๋ถ€ํ„ฐ 0.372**๋ฅผ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ![final arithmetic range](/i/arithimetic_range.png "final arithmetic range") ๋งˆ์ง€๋ง‰ ํ•˜์œ„ ๋ฒ”์œ„์ธ **0.354๋ถ€ํ„ฐ 0.372**๋‚ด์— ์žˆ๋Š” ์ˆซ์ž๋ฅผ ์„ ํƒํ•ด๋ด…์‹œ๋‹ค. **0.36**์„ ๊ณจ๋ผ๋ณด์ฃ . ์ด ํ•˜์œ„ ๋ฒ”์ฃผ์— ๋‚ด์— ์žˆ๋Š” ์ˆ˜๋ผ๋ฉด ์–ด๋–ค ๊ฒƒ์ด๋“  ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  **์ด ์ˆซ์ž๋งŒ ์žˆ์œผ๋ฉด** ์›๋ณธ ์ŠคํŠธ๋ฆผ์ธ **eat**๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ŠคํŠธ๋ฆผ์„ ์ธ์ฝ”๋”ฉํ•  ๋ฒ”์œ„์˜ ๋ฒ”์œ„ ์•ˆ์— ์„ ์„ ๊ธ‹๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ![final range traverse](/i/range_show.png "final range traverse") **์—ญ๊ณผ์ •** (์†Œ์œ„ ๋งํ•˜๋Š” ๋””์ฝ”๋”ฉ)์€ ์ธ์ฝ”๋”ฉ๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ–ˆ๋˜ ์ˆซ์ž์ธ **0.36**์œผ๋กœ ๋™์ผํ•œ ๊ณผ์ •์„ ํ†ตํ•˜์—ฌ ์›๋ž˜์˜ ๋ฒ”์œ„๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ์ด ์ˆซ์ž๋ฅผ ์ธ์ฝ”๋”ฉ๋œ ์ŠคํŠธ๋ฆผ์„ ๋ฐํ˜€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฒ”์œ„์—์„œ ์•ž์„œ ์„ ํƒํ•œ ์ˆซ์ž(0.36)๊ฐ€ ์Šฌ๋ผ์ด์Šค์™€ ์ผ์น˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๊ฒŒ ์ฒซ ๋ฒˆ์งธ ์‹ฌ๋ณผ์ด๋ฉฐ ์ด์ œ ํ•˜์œ„ ๋ฒ”์œ„๋กœ ๋ถ„ํ• ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๋™์ผํ•œ ๊ณผ์ •์œผ๋กœ **0.36**์ด ์‹ฌ๋ณผ **a**์™€ ์ผ์น˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํŒŒ์•…ํ•  ์ˆ˜ ์ž‡์ฃ . ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋‚˜๋ฉด ๋งˆ์ง€๋ง‰ ์‹ฌ๋ณผ์ธ **t**์— ์ด๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์›๋ณธ์˜ ์ธ์ฝ”๋”ฉ ๋œ ์ŠคํŠธ๋ฆผ *eat*๋ฅผ ๊ตฌ์„ฑํ•จ) ์—”์ฝ”๋”์™€ ๋””์ฝ”๋” ๋ชจ๋‘ ์‹ฌ๋ณผ ํ™•๋ฅ  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด **๋ฐ˜๋“œ์‹œ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ํ…Œ์ด๋ธ”๋„ ๋ณด๋‚ด์•ผ๊ฒ ์ฃ . ๊น”๋”ํ•˜์ฅฌ? ๊ทธ์ฅฌ? ์ด ํ•ด๋ฒ•์„ ๋– ์˜ฌ๋ฆฐ ์‚ฌ๋žŒ๋“ค์€ ๊ฒ๋‚˜ ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡๋ช‡ [๋น„๋””์˜ค ์ฝ”๋ฑ](https://en.wikipedia.org/wiki/Context-adaptive_binary_arithmetic_coding)์€ ์ด ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์ ์–ด๋„ ์ด๋ฅผ ์˜ต์…˜์œผ๋กœ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ง์ด์ฃ ) ์ด ์•„์ด๋””์–ด๋Š” ๋ฌด์†์‹ค๋กœ ์–‘์žํ™”๋œ ๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ ์••์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์€ ์•„์ฃผ ๋งŽ์€ ์„ธ๋ถ€์‚ฌํ•ญ, ์ด์œ , ์ ˆ์ถฉ์•ˆ ๋“ฑ๋“ฑ์ด ์ƒ๋žต๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๋กœ์„œ [๋” ๋ฐฐ์šฐ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค](https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/). ์ตœ์‹  ์ฝ”๋ฑ์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ [ANS์™€ ๊ฐ™์€ ์—”ํŠธ๋กœํ”ผ ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜](https://en.wikipedia.org/wiki/Asymmetric_Numeral_Systems)์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. > ### ์˜ˆ์ œ: CABAC vs CAVLC > [CABAC์™€ CAVLC ์ด ๋‘ ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑ](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#cabac-vs-cavlc)ํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์ŠคํŠธ๋ฆผ์ด ์ƒ์„ฑํ•˜๋Š”๋ฐ ์†Œ๋ชจํ•˜๋Š” **์‹œ๊ฐ„์„ ๋น„๊ต**ํ•ด ๋ณด์„ธ์š”. ๋˜, **๊ฒฐ๊ณผ๋ฌผ์˜ ์‚ฌ์ด์ฆˆ๋„** ๋น„๊ตํ•ด๋ณด์„ธ์š”. ## ์—ฌ์„ฏ๋ฒˆ์งธ ๋‹จ๊ณ„ - ๋น„ํŠธ ์ŠคํŠธ๋ฆผ ํฌ๋งท ์ด ๋ชจ๋“  ๊ณผ์ •์„ ๋งˆ์นœ ํ›„์—๋Š” **์••์ถ•๋œ ํ”„๋ ˆ์ž„๊ณผ ์ด ๊ณผ์ •๋“ค์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ํŒจํ‚น**ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. **์—”์ฝ”๋”๊ฐ€ ๊ฒฐ์ •ํ•œ ๋‚ด์šฉ๋“ค**, ๊ฐ€๋ น ๋น„ํŠธ ๊นŠ์ด, ์ƒ‰๊ณต๊ฐ„, ํ•ด์ƒ๋„, ํ”„๋ฆฌ๋”•์…˜ ์ •๋ณด(๋ชจ์…˜ ๋ฒกํ„ฐ, ์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜ ๋ฐฉํ–ฅ), ํ”„๋กœํŒŒ์ผ, ๋ ˆ๋ฒจ, ํ”„๋ ˆ์ž„๋ ˆ์ดํŠธ, ํ”„๋ ˆ์ž„ ํƒ€์ž…, ํ”„๋ ˆ์ž„ ๋„˜๋ฒ„ ๋“ฑ์˜ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์ •๋ณด๋“ค์— ๋Œ€ํ•˜์—ฌ ๋””์ฝ”๋”์—๊ฒŒ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๊ฒ‰ํ•ฅ๊ธฐ๋กœ H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ ๊ณต๋ถ€ํ•ด๋ณผ๊ฑฐ์—์š”. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” [๋ฏธ๋‹ˆ๋ฉ€ํ•œ H.264 * ๋น„ํŠธ์ŠคํŠธ๋ฆผ](/encoding_pratical_examples.md#generate-a-single-frame-h264-bitstream)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ด ์ €์žฅ์†Œ์™€ [ffmpeg](http://ffmpeg.org/)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€์š”. ``` ./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264 ``` > * ffmpeg๋Š” ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๋ชจ๋“  ์ธ์ฝ”๋”ฉ ํŒŒ๋ผ๋ฏธํ„ฐ์— **SEI NAL**์„ ๋ถ™์ด๋Š”๋ฐ NAL์ด ๋ฌด์—‡์ธ์ง€ ๊ณง ์ •์˜ ํ•ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” **๋‹จ์ผ ํ”„๋ ˆ์ž„**, 64x64, ์ƒ‰๊ณต๊ฐ„ yuv420์˜ ๋กœ์šฐ h264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋ฉฐ ํ”„๋ ˆ์ž„์œผ๋กœ๋Š” ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ์—์š”. > ![used frame to generate minimal h264 bitstream](/i/minimal.png "used frame to generate minimal h264 bitstream") ### H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ AVC(H.264) ํ‘œ์ค€์€ **[NAL](https://en.wikipedia.org/wiki/Network_Abstraction_Layer)** (๋„คํŠธ์›Œํฌ ์ถ”์ƒ ๊ณ„์ธต)์ด๋ผ ๋ถ€๋ฅด๋Š” **๋งคํฌ๋กœ ํ”„๋ ˆ์ž„** (๋„คํŠธ์›Œํฌ ์šฉ์–ด)์— ์ „์†กํ•˜๋Š” ์ •๋ณด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. NAL์˜ ์ฃผ๋œ ๋ชฉ์ ์€ "๋„คํŠธ์›Œํฌ ์นœํ™”์ "์ธ ๋น„๋””์˜ค ํ‘œํ˜„์˜ ํ”„๋กœ๋น„์ „์œผ๋กœ, ์ด ํ‘œ์ค€์€ ๋ฐ˜๋“œ์‹œ TV(์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜), ์ธํ„ฐ๋„ท(ํŒจํ‚ท ๊ธฐ๋ฐ˜) ๋“ฑ์„ ๋น„๋กฏํ•œ ๊ฒƒ๋“ค์—์„œ ๋ฐ˜๋“œ์‹œ ๋™์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ![NAL units H.264](/i/nal_units.png "NAL units H.264") NAL ์œ ๋‹›์˜ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” [๋™๊ธฐํ™” ๋งˆ์ปค](https://en.wikipedia.org/wiki/Frame_synchronization)๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋™๊ธฐํ™” ๋งˆ์ปค๋Š” ๋งจ ์ฒซ ๋ฒˆ์งธ์ธ `0x00 0x00 0x00 0x01`๋ฅผ ์ œ์™ธํ•˜๊ณ  `0x00 0x00 0x01`์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์•ž์„œ ์ƒ์„ฑํ•œ h264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ์— **hexdump**๋ฅผ ๋– ๋ณด๋ฉด, ํŒŒ์ผ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์„ธ๊ณ„์˜ `NAL`์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![synchronization marker on NAL units](/i/minimal_yuv420_hex.png "synchronization marker on NAL units") ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๋ฐ”์™€ ๊ฐ™์ด, ๋””์ฝ”๋”๋Š” ์‚ฌ์ง„ ์ •๋ณด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„๋””์˜ค์˜ ์„ธ๋ถ€์‚ฌํ•ญ, ์ƒ‰, ์‚ฌ์šฉ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ NAL์˜ **์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ**๋Š” ์ด์— ๋Œ€ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ์™€ **ํƒ€์ž…**์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. | NAL type id | Description | |--- |---| | 0 | ์ •์˜๋˜์ง€ ์•Š์Œ | | 1 | ์ธ์ฝ”๋”ฉ๋œ non-IDR ์‚ฌ์ง„ ์Šฌ๋ผ์ด์Šค | | 2 | ์ธ์ฝ”๋”ฉ๋œ ์Šฌ๋ผ์ด์Šค ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜ A | | 3 | ์ธ์ฝ”๋”ฉ๋œ ์Šฌ๋ผ์ด์Šค ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜ B | | 4 | ์ธ์ฝ”๋”ฉ๋œ ์Šฌ๋ผ์ด์Šค ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜ C | | 5 | **IDR** ์ธ์ฝ”๋”ฉ์˜ IDR ์‚ฌ์ง„ ์Šฌ๋ผ์ด์Šค | | 6 | **SEI** ์ถ”๊ฐ€ ๋ณด์™„ ์ •๋ณด | | 7 | **SPS** ์‹œํ€€์Šค ํŒŒ๋ผ๋ฏธํ„ฐ ์…‹ | | 8 | **PPS** ์‚ฌ์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ ์…‹ | | 9 | ์—‘์„ธ์Šค ๋‹จ์œ„ ๋ธ๋ฆฌ๋ฏธํ„ฐ | | 10 | ์‹œํ€€์Šค์˜ ๋ | | 11 | ์ŠคํŠธ๋ฆผ์˜ ๋ | | ... | ... | ๋ณดํŽธ์ ์œผ๋กœ ๋น„ํŠธ์ŠคํŠธ๋ฆผ์˜ ์ฒซ ๋ฒˆ์งธ NAL์€ **SPS**์ž…๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์€ **ํ”„๋กœํŒŒ์ผ**, **๋ ˆ๋ฒจ**, **ํ•ด์ƒ๋„** ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ธ์ฝ”๋”ฉ ๋ณ€์ˆ˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋งˆ์ปค๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ฒฝ์šฐ **์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ**๋ฅผ ๋””์ฝ”๋“œํ•˜์—ฌ **์–ด๋–ค ํƒ€์ž…์˜ NAL**์ด ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์ธ์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋งˆ์ปค ๋‹ค์Œ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” `01100111`์ž…๋‹ˆ๋‹ค. ์ด ์ฒซ ๋ฒˆ์งธ ๋น„ํŠธ(`0`)๋Š” **forbidden_zero_bit**์— ํ•ด๋‹นํ•˜๋ฉฐ, ๋‹ค์Œ 2๋น„ํŠธ(`11`)๋Š” ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์ด NAL์ด ๋ ˆํผ๋Ÿฐ์Šค ํ•„๋“œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” **nal_ref_idc**๋ฅผ ์•Œ๋ ค์ฃผ๋ฉฐ, ๋‚˜๋จธ์ง€ 5๋น„ํŠธ(`00111`)์€ `nal_unit_type` ํ•„๋“œ๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” **SPS** (7) NAL ์œ ๋‹›์ž…๋‹ˆ๋‹ค. SPS NAL์˜ ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ(`binary=01100100, hex=0x64, dec=100`)๋Š” ์ธ์ฝ”๋”๊ฐ€ ์‚ฌ์šฉํ•œ ํ”„๋กœํŒŒ์ผ์„ ๋ณด์—ฌ์ฃผ๋Š” **profile_idc** ํ•„๋“œ๋กœ, ์ด ๊ฒฝ์šฐ์—๋Š” **[constrained high-profile](https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles)** ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” B(bi-predictive) ์Šฌ๋ผ์ด์Šค์˜ ์ง€์›์ด ์—†๋Š” ํ•˜์ดํ”„๋กœํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ![SPS binary view](/i/minimal_yuv420_bin.png "SPS binary view") SPS NAL์— ๋Œ€ํ•œ H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ ์ŠคํŽ™์„ ์ฝ๋Š” ๊ฒฝ์šฐ, **ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„**, **์นดํ…Œ๊ณ ๋ฆฌ** ๊ทธ๋ฆฌ๊ณ  **๋””์Šคํฌ๋ฆฝ์…˜**์— ๋Œ€ํ•œ ๋งŽ์€ ๊ฐ’์„ ์ฐธ๊ณ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด `pic_width_in_mbs_minus_1`์™€ `pic_height_in_map_units_minus_1`ํ•„๋“œ๋ฅผ ๋ด…์‹œ๋‹ค. | Parameter name | Category | Description | |--- |---|---| | pic_width_in_mbs_minus_1 | 0 | ue(v) | | pic_height_in_map_units_minus_1 | 0 | ue(v) | > **ue(v)**: unsigned integer [Exp-Golomb-coded](https://pythonhosted.org/bitstring/exp-golomb.html) ์ด ํ•„๋“œ๋“ค์˜ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ์„ ๋•Œ๋ ค๋ณด๋ฉด, **ํ•ด์ƒ๋„**์— ์ด๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. `119 ( (119 + 1) * macroblock_size = 120 * 16 = 1920) `์˜ ๊ฐ’๊ณผ `pic_width_in_mbs_minus_1`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `1920 x 1080`๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `1920`์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  `119`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋˜ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•œ๊ฒƒ์ด์ง€์š”. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ทฐ(ex: `xxd -b -c 11 v/minimal_yuv420.h264`)๋กœ ์•ž์„œ ์ƒ์„ฑํ•œ ๋น„๋””์˜ค๋ฅผ ๊ณ„์†ํ•˜์—ฌ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ, frame ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋งˆ์ง€๋ง‰ NAL์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![h264 idr slice header](/i/slice_nal_idr_bin.png "h264 idr slice header") ์•ž์„œ ์ƒ์„ฑํ•œ ๋น„๋””์˜ค์˜ ์ฒซ ๋ฒˆ์งธ 6๋ฐ”์ดํŠธ์˜ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: `01100101 10001000 10000100 00000000 00100001 11111111`. ์ด๋ฏธ ์•„๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” NAL์˜ ํƒ€์ž…์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ์—๋Š” (`00101`)์ด๋ฉฐ ์ด๋Š” **IDR Slice (5)** ์ด๊ณ  ๋” ์ž์„ธํžˆ ํ™•์ธํ•ด๋ณด๋ฉด: ![h264 slice header spec](/i/slice_header.png "h264 slice header spec") ์ŠคํŽ™ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์Šฌ๋ผ์Šค์˜ ํƒ€์ž…(**slice_type**), ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ(**frame_num**)์„ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ํ•„๋“œ๋“ค์„ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ํ•„๋“œ(`ue(v), me(v), se(v) ํ˜น์€ te(v)`)์˜ ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•ด, [Exponential-Golomb](https://pythonhosted.org/bitstring/exp-golomb.html)๋ผ ๋ถ€๋ฅด๋Š” ํŠน๋ณ„ํ•œ ๋””์ฝ”๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋Œ€๋ถ€๋ถ„ ์ˆ˜๋งŽ์€ ๊ธฐ๋ณธ ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์— **๋ณ€์ˆ˜ ๊ฐ’์„ ์ธ์ฝ”๋”ฉํ•˜๋Š”๋ฐ์— ์žˆ์–ด ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.** > **slice_type**์˜ ๊ฐ’๊ณผ ์ด ๋น„๋””์˜ค์˜ **frame_num**๋Š” ๊ฐ๊ฐ 7(I slice)๊ณผ 0 (์ฒซ ๋ฒˆ์งธ ํ”„๋ ˆ์ž„)์ž…๋‹ˆ๋‹ค. **๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ ํ”„๋กœํ† ์ฝœ**๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๋น„ํŠธ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•˜์—ฌ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด [ITU H.264 spec.](http://www.itu.int/rec/T-REC-H.264-201610-I)๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋‹ค์Œ์€ ์‚ฌ์ง„ ๋ฐ์ดํ„ฐ(์••์ถ•๋œ YUV)๊ฐ€ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋งคํฌ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ![h264 bitstream macro diagram](/i/h264_bitstream_macro_diagram.png "h264 bitstream macro diagram") [VP9 bitstream](https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf), [H.265 (HEVC)](http://handle.itu.int/11.1002/1000/11885-en?locatt=format:pdf)์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋น„ํŠธ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด์„œ๋„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์€ ์šฐ๋ฆฌ์˜ ์ƒˆ ๋ฒ ํ”„ [**AV1** bitstream](https://medium.com/@mbebenita/av1-bitstream-analyzer-d25f1c27072b#.d5a89oxz8 )๋„ ๋ง์ด์ฃ . [๋ชจ๋“  ๋น„ํŠธ์ŠคํŠธ๋ฆผ๋“ค์ด ๋น„์Šทํ• ๊นŒ์š”? ์‘ ์•„๋‹ˆ์•ผ](http://www.gpac-licensing.com/2016/07/12/vp9-av1-bitstream-format/), ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ํ„ฐ๋“ํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > ### ์‹ค์Šต: H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ ์‚ดํŽด๋ณด๊ธฐ > [๋‹จ์ผ ํ”„๋ ˆ์ž„์˜ ๋น„๋””์˜ค๋ฅผ ๋งŒ๋“ค๊ณ ](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#generate-a-single-frame-video) [mediainfo](https://en.wikipedia.org/wiki/MediaInfo)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋น„๋””์˜ค์˜ H.264 ๋น„ํŠธ์ŠคํŠธ๋ฆผ์„ ์กฐ์‚ฌํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ [h264(AVC)๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ](https://github.com/MediaArea/MediaInfoLib/blob/master/Source/MediaInfo/Video/File_Avc.cpp)๋„ ๋ณผ ์ˆ˜ ์žˆ์ง€์š”. > > ![mediainfo details h264 bitstream](/i/mediainfo_details_1.png "mediainfo details h264 bitstream") > > [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer)๋Š” ์œ ๋ฃŒ์ด๊ธด ํ•˜์ง€๋งŒ ํŠธ๋ผ์ด์–ผ ๋ฒ„์ „์—์„œ๋Š” ์ดˆ๋ฐ˜์˜ 10ํ”„๋ ˆ์ž„ ์ œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต ์šฉ๋„๋กœ๋Š” ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. > > ![intel video pro analyzer details h264 bitstream](/i/intel-video-pro-analyzer.png "intel video pro analyzer details h264 bitstream") ## ๋ฆฌ๋ทฐ **ํ˜„๋Œ€ ์ฝ”๋ฑ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ง€๊ธˆ๊นŒ์ง€ ํ•™์Šตํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค**์„ ๋ช…์‹ฌํ•ด์ฃผ์„ธ์š”. ์‹ค์ œ๋กœ Thor ๋น„๋””์˜ค ์ฝ”๋ฑ์˜ ๋ธ”๋ก ๋‹ค์ด์–ด ๊ทธ๋žจ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์•ž์„œ ํ•™์Šตํ•œ ๋ชจ๋“  ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์ด ๋ถ„์•ผ์— ๋Œ€ํ•œ ํ˜์‹ ๊ณผ ๋…ผ๋ฌธ๋“ค์— ๋Œ€ํ•ด ์ตœ์†Œํ•œ์˜ ์ดํ•ด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ![thor_codec_block_diagram](/i/thor_codec_block_diagram.png "thor_codec_block_diagram") ์ด์ „์— ๊ณ„์‚ฐํ–ˆ๋˜ [ํ•œ ์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ 720p ํ•ด์ƒ๋„๋ฅผ ๊ฐ€์ง„ 30fps ๋น„๋””์˜ค๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 139GB์˜ ์šฉ๋Ÿ‰](#%ED%81%AC%EB%A1%9C%EB%A7%88-%EC%84%9C%EB%B8%8C%EC%83%98%ED%94%8C%EB%A7%81)์ด ํ•„์š”ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐฐ์šด **์ธํ„ฐ ํ”„๋ฆฌ๋”•์…˜, ์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜, ๋ณ€ํ™˜, ์–‘์žํ™”, ์—”ํŠธ๋กœํ”ผ ์ฝ”๋”ฉ ๋“ฑ**์˜ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๋žต **ํ”ฝ์…€ ๋‹น 0.031๋น„ํŠธ**๋ฅผ ์†Œ๋น„ํ•˜๋ฉฐ, ๋ณผ ์ˆ˜ ์žˆ์„๋งŒํ•œ ์ˆ˜์ค€์˜ ํ’ˆ์งˆ์˜ ๋น„๋””์˜ค์— **139GB์™€ ๋‹ฌ๋ฆฌ 367.82MB์˜ ์šฉ๋Ÿ‰๋งŒ์„ ํ•„์š”๋กœ** ํ•ฉ๋‹ˆ๋‹ค. > ์—ฌ๊ธฐ์„œ ์ œ๊ณต๋œ ์˜ˆ์ œ ๋น„๋””์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **ํ”ฝ์…€ ๋‹น 0.031๋น„ํŠธ**๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ## ์–ด๋–ป๊ฒŒ H.265๋Š” H.264๋ณด๋‹ค ๋” ๋†’์€ ์••์ถ•๋ฅ ์„ ๋‹ฌ์„ฑํ–ˆ๋Š”๊ฐ€ ์ด์ œ ์ฝ”๋ฑ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋งŽ์ด ๋ฐฐ์› ์œผ๋‹ˆ, ์ƒˆ๋กœ์šด ์ฝ”๋ฑ๋“ค์ด ์ ์€ ๋น„ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ๋” ๋†’์€ ํ•ด์ƒ๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”. AVC์™€ HEVC๋ฅผ ๋น„๊ตํ•ด๋ณผํ…๋ฐ์š”, CPU ์‹ธ์ดํด(๋ณต์žก๋„)์™€ ์••์ถ•๋ฅ  ๊ฐ„์—๋Š” ํ•ญ์ƒ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•˜์„ธ์š”. HEVC๋Š” AVC์— ๋น„ํ•ด ๋” ํฌ๊ณ  ๋” ๋งŽ์€ **ํŒŒํ‹ฐ์…˜(๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒ ํŒŒํ‹ฐ์…˜)** ์˜ต์…˜, **์ธํŠธ๋ผ ํ”„๋ฆฌ๋”•์…˜ ๋ฐฉํ–ฅ**, **ํ–ฅ์ƒ๋œ ์—”ํŠธ๋กœํ”ผ ์ฝ”๋”ฉ** ๋“ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ–ฅ์ƒ์€ H.265๊ฐ€ H.264๋ณด๋‹ค 50% ๋†’์€ ์••์ถ• ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์ฃ . ![h264 vs h265](/i/avc_vs_hevc.png "H.264 vs H.265") # ์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ ## ์ผ๋ฐ˜์ ์ธ ์•„ํ‚คํ…์ณ ![general architecture](/i/general_architecture.png "general architecture") [TODO] ## ์ ์ง„์  ๋‹ค์šด๋กœ๋“œ์™€ ์ ์‘ํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ ![progressive download](/i/progressive_download.png "progressive download") ![adaptive streaming](/i/adaptive_streaming.png "adaptive streaming") [TODO] ## ์ปจํ…์ธ  ๋ณดํ˜ธ **๊ฐ„๋‹จํ•œ ํ† ํฐ ์‹œ์Šคํ…œ**์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ธ ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋””์˜ค๋ฅผ ์š”์ฒญํ•˜๋ฉด CDN์€ ์‚ฌ์šฉ์ž๋ฅผ ๋ง‰๊ณ , ์œ ํšจํ•œ ํ† ํฐ์„ ์ง€๋‹Œ ์‚ฌ์šฉ์ž๋ผ๋ฉด ์ปจํ…์ธ ๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ง์ด์ฃ . ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์›น ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ๊ต‰์žฅํžˆ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ![token protection](/i/token_protection.png "token_protection") ์ด ํ† ํฐ ์‹œ์Šคํ…œ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋””์˜ค๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ **DRM(๋””์ง€ํ„ธ ์ €์ž‘๊ถŒ ๊ด€๋ฆฌ)** ์‹œ์Šคํ…œ์€ ์ด๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![drm](/i/drm.png "drm") ์‹ค์ œ ํ˜„์—…์˜ ์‹œ์Šคํ…œ๊ณผ ์‹ค๋ฌด์ž๋“ค์€ ๋‘ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ### DRM #### Main systems * FPS - [**FairPlay Streaming**](https://developer.apple.com/streaming/fps/) * PR - [**PlayReady**](https://www.microsoft.com/playready/) * WV - [**Widevine**](http://www.widevine.com/) #### ๋ฌด์—‡์ธ๊ฐ€? DRM์€ ๋””์ง€ํ„ธ ์ €์ž‘๊ถŒ ๊ด€๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, **๋””์ง€ํ„ธ ๋ฏธ๋””์–ด์— ๋Œ€ํ•œ ๊ถŒ๋ฆฌ ๋ณดํ˜ธ**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋‚˜ [๋ณดํŽธ์ ์œผ๋กœ๋Š” ์ˆ˜๊ธ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค](https://en.wikipedia.org/wiki/Digital_rights_management#DRM-free_works). #### ์™œ? ์ปจํ…์ธ  ์ œ์ž‘์ž(๋Œ€๋ถ€๋ถ„ ์ŠคํŠœ๋””์˜ค๋“ค)๋“ค์€ ์ €์ž‘๋ฌผ์˜ ๋ฌด๋‹จ ๋ฐฐํฌ๋ฅผ ๋ง‰์•„ ์ž์‹ ์˜ ์ง€์  ์žฌ์‚ฐ๊ถŒ์„ ๋ณดํ˜ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. #### ์–ด๋–ป๊ฒŒ? ๊ทน๋„๋กœ ๊ฐ„๋žตํ™”๋œ DRM์˜ ์ถ”์ƒ์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋งŒ ์†Œ๊ฐœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. **์ปจํ…์ธ  C1**(์˜ˆ๋ฅผ๋“ค์–ด HLS๋‚˜ dash ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ)์„ **DRM ์‹œ์Šคํ…œ DRM1**(์™€์ด๋“œ๋ฐ”์ธ, ํ”Œ๋ ˆ์ด๋ ˆ๋””, ํŽ˜์–ดํ”Œ๋ ˆ์ด)์„ ์‚ฌ์šฉํ•˜๋Š” **๋””๋ฐ”์ด์Šค D1**(์˜ˆ๋ฅผ๋“ค์–ด ์Šค๋งˆํŠธํฐ, TV, ํƒœ๋ธ”๋ฆฟ, ๋ฐ์Šคํฌํƒ‘, ๋…ธํŠธ๋ถ)์—์„œ **ํ”Œ๋ ˆ์ด์–ด P1**(์˜ˆ๋ฅผ๋“ค์–ด ์ƒค์นด ํด๋ž˜ํผ, ์—‘์†Œ ํ”Œ๋ ˆ์ด์–ด, ios)๋กœ ๋ณธ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์ปจํ…์ธ  C1์€ ์‹œ์Šคํ…œ DRM1์˜ **๋Œ€์นญํ‚ค K1**์œผ๋กœ ์•”ํ˜ธํ™”๋˜์–ด **์•”ํ˜ธํ™”๋œ ์ปจํ…์ธ  C'1**์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ![drm general flow](/i/drm_general_flow.jpeg "drm general flow") ๋””๋ฐ”์ด์Šค D1์˜ ํ”Œ๋ ˆ์ด์–ด P1์€ **๊ฐœ์ธํ‚ค PRK1**(์ด ํ‚ค๋Š” ๋ณดํ˜ธ๋˜์–ด ์žˆ์œผ๋ฉฐ1 **D1**๋งŒ ์•Œ๊ณ  ์žˆ์Œ)์™€ **๊ณต๊ฐœํ‚ค PUK1**๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํ‚ค(๋น„๋Œ€์นญ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. > **1๋ณดํ˜ธ๋จ**: [๋ธ”๋ž™๋ฐ•์Šค](https://en.wikipedia.org/wiki/Black_box)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๋‚ด๋ถ€์˜ ํŠน๋ณ„ํ•œ(์ฝ๊ธฐ ์ „์šฉ) ์นฉ์— ์ €์žฅ๋œ ํ‚ค๋กœ ํ•ด๋…์„ ์ œ๊ณตํ•˜๋Š” **ํ•˜๋“œ์›จ์–ด๋ฅผ ํ†ตํ•œ** ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ํ˜น์€ DRM ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” **์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•œ**(๋œ ์•ˆ์ „ํ•จ) ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณดํ˜ธ๋Š” ํ•ด๋‹น ๋””๋ฐ”์ด์Šค๊ฐ€ ์–ด๋–ค ๋ฐฉ๋ฒ•(ํ•˜๋“œ์›จ์–ด์ , ์†Œํ”„ํŠธ์›จ์–ด์ )์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **ํ”Œ๋ ˆ์ด์–ด P1์ด ์ปจํ…์ธ  C'1์„ ๋ณด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ**, ๊ณต๊ฐœํ‚ค **PUK1**๋ฅผ ๋ถ€์—ฌํ•œ **DRM ์‹œ์Šคํ…œ DRM1**๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. DRM์‹œ์Šคํ…œ DRM1๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๊ณต๊ฐœํ‚ค **PUK1**๋ฅผ ๊ฐ€์ง€๊ณ  **์•”ํ˜ธํ™”๋œ ํ‚ค K1**์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์ด ์‘๋‹ต์€ **D1๋งŒ์ด ํ•ด๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. `K1P1D1 = enc(K1, PUK1)` **P1**์€ DRM ๋กœ์ปฌ ์‹œ์Šคํ…œ([SOC](https://en.wikipedia.org/wiki/System_on_a_chip)๊ฐ€ ํ•ด๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํ™”๋œ ํ•˜๋“œ์›จ์–ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด)์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์‹œ์Šคํ…œ์€ ๊ฐœ์ธํ‚ค PRK1์„ ์‚ฌ์šฉํ•œ ์ปจํ…์ธ ๋ฅผ **ํ•ด๋… ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. **K1P1D1๋กœ๋ถ€ํ„ฐ ๋น„๋Œ€์นญ ํ‚ค K1**๋ฅผ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ **C'1์„ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๊ฐ€์žฅ ์ข‹์€ ์ ์€ RAM์„ ํ†ตํ•ด ์ด ํ‚ค๋“ค์ด ๋…ธ์ถœ์ด ๋˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๊ฒƒ์ด์ง€์š”. ``` K1 = dec(K1P1D1, PRK1) P1.play(dec(C'1, K1)) ``` ![drm decoder flow](/i/drm_decoder_flow.jpeg "drm decoder flow") # How to use jupyter Make sure you have **docker installed** and just run `./s/start_jupyter.sh` and follow the instructions on the terminal. # Conferences * [DEMUXED](https://demuxed.com/) - you can [check the last 2 events presentations.](https://www.youtube.com/channel/UCIc_DkRxo9UgUSTvWVNCmpA). # References The richest content is here, it's where all the info we saw in this text was extracted, based or inspired by. You can deepen your knowledge with these amazing links, books, videos and etc. Online Courses and Tutorials: * https://www.coursera.org/learn/digital/ * https://people.xiph.org/~tterribe/pubs/lca2012/auckland/intro_to_video1.pdf * https://xiph.org/video/vid1.shtml * https://xiph.org/video/vid2.shtml * http://slhck.info/ffmpeg-encoding-course * http://www.cambridgeincolour.com/tutorials/camera-sensors.htm * http://www.slideshare.net/vcodex/a-short-history-of-video-coding * http://www.slideshare.net/vcodex/introduction-to-video-compression-13394338 * https://developer.android.com/guide/topics/media/media-formats.html * http://www.slideshare.net/MadhawaKasun/audio-compression-23398426 * http://inst.eecs.berkeley.edu/~ee290t/sp04/lectures/02-Motion_Compensation_girod.pdf Books: * https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/ref=sr_1_1?s=books&ie=UTF8&qid=1486395327&sr=1-1 * https://www.amazon.com/H-264-Advanced-Video-Compression-Standard/dp/0470516925 * https://www.amazon.com/Practical-Guide-Video-Audio-Compression/dp/0240806301/ref=sr_1_3?s=books&ie=UTF8&qid=1486396914&sr=1-3&keywords=A+PRACTICAL+GUIDE+TO+VIDEO+AUDIO * https://www.amazon.com/Video-Encoding-Numbers-Eliminate-Guesswork/dp/0998453005/ref=sr_1_1?s=books&ie=UTF8&qid=1486396940&sr=1-1&keywords=jan+ozer Bitstream Specifications: * http://www.itu.int/rec/T-REC-H.264-201610-I * http://www.itu.int/ITU-T/recommendations/rec.aspx?rec=12904&lang=en * https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf * http://iphome.hhi.de/wiegand/assets/pdfs/2012_12_IEEE-HEVC-Overview.pdf * http://phenix.int-evry.fr/jct/doc_end_user/current_document.php?id=7243 * http://gentlelogic.blogspot.com.br/2011/11/exploring-h264-part-2-h264-bitstream.html * https://forum.doom9.org/showthread.php?t=167081 * https://forum.doom9.org/showthread.php?t=168947 Software: * https://ffmpeg.org/ * https://ffmpeg.org/ffmpeg-all.html * https://ffmpeg.org/ffprobe.html * https://trac.ffmpeg.org/wiki/ * https://software.intel.com/en-us/intel-video-pro-analyzer * https://medium.com/@mbebenita/av1-bitstream-analyzer-d25f1c27072b#.d5a89oxz8 Non-ITU Codecs: * https://aomedia.googlesource.com/ * https://github.com/webmproject/libvpx/tree/master/vp9 * https://people.xiph.org/~xiphmont/demo/daala/demo1.shtml * https://people.xiph.org/~jm/daala/revisiting/ * https://www.youtube.com/watch?v=lzPaldsmJbk * https://fosdem.org/2017/schedule/event/om_av1/ Encoding Concepts: * http://x265.org/hevc-h265/ * http://slhck.info/video/2017/03/01/rate-control.html * http://slhck.info/video/2017/02/24/vbr-settings.html * http://slhck.info/video/2017/02/24/crf-guide.html * https://arxiv.org/pdf/1702.00817v1.pdf * https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors * http://web.ece.ucdavis.edu/cerl/ReliableJPEG/Cung/jpeg.html * http://www.adobe.com/devnet/adobe-media-server/articles/h264_encoding.html * https://prezi.com/8m7thtvl4ywr/mp3-and-aac-explained/ * https://blogs.gnome.org/rbultje/2016/12/13/overview-of-the-vp9-video-codec/ Video Sequences for Testing: * http://bbb3d.renderfarming.net/download.html * https://www.its.bldrdoc.gov/vqeg/video-datasets-and-organizations.aspx Miscellaneous: * http://stackoverflow.com/a/24890903 * http://stackoverflow.com/questions/38094302/how-to-understand-header-of-h264 * http://techblog.netflix.com/2016/08/a-large-scale-comparison-of-x264-x265.html * http://vanseodesign.com/web-design/color-luminance/ * http://www.biologymad.com/nervoussystem/eyenotes.htm * http://www.compression.ru/video/codec_comparison/h264_2012/mpeg4_avc_h264_video_codecs_comparison.pdf * http://www.csc.villanova.edu/~rschumey/csc4800/dct.html * http://www.explainthatstuff.com/digitalcameras.html * http://www.hkvstar.com * http://www.hometheatersound.com/ * http://www.lighterra.com/papers/videoencodingh264/ * http://www.red.com/learn/red-101/video-chroma-subsampling * http://www.slideshare.net/ManoharKuse/hevc-intra-coding * http://www.slideshare.net/mwalendo/h264vs-hevc * http://www.slideshare.net/rvarun7777/final-seminar-46117193 * http://www.springer.com/cda/content/document/cda_downloaddocument/9783642147029-c1.pdf * http://www.streamingmedia.com/Articles/Editorial/Featured-Articles/A-Progress-Report-The-Alliance-for-Open-Media-and-the-AV1-Codec-110383.aspx * http://www.streamingmediaglobal.com/Articles/ReadArticle.aspx?ArticleID=116505&PageNum=1 * http://yumichan.net/video-processing/video-compression/introduction-to-h264-nal-unit/ * https://cardinalpeak.com/blog/the-h-264-sequence-parameter-set/ * https://cardinalpeak.com/blog/worlds-smallest-h-264-encoder/ * https://codesequoia.wordpress.com/category/video/ * https://developer.apple.com/library/content/technotes/tn2224/_index.html * https://en.wikibooks.org/wiki/MeGUI/x264_Settings * https://en.wikipedia.org/wiki/Adaptive_bitrate_streaming * https://en.wikipedia.org/wiki/AOMedia_Video_1 * https://en.wikipedia.org/wiki/Chroma_subsampling#/media/File:Colorcomp.jpg * https://en.wikipedia.org/wiki/Cone_cell * https://en.wikipedia.org/wiki/File:H.264_block_diagram_with_quality_score.jpg * https://en.wikipedia.org/wiki/Inter_frame * https://en.wikipedia.org/wiki/Intra-frame_coding * https://en.wikipedia.org/wiki/Photoreceptor_cell * https://en.wikipedia.org/wiki/Pixel_aspect_ratio * https://en.wikipedia.org/wiki/Presentation_timestamp * https://en.wikipedia.org/wiki/Rod_cell * https://it.wikipedia.org/wiki/File:Pixel_geometry_01_Pengo.jpg * https://leandromoreira.com.br/2016/10/09/how-to-measure-video-quality-perception/ * https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping * https://softwaredevelopmentperestroika.wordpress.com/2014/02/11/image-processing-with-python-numpy-scipy-image-convolution/ * https://tools.ietf.org/html/draft-fuldseth-netvc-thor-03 * https://www.encoding.com/android/ * https://www.encoding.com/http-live-streaming-hls/ * https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm * https://www.lifewire.com/cmos-image-sensor-493271 * https://www.linkedin.com/pulse/brief-history-video-codecs-yoav-nativ * https://www.linkedin.com/pulse/video-streaming-methodology-reema-majumdar * https://www.vcodex.com/h264avc-intra-precition/ * https://www.youtube.com/watch?v=9vgtJJ2wwMA * https://www.youtube.com/watch?v=LFXN9PiOGtY * https://www.youtube.com/watch?v=Lto-ajuqW3w&list=PLzH6n4zXuckpKAj1_88VS-8Z6yn9zX_P6 * https://www.youtube.com/watch?v=LWxu4rkZBLw * https://web.stanford.edu/class/ee398a/handouts/lectures/EE398a_MotionEstimation_2012.pdf