알기 쉬운 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)))
}