알기 쉬운 MPEG-2

Download Report

Transcript 알기 쉬운 MPEG-2

알기 쉬운 MPEG-2
Chapter 5.
MPEG-2 복호기 전체 구조와 알고리즘
5.1 ~ 5.7
발표자 : 김 래 영
목차







5.1
5.2
5.3
5.4
5.5
5.6
5.7
전체 구조
MPEG-2 복호화 알고리즘
복호화 전체 루틴
복호기 초기화
비트레벨 루틴 (getbits)
MPEG-2 비트스트림 헤더 복호
프레임 복호
5.1 전체 구조
5.2 MPEG-2 복호화 알고리즘
5.3 복호화 전체 루틴
5.4 복호기 초기화
5.5 비트레벨 루틴 [getbits]

비트 초기화 과정 (initbits())
5.5 비트레벨 루틴 [getbits]

레이어 데이터(layer data)의 구성
5.5 비트레벨 루틴 [getbits]

비트 read (getbit())
5.5 비트레벨 루틴 [getbits]
비디오 데이터의 계층 구조
시작 코드 복호화

시작 코드

접두 시작 코드 : 0000 0000 0000 0000 0000
0001
예)
#define
#define
#define
#define
#define
PICTURE_START_CODE
SLICE_MIN_START
USER_START_CODE
SEQ_START_CODE
SEQ_END_CODE
0x100
0x101
0x1B2
0x1B3
0x1B7
시작 코드 복호 블록도
시퀀스 헤더 복호화

정의



최상위 구조
모든 비트스트림이
존재
기본적이고 중요한
정보들이 존재
GOP 헤더 복호화

정의


전송순서를 기준으로 I 픽처에서 다음 I 픽
처까지의 묶음
MPEG-2에서 GOP 헤더는 선택적
GOP 헤더 복호화(cont’)
static void getgophdr()
{
…..
drop_flag = getbits(1);
hour = getbits(5);
minute = getbits(6);
flushbits(1);
sec = getbits(6);
….
closed_gop = getbits(1);
broken_link = getbits(1);
….
}
픽처 헤더 복호화

정의


하나의 화면에 대한 모든 정보들을 포함
복호화 루틴
Static void getpicturehdr()
{
….
temp_ref = getbits(10);
pict_type = getbits(3);
vbv_delay = getbits(16);
….
ext_user_data();
}
확장과 사용자 데이터 처리

정의

확장과 사용자
데이터를 처리
하는 부분
확장과 사용자 데이터 처리

시퀀스 확장 복호화





시퀀스 디스플레이 확장




시퀀스 헤더에 있는 전반적인 정보를 보완
시퀀스 헤더에 없는 정보들을 부가
low_delay 존재
profile과 level
다양한 화면 출력 방식을 표현
video_format : NTSC, PAL 등
디스플레이 수평/수직 사이즈
시퀀스 스케일러블 확장



확장성
내부적인 오류 보완
적합한 동영상을 표시
확장과 사용자 데이터 처리

픽처 코딩 확장


현재 픽처의 독특한 특징
영화 -> TV



f_code : 움직임 벡터의 탐색 영역
양자화 매트릭스 확장


top_field_first값과 repeat_first_field 값이 결합
양자화 하는데 사용되는 스텝 값
픽처 디스플레이 확장



화면에 처리되는 위치를 조정하기 위한 정보
frame_center_horizontal_offset
frame_center_vertical_offset
슬라이스 헤더 복호

정의 및 특징





정수개의 매크로 블록들로 구성
서로 다른 크기를 가짐
한 픽처의 슬라이스들의 구성은 서로 다름
오류 복구
제한 사항



좌측 상단에서 시작
우측 하단에서 종결
슬라이스간의 간격은 없으며 겹쳐지지 않음
슬라이스 헤더 복호

슬라이스 위치


시작 코드 존재
00 00 01 01 ~ 00 00 01 AF
수직 위치


Slice_vertical_position = macroblock_row + 1
예) 00000120 이면
→ 수직위치 32, 매크로 블록 row 31
수평 위치


Macroblock_address_increment 변수
Macroblock_escape 변수

33 + macroblock_address_increment
5.7 프레임 복호
5.7.1 프레임 재순서화 과정



















for (i = 0; i<3; i++)
{
if (pict_type==B_TYPE)
{ //B픽처는 참조 픽처가 될 수 없다
newframe[i] = auxframe[i]; //auxiliary
}
else
{
if(!secondfield) //secondfield가 아니면
{
tmp = oldrefframe[i];
oldrefframe[i]=refframe[i]; //oldrefframe(참조 프레임)
refframe[i]=tmp;
}
newframe[i]=refframe[i]; // oldrefframe에 있는 것을 새로운 프레임으
로 설정
}
if(pict_struct == BOTTOM_FIELD) /* 2 */
newframe[i]+=(i==0)?coded_picture_width:chrom_width;
}
5.7.2 매크로 블록
5.7.2.1 I 픽쳐 에서의 매크로 블록
5.7.2.2 P 픽쳐 에서의 매크로 블록
5.7.2.3 B 픽쳐 에서의 매크로 블록
5.7.3 매크로 블록 모드 보호





macroblock_quant : 양자화 스케일 코드값 존재여부
Macroblock_motion_forward : 순방향 움직임 벡터 존
재여부
Macroblock_motion_backward: 역방향 움직임 벡터 존
재여부
Macroblock_patern : coded_block_pattern 존재 여부
Macroblock_intra : 매크로블록이 인트라로 코딩되었으
면1
5.7.4 코드 블록 패턴
for(comp=0; comp<blk_cnt;comp++)
{
if(cbp&(1<<blk_cnt-1-comp)))
}