전세계에서 제일 처음 나온 동영상 코덱. 전화선 상에서 영상통신하기 위한 용도이다.
광케이블이 안깔렸을때는 전화선을 1~30개 연결해서 케이블로 썼다.
한국은 광케이블이 다 깔려있지만 국토가 큰 나라는 다 깔수가 없다. 그래서 스타링크같은 서비스가 있다.
realtime video codec이다. 전화선을 몇개쓰느냐에 따라서 내가 보낼 수 있는 bandwidth가 정해진다.
전화선 한개의 max비트량이 64kbps. 이제는 전화선 모뎀을 사용하는 곳은 거의 없다.
rate control = 전송하는 비트량을 bandwidth에 맞게 조절하는것으로 DCT양자화 계수를 제어해서 전체부호발생량을 조절한다.
처음 데이터는 ME/MC없이 B와 연결되어서 DCT 양자화를 거친다.
역양자화 역변환기를 거쳐서 이미지를 reconstruct해서 메모리에 저장하고, 다음 프레임은 ME/MC를 적용
디코더에서 하는 역양자화, 역변환 작업을 인코더에서 수행하는 이유는 디코더에 에 전송한 영상과 동일한 데이터를 유지하기 위해서이다.
rate control = bandwidth에 맞게 bitrate를 제어한다.
루프필터 ⇒ integer단위로 ME/MC 수행하는데 정밀도를 높이기 위해서 루프필터를 통한 low pass filtering을 수행한다. half pel단위의 ME/MC를 적용하기에는 당시에 개발할때 연산복잡도, 메모리 측면에서 구현할 수 없었다. 매크로블록 단위마다 루프필터를 on off하도록 설계함
Coding Algorithm
predictive Coding: Interframe/Inter coding
현재의 신호를 과거의 신호로부터 예측한다. 예측한 신호의 오차가 입력 신호보다 작으면 부호화 이득을 얻을 수 있다.
실시간 영상통신환경헤서는 b프레임을 쓸 수없음 ipppp…..
프레임 간 예측 = inter coding, 프레임 내 부호화 = intra coding
대부분 inter frame을 사용하고 장면전환 등 프레임 상관도가 낮은 부분은 intra프레임을 사용한다.
장면전환이 발생되면 이전영상과 현재영상의 correlation낮아서 dpcm등 차영상을 구해서 laplacina형태의 분포를 가진 residual data를 entropy coding해서 전송하는데 장면전환은 전송해야할 데이터량이 증가하므로 차영상을 구하지 않고 original data를 그대로 보내는것이 코딩효율 측면에서 우수하다
→ intra frame 코딩
Motion Compensation
일정 범위 내에서 예측오차가 가장 작은 위치를 SAD cost function으로 찾는다
유클리드 거리공식이 가장 정확하지만 연산복잡도가 높아서 절댓값을 많이 사용한다.
매크로블록당 하나의 mv를 가진다. u,v는 y의 1/4사이즈인데 y에서 나온 mv를 똑같이 적용해야할까?
이당시에는 y에서 구한 것을 uv에서 그대로 적용했다. 요즘은 y의 모션벡터를 x, y축으로 1/2씩 줄이는 변형을 가한다.
mvd = 현재 mv - 이전 mv(레퍼런스 모션벡터) ⇒ vlc 코딩해서 보낸다
0을 중심으로 라플라시안 분포를 가지게 되므로 vlc코딩을 적용한다.
mvd를 디코더에 전송하고 디코더는 mv를 MVp + MVd로 복구한다.
루프필터
움직임보상을 사용하면 이전 프레임을 이용하므로 오차가 계속 누적되고 고주파 성분이 많아지면 예측 효율을 저하시키기 때문에 화질 열화가 발생한다. low pass filter나 half pel단위로 확대하는 등의 작업을 해야함
블록단위로 pixelwise당 low pass filtering을 적용한다. 계산량이 너무 높으니까 필요한 블록에만 적용하도록 on off를 적용한다.
average연산을 수행해서 masking한 효과를 낸다.
상하좌우는 2의 가중치 대각선은 1의 가중치 중심은 4의 가중치를 적용해서 1/16으로 계산
E에 더 가중치를 주는 gaussian filtering이다. 이 작업으로 확 튀는 화소 = 고주파항을 줄인다.
나중에 이 작업을 대신한게 half pel quarter pel memc이다.
DCT 변환기
floating point연산을 하면 필연적으로 binary로 바꿀때 truncation이 발생함
따라서 유효자리수를 얼마나 지정했냐에 따라 정밀도가 달라지는데 truncation error가 누적되면 encoder의 결과와 decoder의 결과가 mismatch되는 경우가 발생한다.
그래서 floating point연산을 integer연산으로 바꾸어서 정상적으로 동작하도록 한다.
만약 floating point를 사용해서 truncation이 필요한 시스템이라면 중간에 프레임 내 부호화(intra frame)를 함으로써 허용치를 초과하는 오차가 누적되지 않도록 한다.
양자화
DCT 계수는 일반적으로 -2048~2047의 값을 가진다.
DC값은 모두 똑같이 중요하므로 uniform quantization을 적용하고 AC값들은 잘게 나눌필요가 있는 영역에 양자화 단계를 더 많이 배치하기 위해서 0주변은 dead zone을 둔다. AC값은 라플라시안 분포를 가지기 때문이다
rate control
부호화 제어 = bandwidth에 맞게끔 bitrate를 control해야한다.
네트워크 상에서 전송할때 1초에 어느정도 데이터양을 보내야한다는게 정해져있고 이를 초과하는 데이터를 보내면 안되고 더 작은 데이터를 보내면 전송선로가 끊어진다. 전송선로를 유지하려면 undeflow인 상황에서는 garbage데이터를 보내야한다.
유지해야하는 bitrate를 target rate라고 한다.
bitrate를 control하는 방법은
•
프레임 간 부호화 프레임 내 부호화를 사용할지
•
Loop Filter On/Off
•
양자화 특성을 어떻게 선택할지
등이 있는데 가 가장 중요한 control factor는 양자화 계수이다.
bandwidth 넘치는 데이터가 있을때는 보낼 데이터를 버린다 = 프레임 스킵. 프레임 자체를 버린다.
모든 프레임을 보내지 않아도 사용자들이 인지하기 힘들다.
RDF(rate distortion function)는 양자화 스텝 사이즈 대비 비트 발생량이 얼마나 되는지의 모델이다.
Q값에 대한 R값을 구한다. R은 영상의 발생 비트량, Q는 양자화스텝, S는 영상 복잡도, x1,x2는 상수 파라미터.
Q값이 낮으면 데이터를 많이 보내니 영상 퀄리티를 높일수 있다.
RDF를 구하는 수학모델을 RDM이라고 한다.
RDF가 결정이 됐으면 Q값에 따라서 어느정도 데이터 나올지 알 수 있고 필요한 발생비트량에 따라서 그에 맞는Q값도 결정할 수 있다. Q값을 결정해서 bitrate control을 수행한다.
frame by frame으로 RDF가 RDM을 통해 계속 업데이트된다.
최소 두개의 포인트를 알아야 rdm을 구할수있다.
처음에 두개의 포인트는 임의로 결정해서 q1 = 7, q2= 10이라고 했을때 R값이 나오고
그걸 기반으로 x1, x2를 구하고 RDF를 구할 수 있다.
세번째 전송비트 결정 ⇒ 5000이면 q가 6이어야한다 ⇒ 6으로 인코딩.
영상 특성이 급변하는 경우 과거의 데이터를 적게 써야하고 stable하면 많이 써서 정밀도를 높일수있다.
Codec Data structure
인코더와 디코더가 어떻게 약속해서 데이터를 주고받는지의 프로토콜. 개발할 당시 최고의 coding efficiency성능으로 구현해야한다. H.261도 그당시 최고 성능 코덱이었다.
영상 데이터가 picture층, GOB(Group of Block)층, MB층, 블록 층으로 나뉜다.
picture층은 12개의 GOB로 이루어지고 GOB는 33개의 매크로블록, 매크로블록은 6개의 블록으로 구성되어있다.
데이터 보내다가 에러가 나면 error propagation이 발생하기 때문에 격벽 구조로 구현되어있다.
영상을 12개의 격벽으로 쪼개고 각각의 격벽 안에는 33개의 매크로블록 = GOB가 들어있다.
이를 통해서 error를 localization시킨다. 에러가 발생했는지 안했는지 알아야 에러를 처리할 수 있으므로 error detection method가 필요함.
picture layer
비트스트림 내에서 에러 detection하려면 눈에 띄는 일련의 데이터가 있어야한다. 그것을 깃발이라고 한다.
깃발은 0과 1로된 굉장히 특수한 비트의 주합이다. bit sequence를 긴 조합으로 만들어서 unique하게 만들어야한다. 각 격벽마다 깃발을 다는데 그것을 start code라고 한다.
다른 데이터가 start code emulation을 하면 안되니까 확률이 가장 높은것이 0이아닌 1을 배정하고 깃발은 00000000..으로 시작한다.
깃발을 picture마다 달아줘서 앞의 picture에서 발생한 에러가 전파되지 않도록 한다. (PSC = picture start code)
GOB layer
GOB레이어에서도 start code가 필요하다. start cide, gob number 등을 포함함
데이터가 없는 gob는 보낼필요가 없고 몇번 GOB에 데이터 있는지 확인해서 그것들만 보낸다.
CIF이면 12분할 QCIF(Quarter CIF)는 3분할이다.
MacroBlock Layer
GOB층을 33개의 매크로 블록으로 분할한다.
모든 매크로블록에 데이터가 있는게 아니다. GN과 같이 데이터가 있는 MB만 지정하기 위해서 Macroblock address(MBA)가 있다. MBA = 3이면 3칸 다음에 데이터가 있다.
매크로블록에는 6개의 블록이 존재하고 각각마다 motion vector가 있어야하고 6개의 블록마다 residual은 있는 블록과 없는블록이 있다. intercoding일 경우 motion vector는 있어도 residual은 없는 상황이 많다.
MType에서 매크로블록에 MVD가 있는지 없는지, residual이 있는지에 따라 분기한다.
MTYPE은 비트스트림 내의 신호등 역할로 MVD+CBP를 고려해서 분기한다.
Motion Vector Difference와 CBP를 조절할 수 있는 신호등 = MTYPE
1.
데이터 보낼게 없다 ⇒ MB Skip.
2.
underflow 발생하는 경우 MBA Stuffing
3.
매크로블록에서 MVD만 보내는 경우
4.
MVD없이 데이터만 존재하는 경우. (블록이 6개 있으므로 어느 블록에 데이터가 있는지 coded block pattern을 보내줘야함)
5.
MVD와 residual 둘다 있는 경우
MVD만 보내는 경우 inter block
residual만 존재하는 경우 = CBP만 사용
세가지 경우 바로 전 매크로 블록 motion vector = Motion Vector Predictor는 0이 된다. (즉 MVP를 적용하지 않는 케이스)
•
1, 12,23번째 매크로 블록 MVD(맨 왼쪽 끝 MB)
•
MBA가 1이 아닌 매크로블록의 MVD = 바로 이전칸 외에는 MVP로 쓰지 않는다.
•
바로 전 매크로블록의 MType에 의해서는 Motion compensation이 수행되지 않은 경우(Intra block)
CBP(coded block pattern)은 이전 화면의 같은 위치에 있는 매크로블록에 변화가 있었음을 보이는 것으로, 6개의 블록 중에서 적어도 한개의 변환계수가 전송되는 블록이 있는 경우 사용됨.
Block Layer
한개의 매크로블록은 4개의 휘도 블록과 두개의 색차블록으로 구성된다.
블록 레이어는 변화계수와 종료부호로 구성되어있다.
2차원으로 양자화된 변환계수는 저주파 성분부터 지그재그 스캔으로 1차원 데이터로 나열된다.
그다음 0의 연속과 그다음에 이어지는 0이 아닌 계수의 레벨 조합에 대해서 VLC부호화가 이루어진다.
종료부호는 마지막으로 0이 아닌 계수 이후에 들어간다(EOB)
H.261 전송부호기
영상 복잡도나 움직임의 빠르기에 따라서 정보 발생량이 변화하는데 이 변동을 흡수하고 전송속도를 일정하게 유지해야 한다. 버퍼 점유율에 따라서 MQUANT를 제어한다.
언더플로우가 발생하면 MBA stuffing으로 dummy data를 보낸다.
512비트 단위를 한 묶음으로 전송한다.
Fill bit가 1이면 정상 데이터, 0이면 더미데이터이며 모두 1로 채운다.








