본문 바로가기

일하면서 사용한 짧은 지식/RTSP

HEVC(H.265)의 구조

https://www.codeproject.com/Tips/896030/The-Structure-of-HEVC-Video

 

The Structure of HEVC Video

This tip is about HEVC, HEVC syntax elements and opensource tool for analyzing HEVC bitstreams.

www.codeproject.com

 

HEVC(H.265)로 인코딩된 스트리밍 영상도 우리 회사 솔루션에서 지원해야 할 필요가 있어 SPS Parsing 작업을 하였다.

FFmpeg 디코딩의 옵션을 설정하기 위하여 인코딩된 영상의 해상도와 프레임 레이트가 필요하였고 SPS에서 해당 정보를 얻었다.

위 사이트를 통해 이 작업에 필요했던 SPS를 포함하여, HEVC(H.265)의 구조의 기본 개념을 알게 되었다.

 

1. Main HEVC Syntax Elements

 

 

HEVC 비트스트림은 위 그림과 같이 syntax element로 이루어져 있다.

각각의 syntax element는 NAL(Network abstraction layer) Unit에 위치해있다.

 

VPS Video parameter set
SPS Sequence parameter set
PPS Picture parameter set
Slice (different types)
AUD Access unit delimiter
EOS End of sequence
EOB End of bitstream
FD Filler data
SEI Supplemental enhancement information
Reserved and unspecified

 

VPS, SPS, PPS에는 일반적인 비디오의 디코딩 과정에 필수적인 데이터들을 포함하고 있다.

이번 작업은 디코딩 옵션을 설정할 때 사용할 정보가 필요하여 해당 syntax element를 활용하였다.

 

Slice는 인코딩된 비디오 프레임 데이터를 포함한다.

각 Slice는 다른 Slice 정보를 사용하지 않고 독립적으로 디코딩 될 수 있어서 병렬 인코딩과 디코딩을 지원하는 도구로 사용할 수 있다.

  • I-slice - slice with only intra prediction
  • P-slice - slice with inter prediction from one I or P slices
  • B-slice - slice with inter prediction from two I or P slices
  • IDR-slice - There are no references from slices after IDR-slice to slices before it.

AUD는 비디오 프레임의 시작에 대한 시그널링에 사용한다.

 

FD는 비트 전송률 평활화에 사용한다.

 

SEI는 picture timing, color space information 다양한 유형의 메타데이터를 지원한다.

 

2. Frame per second value

 

SPS를 파싱할 때 sps:vui:num_units_in_tick, sps:vui:time_scale를 구할 수 있고 아래의 식으로 FPS를 계산할 수 있다.

FPS = sps:vui:time_scale / sps:vui:num_units_in_tick

※ 참고

SPS에 VUI정보가 없을 수도 있다.

이번 작업할 때 테스트용으로 사용한 H.265를 파싱할 때 ui_parameters_present_flag가 0이었고

이는 VUI 정보가 없다는 뜻으로 FPS를 계산할 수 없었다.

그래서 해당 정보는 SDP(Session Description Protocol)에서 얻었다.

 

3. Size of picture

 

SPS를 파싱할 때 sps:pic_width_in_luma_samples, sps:pic_height_in_luma_samples에 해당 정보가 저장된다.

해당 정보를 파싱하여 영상의 너비, 높이를 구할 수 있었다.

 

 

4. 작업에 참고한 코드

아래 C++과 Python으로 구현된 파싱함수를 참고하여 HEVC(H.265) SPS를 파싱하는 메서드를 C#으로 구현하는 작업을 진행하였다.

 

https://yqlab.me/archives/32.html

 

H265_Nalu类型判断及SPS和PPS数据解析 - Wolf's Home

 

yqlab.me

https://app.box.com/s/vr2s59olnzscpsmkb26g0t4h0pe00fyt

 

Box

 

app.box.com