1. 소개
이 섹션은 규범적이지 않습니다이 명세는 사용자 에이전트의 오디오 및 비디오 디코딩/인코딩 기능을 질의하는 API를 정의합니다. API는 미디어의 코덱, 프로필, 해상도, 비트레이트 등과 같은 정보를 기반으로 동작합니다. API는 해당 구성(configuration)이 지원되는지, 그리고 재생이 부드럽거나/또는 전력 효율적일 것으로 예상되는지 여부를 나타냅니다.
이 명세는 인코딩 및 디코딩 기능에 중점을 두고 있습니다. 디스플레이의 색 영역이나 다이나믹 레인지 지원과 같은 디스플레이 속성 정보를 제공하는 다른 웹 API와 함께 사용할 것으로 예상되며, 이를 통해 웹 애플리케이션은 디스플레이에 적합한 콘텐츠를 선택할 수 있고 예를 들어 SDR 디스플레이에 HDR 콘텐츠를 제공하는 것을 피할 수 있습니다.
2. 디코딩 및 인코딩 기능
2.1. 미디어 구성
2.1.1. MediaConfiguration
dictionary {
MediaConfiguration VideoConfiguration ;
video AudioConfiguration ; };
audio
dictionary :
MediaDecodingConfiguration MediaConfiguration {required MediaDecodingType ;
type MediaCapabilitiesKeySystemConfiguration ; };
keySystemConfiguration
dictionary :
MediaEncodingConfiguration MediaConfiguration {required MediaEncodingType ; };
type
디코딩 기능의 입력은 MediaDecodingConfiguration
딕셔너리로 표현되며, 인코딩 기능의 입력은 MediaEncodingConfiguration
딕셔너리로 표현됩니다.
MediaConfiguration
이 유효한
MediaConfiguration이 되려면, 아래의 모든 조건이 참이어야 합니다:
-
audio
및/또는video
가 존재해야 합니다. -
audio
가 유효한 오디오 구성이어야 하며 존재할 경우에만 해당합니다. -
video
가 유효한 비디오 구성이어야 하며 존재할 경우에만 해당합니다.
MediaDecodingConfiguration
이 유효한
MediaDecodingConfiguration이 되려면, 아래의 모든 조건이 참이어야 합니다:
- 유효한 MediaConfiguration이어야 합니다.
-
keySystemConfiguration
이 존재할 경우:
MediaDecodingConfiguration
이 [ENCRYPTED-MEDIA]를 설명하려면,
keySystemConfiguration
이 존재해야 합니다.
2.1.2. MediaDecodingType
enum {
MediaDecodingType "file" ,"media-source" ,"webrtc" };
MediaDecodingConfiguration
은 세 가지 타입이 있습니다:
file
은 [media-source]에 정의된MediaSource
또는 [webrtc]에 정의된RTCPeerConnection
이외의 미디어 소스 재생을 위한 구성을 나타냅니다.media-source
는MediaSource
재생을 위한 구성을 나타냅니다.webrtc
는RTCPeerConnection
으로 수신되는 구성을 나타냅니다.
2.1.3. MediaEncodingType
enum {
MediaEncodingType "record" ,"webrtc" };
MediaEncodingConfiguration
은 두 가지 타입 중 하나를 가질 수 있습니다:
record
는 미디어 녹화를 위한 구성을 나타내며, 예: [mediastream-recording]에 정의된MediaRecorder
사용webrtc
는 [webrtc]에 정의된RTCPeerConnection
으로 송신되는 구성을 나타냅니다.
2.1.4. VideoConfiguration
dictionary {
VideoConfiguration required DOMString contentType ;required unsigned long width ;required unsigned long height ;required unsigned long long bitrate ;required double framerate ;boolean hasAlphaChannel ;HdrMetadataType hdrMetadataType ;ColorGamut colorGamut ;TransferFunction transferFunction ;DOMString scalabilityMode ;boolean spatialScalability ; };
contentType
멤버는
비디오 트랙의 MIME 타입을 나타냅니다.
VideoConfiguration
configuration이
유효한
비디오 구성인지 확인하려면 다음 단계를 실행해야 합니다:
-
framerate
값이 유한하지 않거나 0보다 작거나 같으면false
를 반환하고 단계를 종료합니다. -
MediaDecodingType
또는MediaEncodingType
에 적용되지 않는 선택적 멤버가 지정된 경우,false
를 반환하고 단계를 종료합니다. 적용 가능성 규칙은 아래 멤버 정의를 참조하세요. -
mimeType을 configuration의
contentType
을 사용하여 MIME 타입 파싱을 실행한 결과로 설정합니다. -
mimeType이
failure
이면false
를 반환합니다. -
mimeType과
video
를 사용하여 MIME 타입 유효성 검사를 실행한 결과를 반환합니다.
width
와
height
멤버는 각각 인코딩된 비디오
프레임의 가시적인 가로 및 세로 픽셀 수를 나타냅니다.
bitrate
멤버는 비디오 트랙의
비트레이트(초당 비트 단위)를 나타냅니다.
고정 비트레이트(CBR)로 인코딩된 경우 비디오 트랙의 평균 비트레이트를 나타냅니다.
가변 비트레이트(VBR)의 경우, 이 값은 비디오 트랙의 최대 비트레이트를 나타냅니다.
framerate
멤버는 비디오 트랙의
프레임률을 나타냅니다.
프레임률은 1초 동안 사용되는 프레임 수(초당 프레임)로, double로 표현됩니다.
hasAlphaChannel
멤버는 비디오 트랙에 알파 채널 정보가 포함되어 있는지 나타냅니다.
true면 디코딩 시 인코딩된 비디오 스트림에서 픽셀 단위 알파 채널 정보를 생성할 수 있습니다.
false면 생성할 수 없습니다. undefined면 UA가 contentType
에
따라 알파 채널 정보를 추정해야 하며,
불가능하면 알파 채널 정보를 생성할 수 없다고 간주해야 합니다.
hdrMetadataType
멤버가 있으면
비디오 트랙에 특정 HDR 메타데이터 타입이 포함되어 있음을 나타냅니다. UA는 HDR 콘텐츠를 출력 장치의 색상 볼륨과 휘도에 맞게 톤 매핑할 수 있도록 해당 HDR
타입을 해석할 수 있어야 합니다.
유효한 입력값은 HdrMetadataType
에
정의됩니다.
hdrMetadataType은 MediaDecodingConfiguration
에서
media-source
또는
file
타입에만 적용됩니다.
colorGamut
멤버가 있으면
비디오 트랙이 지정된 색 영역으로 제공됨을 나타냅니다. 색 영역은 콘텐츠가 표시될 색상 집합을 설명합니다.
출력 장치가 해당 색상을 지원하면 UA는 적절한 색상을 출력 장치에 렌더링할 수 있어야 하며, 지원하지 않으면 UA가 출력 장치가 지원하는 색으로 매핑할 수 있어야 합니다.
유효한 입력값은 ColorGamut
에
정의됩니다.
colorGamut은 MediaDecodingConfiguration
에서
media-source
또는
file
타입에만 적용됩니다.
transferFunction
멤버가 있으면
비디오 트랙이 UA가 해석해야 하는 특정 전달 함수(transfer function)가 필요함을 나타냅니다. 전달 함수는 디스플레이와 관계없이,
미디어의 소스 색상을 디코딩 후 출력할 색상으로 매핑하는 사용자 에이전트의 렌더링 기능에서 지원하는 전기-광학 알고리즘을 설명합니다.
유효한 입력값은 TransferFunction
에
정의됩니다.
transferFunction은 MediaDecodingConfiguration
에서
media-source
또는
file
타입에만 적용됩니다.
scalabilityMode
멤버가 있으면
[webrtc-svc]에 정의된 확장성 모드를
나타냅니다.
없으면 이 contentType
에
대해 구현자 정의 기본 모드가 적용됩니다(즉, setParameters()
로
명시하지 않은 경우의 모드).
scalabilityMode는 MediaEncodingConfiguration
에서
webrtc
타입에만 적용됩니다.
scalabilityMode
가
여러 공간 계층(spatial layers)이 있음을 나타내는 경우,
width
와
height
값은
VideoConfiguration
에서
인코딩된 가장 큰 공간 계층에 해당합니다.
spatialScalability
멤버가 있으면
해상도가 다른 프레임을 의존성으로 사용하는 공간 예측 기능을 나타냅니다. 없으면 spatialScalability
의
기본값은 false
입니다.
spatialScalability
가
true
면,
디코더는 인코더가 해당 코덱에 대해 인코딩할 수 있는 모든 scalabilityMode
를
디코딩할 수 있습니다.
spatialScalability
가
false
면,
디코더는 공간 확장성 모드를 디코딩할 수 없지만, 인코더가 인코딩할 수 있는 다른 모든 scalabilityMode
값은 디코딩할 수 있습니다.
spatialScalability
는
MediaDecodingConfiguration
에서
media-source
,
file
,
webrtc
타입에만 적용됩니다.
2.1.5. HdrMetadataType
enum {
HdrMetadataType "smpteSt2086" ,"smpteSt2094-10" ,"smpteSt2094-40" };
만약 존재한다면, HdrMetadataType
는 명시된 타입의 HDR 메타데이터를 해석할 수 있는 기능을 설명합니다.
VideoConfiguration
은 아래 타입 중 하나를 포함할 수 있습니다:
-
smpteSt2086
, [SMPTE-ST-2086]에 의해 정의된 정적 메타데이터 타입을 나타냅니다. -
smpteSt2094-10
, [SMPTE-ST-2094]에 의해 정의된 동적 메타데이터 타입을 나타냅니다. -
smpteSt2094-40
, [SMPTE-ST-2094]에 의해 정의된 동적 메타데이터 타입을 나타냅니다.
2.1.6. ColorGamut
enum {
ColorGamut "srgb" ,"p3" ,"rec2020" };
VideoConfiguration
은 아래 타입 중 하나를 포함할 수 있습니다:
2.1.7. TransferFunction
enum {
TransferFunction "srgb" ,"pq" ,"hlg" };
VideoConfiguration
은 아래 타입 중 하나를 포함할 수 있습니다:
-
srgb
, [sRGB]에 의해 정의된 트랜스퍼 함수(transfer function)를 나타냅니다. -
pq
, [SMPTE-ST-2084]에 의해 정의된 "Perceptual Quantizer" 트랜스퍼 함수를 나타냅니다. -
hlg
, BT.2100에 의해 정의된 "Hybrid Log Gamma" 트랜스퍼 함수를 나타냅니다.
2.1.8. AudioConfiguration
dictionary {
AudioConfiguration required DOMString contentType ;DOMString channels ;unsigned long long bitrate ;unsigned long samplerate ;boolean spatialRendering ; };
contentType
멤버는 오디오
트랙의 MIME 타입을 나타냅니다.
AudioConfiguration
configuration이
유효한
오디오 구성인지 확인하려면, 다음 단계를 반드시 실행해야 합니다:
-
mimeType을 MIME 타입 파싱을 configuration의
contentType
값으로 실행하여 얻습니다. -
mimeType이
failure
라면false
를 반환합니다. -
MIME 타입 유효성 검사를
mimeType과
audio
로 실행한 결과를 반환합니다.
channels
멤버는 오디오 트랙에서
사용되는 오디오 채널을 나타냅니다. channels는 디코딩 타입 media-source
,
file
,
webrtc
그리고 인코딩 타입
webrtc
에만 적용됩니다.
channels
는 double
(2.1, 4.1, 5.1, ...), unsigned short
(채널 개수) 또는
enum
값으로 정의되어야 합니다. 현재 정의는 임시입니다.
bitrate
멤버는 오디오 트랙의 평균
비트레이트를 나타냅니다. 비트레이트는 오디오 트랙 1초를 인코딩하는 데 사용되는 비트 수입니다.
samplerate
멤버는 오디오 트랙의 샘플레이트를 나타냅니다. 샘플레이트는 1초당 전달되는 오디오 샘플의 수입니다. samplerate는 디코딩 타입 media-source
,
file
,
webrtc
그리고 인코딩 타입
webrtc
에만 적용됩니다.
samplerate
는 Hz
(즉, 초당 오디오 샘플 수) 단위로 표현됩니다. 때때로 samplerate 값은 kHz
단위로 표현되기도 하며, 이는
초당 수천 개의 오디오 샘플을 나타냅니다.
44100 Hz
는 44.1 kHz
와 동일합니다.
spatialRendering
멤버는 오디오가 공간적으로 렌더링되어야 함을 나타냅니다. 공간 렌더링의 세부 사항은
contentType
에서 추론되어야 합니다. 만약 존재하지 않는다면, UA는 공간 렌더링이 필요하지 않다고 가정해야 합니다. true
일 때,
사용자 에이전트는 오디오 출력 장치에서 공간 렌더링을 실패 없이 지원할 수 있을 때에만 이 구성을 지원됨
으로 보고해야 하며, 공간적 믹스가 아닌 스트림으로 폴백하지 않아야 합니다. spatialRendering
은 MediaDecodingConfiguration
중 media-source
와 file
타입에만 적용됩니다.
2.1.9. MediaCapabilitiesKeySystemConfiguration
dictionary {
MediaCapabilitiesKeySystemConfiguration required DOMString keySystem ;DOMString initDataType = "";MediaKeysRequirement distinctiveIdentifier = "optional";MediaKeysRequirement persistentState = "optional";sequence <DOMString >sessionTypes ;KeySystemTrackConfiguration audio ;KeySystemTrackConfiguration video ; };
이 딕셔너리는
[ENCRYPTED-MEDIA] (EME)에서 정의된 여러 타입을 참조합니다. EME 타입의 시퀀스는,
시퀀스의 목적이 requestMediaKeySystemAccess()
가 지원하는 서브셋을 선택하기 위한 것이라면, 단일 값으로 평탄화됩니다.
MediaCapabilities에서는 호출자가 여러 번 호출하여 시퀀스를 제공하고, 궁극적으로 어떤 구성을 사용할지 호출자가 선택할 수 있도록 합니다.
keySystem
멤버는 keySystem
이름을 나타내며, [ENCRYPTED-MEDIA]에 설명되어 있습니다.
initDataType
멤버는 initDataTypes
시퀀스에서 단일 값을 나타냅니다.
[ENCRYPTED-MEDIA]에 설명되어 있습니다.
distinctiveIdentifier
멤버는 distinctiveIdentifier
요구조건을 나타내며,
[ENCRYPTED-MEDIA]에 설명되어 있습니다.
persistentState
멤버는 persistentState
요구조건을 나타내며,
[ENCRYPTED-MEDIA]에 설명되어 있습니다.
sessionTypes
멤버는 sessionTypes
에 설명된 필수 시퀀스를 나타냅니다.
[ENCRYPTED-MEDIA]를 참고하세요.
audio
멤버는
KeySystemTrackConfiguration
과 연결된 AudioConfiguration
을 나타냅니다.
video
멤버는
KeySystemTrackConfiguration
과 연결된 VideoConfiguration
을 나타냅니다.
2.1.10. KeySystemTrackConfiguration
dictionary {
KeySystemTrackConfiguration DOMString robustness = "";DOMString ?encryptionScheme =null ; };
robustness
멤버는 robustness
수준을 나타내며,
[ENCRYPTED-MEDIA]에서 설명됩니다.
encryptionScheme
멤버는 encryptionScheme
를 나타내며,
[ENCRYPTED-MEDIA-DRAFT]에서 설명됩니다.
2.2. 미디어 기능 정보
dictionary {
MediaCapabilitiesInfo required boolean supported ;required boolean smooth ;required boolean powerEfficient ; };
dictionary :
MediaCapabilitiesDecodingInfo MediaCapabilitiesInfo {required MediaKeySystemAccess ?keySystemAccess ;required MediaDecodingConfiguration configuration ; };
dictionary :
MediaCapabilitiesEncodingInfo MediaCapabilitiesInfo {required MediaEncodingConfiguration configuration ; };
MediaCapabilitiesInfo
는 supported
, smooth
, powerEfficient
필드를 가지며, 이들은 불리언 값입니다.
인코딩 또는 디코딩이 전력 효율적이라고 간주되는 경우는 전력 소비가 최적일 때입니다. 인코딩 또는 디코딩의 최적 전력 소비 정의는 사용자 에이전트에 맡깁니다. 하지만 일반적인 구현 전략은 하드웨어 사용을 최적 전력 소비의 지표로 간주하는 것입니다. 사용자 에이전트는 하드웨어 인코딩 또는 디코딩을 기본적으로 전력 효율적이라고 표시해서는 안 됩니다. 하드웨어 가속이 아닌 코덱도 특히 저해상도 영상에서는 충분히 효율적일 수 있기 때문입니다. 사용자 에이전트는 인코딩 전력 효율성을 판단할 때 기기의 전원 공급원을 고려해서는 안 되며, 단 전원 공급원이 인코딩 또는 디코딩 모듈을 변경시키는 등 부수 효과가 있을 경우에는 고려해야 합니다.
MediaCapabilitiesDecodingInfo
는 keySystemAccess
를 가지며,
MediaKeySystemAccess
또는 null
일 수 있습니다.
암호화된 디코딩 구성이 지원되는 경우,
반환되는 MediaCapabilitiesInfo
에는
MediaKeySystemAccess
가 포함됩니다.
저자는 이를 사용하여
MediaKeys
를 생성하고 암호화된 재생을 설정할 수 있습니다.
MediaCapabilitiesDecodingInfo
는 configuration
을 가지며,
이는 MediaCapabilitiesDecodingInfo
를 생성하는 데 사용된 디코딩 구성 속성입니다.
MediaCapabilitiesEncodingInfo
는 configuration
을 가지며,
이는 MediaCapabilitiesEncodingInfo
를 생성하는 데 사용된 인코딩 구성 속성입니다.
2.3. 알고리즘
2.3.1. MediaCapabilitiesEncodingInfo 생성
MediaCapabilitiesEncodingInfo
생성을 위해,
MediaEncodingConfiguration
configuration이 주어졌을 때 다음 단계를 실행한다. 이들은 MediaCapabilitiesEncodingInfo
를
반환한다:
-
info를 새로운
MediaCapabilitiesEncodingInfo
인스턴스로 한다. 별도의 언급이 없다면 이후 단계에서 info를 읽고 쓴다. -
configuration
을 새로운MediaEncodingConfiguration
으로 설정한다. configuration의 각각의 속성에 대해 같은 이름과 값을 가진 새로운 속성을configuration
에 생성한다. -
videoSupported를
unknown
으로 한다. -
video
가 configuration에 존재하면, 다음 단계를 실행한다:-
videoMimeType을 MIME 타입 파싱을 configuration의
contentType
으로 실행한 결과로 한다. -
videoSupported를 MIME 타입 지원 여부 확인을
videoMimeType과
configuration의
type
으로 실행한 결과로 한다.
-
videoMimeType을 MIME 타입 파싱을 configuration의
-
audioSupported를
unknown
으로 한다. -
audio
가 configuration에 존재하면, 다음 단계를 실행한다:-
audioMimeType을 MIME 타입 파싱을 configuration의
contentType
으로 실행한 결과로 한다. -
audioSupported를 MIME 타입 지원 여부 확인을
audioMimeType과
configuration의
type
으로 실행한 결과로 한다.
-
audioMimeType을 MIME 타입 파싱을 configuration의
-
videoSupported 또는 audioSupported가
unsupported
인 경우supported
를false
,smooth
를false
,powerEfficient
를false
로 설정하고 info를 반환한다. -
그 외의 경우
supported
를true
로 설정한다. -
사용자 에이전트가 configuration이 나타내는 미디어를 지정된 프레임레이트로 인코딩할 수 있다면
smooth
를true
로 설정한다. 그렇지 않으면false
로 설정한다. -
사용자 에이전트가 configuration이 나타내는 미디어를 전력 효율적으로 인코딩할 수 있다면
powerEfficient
를true
로 설정한다. 그렇지 않으면false
로 설정한다. - info를 반환한다.
2.3.2. MediaCapabilitiesDecodingInfo 생성
MediaCapabilitiesDecodingInfo
생성을 위해,
MediaDecodingConfiguration
configuration이 주어졌을 때 다음 단계를 실행한다. 이들은 MediaCapabilitiesDecodingInfo
를
반환한다:
-
info를 새로운
MediaCapabilitiesDecodingInfo
인스턴스로 한다. 별도의 언급이 없다면 이후 단계에서 info를 읽고 쓴다. -
configuration
을 새로운MediaDecodingConfiguration
으로 설정한다. configuration의 각각의 속성에 대해 같은 이름과 값을 가진 새로운 속성을configuration
에 생성한다. -
configuration.keySystemConfiguration
이 존재하면:-
keySystemAccess
를 암호화된 디코딩 지원 확인 알고리즘을 configuration으로 실행한 결과로 설정한다. -
keySystemAccess
가null
이면supported
를false
,smooth
를false
,powerEfficient
를false
로 설정하고 info를 반환한다. -
그렇지 않으면
supported
를true
로 설정하고 6단계로 진행한다.
-
-
그 외의 경우 다음 단계를 실행한다:
-
keySystemAccess
를null
로 설정한다. -
videoSupported를
unknown
으로 한다. -
video
가 configuration에 존재하면, 다음 단계를 실행한다:-
videoMimeType을 MIME 타입 파싱을
configuration의
contentType
으로 실행한 결과로 한다. -
videoSupported를 MIME 타입 지원 여부
확인을 videoMimeType,
configuration의
type
, configuration의colorGamut
, configuration의transferFunction
으로 실행한 결과로 한다.
-
videoMimeType을 MIME 타입 파싱을
configuration의
-
audioSupported를
unknown
으로 한다. -
audio
가 configuration에 존재하면, 다음 단계를 실행한다:-
audioMimeType을 MIME 타입 파싱을
configuration의
contentType
으로 실행한 결과로 한다. -
audioSupported를 MIME 타입 지원 여부
확인을 audioMimeType과
configuration의
type
으로 실행한 결과로 한다.
-
audioMimeType을 MIME 타입 파싱을
configuration의
-
videoSupported 또는 audioSupported가
unsupported
인 경우supported
를false
,smooth
를false
,powerEfficient
를false
로 설정하고 info를 반환한다.
-
-
supported
를true
로 설정한다. -
사용자 에이전트가 configuration이 나타내는 미디어를 지정된 프레임레이트로 프레임 드롭 없이 디코딩할 수 있다면
smooth
를true
로 설정한다. 그렇지 않으면false
로 설정한다. -
사용자 에이전트가 configuration이 나타내는 미디어를 전력 효율적으로 디코딩할 수 있다면
powerEfficient
를true
로 설정한다. 그렇지 않으면false
로 설정한다. - info를 반환한다.
2.3.3. MIME 타입 유효성 검사
MIME 타입 유효성 검사를 위해 MIME 타입 레코드 mimeType과 문자열 media가 주어졌을 때 다음 단계를 실행한다:
-
[RFC9110]
기준에서 mimeType의 타입이 media 또는
application
이 아니면false
를 반환한다. -
mimeType의
type
과subtype
멤버가 단일 미디어 코덱을 허용하고parameters
멤버가 비어 있지 않으면false
를 반환한다. -
mimeType의
type
과subtype
멤버가 다중 미디어 코덱을 허용한다면 다음 단계를 실행한다:-
mimeType의
parameters
멤버에 "codecs"라는 단일 키가 없으면false
를 반환한다.단일 미디어 코덱이 나열되는 것이 왜 중요한가? [Issue #235]
-
mimeType.parameters["codecs"]
값이 단일 미디어 코덱을 설명하지 않으면false
를 반환한다.
-
mimeType의
-
true
를 반환한다.
이 논리가
webrtc
에도 적용되는가? [Issue #238]
2.3.4. MIME 타입 지원 여부 확인
MIME 타입 지원 여부 확인을 실행하려면,
MIME type record mimeType,
MediaEncodingType
또는 MediaDecodingType
encodingOrDecodingType, 선택적 colorGamut (colorGamut
),
그리고 선택적 transferFunction
(transferFunction
)
이 주어질 때, 다음 단계를 수행한다. MIME 타입이
사용자 에이전트에 의해 지원된다면 supported
를,
지원되지 않으면 unsupported
를 반환한다:
-
encodingOrDecodingType이
webrtc
(MediaEncodingType
) 또는webrtc
(MediaDecodingType
) 이고, mimeType이 RTP에서 사용하는 타입이 아니면 ([IANA-MEDIA-TYPES] [RFC6838] 참고),unsupported
를 반환한다.코덱 이름은 보통 subtype에 명시되며, 코덱에 따라 0개 이상의 파라미터가 있을 수 있다.
-
colorGamut이 있고, mimeType에 올바르지 않으면
unsupported
를 반환한다. -
transferFunction이 있고, mimeType에 올바르지 않으면
unsupported
를 반환한다.사용자 에이전트는 mimeType에서 명명된 비디오 코덱의 명세를 참고하여 colorGamut과 transferFunction의 올바른 값을 결정해야 한다.
여기의 검증 단계에서 상호운용성을 어떻게 보장할 수 있을까? [Issue #245]
-
mimeType이 사용자 에이전트에 의해 지원되지 않으면
unsupported
를 반환한다. -
supported
를 반환한다.
2.3.5. 암호화된 디코딩 지원 확인
암호화된 디코딩 지원 확인을 실행하려면
MediaDecodingConfiguration
config가 주어지고, keySystemConfiguration
이 존재하면, 다음 단계를 수행한다. 결과는 MediaKeySystemAccess
또는 null
이다:
-
keySystem
멤버가config.keySystemConfiguration
에 있고, Key Systems 중 사용자 에이전트가 지원하는 시스템이 아니면null
을 반환한다. 문자열 비교는 대소문자 구분. -
origin을 호출 컨텍스트의 origin으로 한다.
Document
기준. -
implementation을
config.keySystemConfiguration.keySystem
의 구현체로 한다. -
emeConfiguration을 새로운
MediaKeySystemConfiguration
으로 하고 다음과 같이 초기화한다:-
initDataTypes
속성을config.keySystemConfiguration.initDataType
을 포함하는 시퀀스로 설정한다. -
distinctiveIdentifier
속성을config.keySystemConfiguration.distinctiveIdentifier
로 설정한다. -
persistentState
속성을config.keySystemConfiguration.peristentState
로 설정한다. -
sessionTypes
속성을config.keySystemConfiguration.sessionTypes
로 설정한다. -
audio
가 config에 존재하면,audioCapabilities
속성을 단일MediaKeySystemMediaCapability
로 이루어진 시퀀스로 설정하며, 다음과 같이 초기화한다:-
contentType
속성을config.audio.contentType
로 설정한다. -
config.keySystemConfiguration.audio
가 존재하면:-
config.keySystemConfiguration.audio.robustness
가 존재하고null
이 아니면,robustness
속성을config.keySystemConfiguration.audio.robustness
로 설정한다. -
encryptionScheme
속성을config.keySystemConfiguration.audio.encryptionScheme
로 설정한다.
-
-
-
video
가 config에 존재하면, videoCapabilities 속성을 단일MediaKeySystemMediaCapability
로 이루어진 시퀀스로 설정하며, 다음과 같이 초기화한다:-
contentType
속성을config.video.contentType
로 설정한다. -
config.keySystemConfiguration.video
가 존재하면:-
config.keySystemConfiguration.video.robustness
가 존재하고null
이 아니면,robustness
속성을config.keySystemConfiguration.video.robustness
로 설정한다. -
encryptionScheme
속성을config.keySystemConfiguration.video.encryptionScheme
로 설정한다.
-
-
-
- supported configuration을 Get Supported Configuration 알고리즘([ENCRYPTED-MEDIA])을 implementation, emeConfiguration, origin에 대해 실행한 결과로 한다.
-
supported configuration이
NotSupported
이면null
을 반환한다. -
access를 새로운
MediaKeySystemAccess
객체로 하고, 다음과 같이 초기화한다:-
keySystem
속성을emeConfiguration.keySystem
로 설정한다. - configuration 값을 supported configuration으로 한다.
- cdm implementation 값을 implementation으로 한다.
-
- access를 반환한다.
2.4. Navigator 및 WorkerNavigator 확장
[Exposed =Window ]partial interface Navigator { [SameObject ]readonly attribute MediaCapabilities ; };
mediaCapabilities
[Exposed =Worker ]partial interface WorkerNavigator { [SameObject ]readonly attribute MediaCapabilities ; };
mediaCapabilities
2.5. 미디어 기능 인터페이스
[Exposed =(Window ,Worker )]interface { [
MediaCapabilities NewObject ]Promise <MediaCapabilitiesDecodingInfo >(
decodingInfo MediaDecodingConfiguration ); [
configuration NewObject ]Promise <MediaCapabilitiesEncodingInfo >(
encodingInfo MediaEncodingConfiguration ); };
configuration
2.5.1. 미디어 기능 작업 소스
이 명세에서 언급된 작업의 작업 소스는 미디어 기능 작업 소스입니다.
알고리즘이 미디어 기능 작업을 큐에 추가할 때 T, 사용자 에이전트는 글로벌 작업을 큐에 추가 T를 미디어 기능 작업 소스에, 글로벌 객체를 현재 realm 레코드를 사용하여 추가해야 합니다.
2.5.2. decodingInfo() 메서드
decodingInfo()
메서드는 다음 단계들을 반드시 실행해야 합니다:
-
configuration이 유효한 MediaDecodingConfiguration이
아니면,
새로 생성된
TypeError
로 reject된 Promise를 반환합니다. -
configuration.keySystemConfiguration
이 존재한다면, 다음 하위 단계를 실행합니다:-
글로벌 객체가
WorkerGlobalScope
타입인 경우, 새로 생성된DOMException
의 이름이InvalidStateError
인 Promise를 반환합니다. -
글로벌 객체의 관련 설정 객체가
비보안 컨텍스트라면,
새로 생성된
DOMException
의 이름이SecurityError
인 Promise를 반환합니다.
-
글로벌 객체가
- p를 새 Promise로 할당합니다.
-
다음 단계들을 병렬로 실행합니다:
- Create a MediaCapabilitiesDecodingInfo 알고리즘을 configuration을 사용하여 실행합니다.
- 미디어 기능 작업을 큐에 추가하여 p를 결과값으로 resolve합니다.
- p를 반환합니다.
참고: decodingInfo()
를
호출할 때
keySystemConfiguration
이
존재하면 사용자의 동의 요청 등 사용자에게 보이는 효과가 나타날 수 있습니다.
이러한 호출은 작성자가 제공된 설정으로 MediaKeys
객체를 생성하고 사용하려는 경우에만 해야 합니다.
2.5.3. encodingInfo() 메서드
encodingInfo()
메서드는 다음 단계들을 반드시 실행해야 합니다:
-
configuration이 유효한 MediaConfiguration이 아니면,
새로 생성된
TypeError
로 reject된 Promise를 반환합니다. - p를 새 Promise로 할당합니다.
-
다음 단계들을 병렬로 실행합니다:
- Create a MediaCapabilitiesEncodingInfo 알고리즘을 configuration을 사용하여 실행합니다.
- 미디어 기능 작업을 큐에 추가하여 p를 결과값으로 resolve합니다.
- p를 반환합니다.
3. 보안 및 개인정보 보호 고려사항
이 명세는 보안에 민감한 정보 또는 API를 도입하지 않지만, 사용자 지문 채취에 사용할 수 있는 일부 정보에 더 쉽게 접근할 수 있도록 합니다.
3.1. 기능 모델
이 명세는 MediaDecodingType
값 file
,
media-source
또는 webrtc
를
지원하며,
MediaEncodingType
값 record
및
webrtc
도
지원합니다.
[webrtc]에서 지원되는 실시간 통신에서는 미디어가 피어 간에 전송됩니다. 사이트는 일반적으로 두 사용자 에이전트가 공통으로 사용할 수 있는 미디어 매개변수를 협상하는 데 필요한 정보를 교환할 책임이 있지만, 실제 미디어의 전송, 인코딩, 디코딩에는 관여하지 않습니다. 1:1 통화의 경우 사용자 에이전트가 송수신할 미디어를 협상합니다.
컨퍼런스 시나리오에서는 사용자 에이전트가 수십 또는 수백 명의 수신자에게 미디어를 보낼 수 있습니다. 확장성을 개선하기 위해 애플리케이션은 외부 서버(예: 선택적 포워딩 유닛 또는 컨퍼런스 브리지)를 사용합니다. 이러한 서버는 참가자들과 미디어 매개변수를 협상하여 송신자와 수신자 간의 일관성을 보장합니다. 이는 사용자 에이전트 간 협상(N * (N -1)번 필요)보다 더 확장성이 높습니다. 일반적으로 송신자는 하나의 코덱으로 인코딩하고, 컨퍼런스 서버는 트랜스코딩을 지원하지 않으므로 사용자 에이전트가 "좋아하는 것"을 간편하게 선택할 수 없습니다.
3.2. 디코딩/인코딩과 지문 채취
디코딩/인코딩 기능으로 노출되는 정보는 이미 실험을 통해 알아낼 수 있으며, API는 더 정확하고 일관된 정보를 제공할 가능성이 있습니다. 이 정보는 웹페이지에서 이미 접근 가능한 다른 정보와 높은 상관관계를 가질 것으로 예상됩니다. 특정 기기군은 매우 유사한 디코딩/인코딩 능력을 가질 것으로 기대되기 때문입니다. 즉, 특정 연도의 고급 기기는 특정 유형의 비디오를 디코드할 수 있고, 오래된 기기는 그렇지 않을 수 있습니다. 따라서 이 API로 인해 추가되는 엔트로피가 크지 않을 것으로 예상됩니다.
HDR 감지는 더 미묘합니다. colorGamut
,
transferFunction
,
그리고
hdrMetadataType
추가는 상당한 엔트로피를 유발할 수 있습니다. 하지만, 디코더가 소프트웨어로 구현되어 기기 간 기능이 고정된 UA의 경우 효과적인 엔트로피가 추가되지 않습니다.
또한 대부분의 경우, 기기들이 큰 카테고리로 나뉘고 그 안에서 기능이 유사하므로 실제 엔트로피는 최소화됩니다.
사이트가 사용 가능한 미디어 포맷을 노출하고 브라우저가 해당 기능과 비교하여 선택된 포맷만 반환하는 대안 디자인도 고려되었습니다. 그러나 사이트가 API를 반복적으로 호출해 전체 기능 세트를 얻을 수 있기 때문에 실제로 개인정보 보호에는 도움이 되지 않습니다. API에 강력한 호출 제한을 두면 여러 재생 항목에 대한 추측적 준비처럼 정상적인 사이트 동작을 방해할 수 있습니다.
만약 구현체가 지문 채취 방지 버전을 적용하고 싶다면, 항상 예/아니오만 반환하기보다는(후자는 사용자 경험 저하), 특정 기능 세트(예: 1080p VP9까지 디코드 가능 등)를 임의로 반환하는 것이 권장됩니다. 또 다른 완화책은 이러한 웹 API를 최상위 브라우징 컨텍스트로 제한하는 것입니다. 추가로, 프라이버시 예산을 사용해 API 호출을 일정 임계치 이상에서 차단하거나 제한할 수 있습니다. 또한 브라우저는 사이트가 실제로 감지한 기능을 사용하는지 여부를 고려할 수 있으며, 사용하지 않는 것으로 관찰되는 사이트에 더 강력한 제어를 적용할 수 있습니다.
4. 예시
4.1. decodingInfo()
로
재생 기능 조회
다음 예시는 decodingInfo()
를
사용하여
Media Source Extensions [media-source]를 사용할 때 미디어 재생 기능을 조회하는 방법을 보여줍니다.
< script> const contentType= 'video/mp4;codecs=avc1.640028' ; const configuration= { type: 'media-source' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 29.97 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
다음 예시는 decodingInfo()
를
사용하여
WebRTC 수신 기능 [webrtc]을 조회하는 방법을 보여줍니다.
< script> const contentType= 'video/VP8' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 25 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
< script> const contentType= 'video/H264;level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 360 , bitrate: 2000 , framerate: 25 } }; navigator. mediaCapabilities. decodingInfo( configuration) . then(( result) => { console. log( 'Decoding of ' + contentType+ ' is' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused decodingInfo to reject' ); }); < /script>
4.2. encodingInfo()
로
녹화 기능 조회
< script> const contentType= 'video/VP9' ; const configuration= { type: 'webrtc' , video: { contentType: contentType, width: 640 , height: 480 , bitrate: 10000 , framerate: 29.97 , scalabilityMode: "L3T3_KEY" } }; navigator. mediaCapabilities. encodingInfo( configuration) . then(( result) => { console. log( contentType+ ' is:' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused encodingInfo to reject' ); }); < /script>
< script> const contentType= 'video/webm;codecs=vp8' ; const configuration= { type: 'record' , video: { contentType: contentType, width: 640 , height: 480 , bitrate: 10000 , framerate: 29.97 } }; navigator. mediaCapabilities. encodingInfo( configuration) . then(( result) => { console. log( contentType+ ' is:' + ( result. supported? '' : ' NOT' ) + ' supported,' + ( result. smooth? '' : ' NOT' ) + ' smooth and' + ( result. powerEfficient? '' : ' NOT' ) + ' power efficient' ); }) . catch (( err) => { console. error( err, ' caused encodingInfo to reject' ); }); < /script>