Chapter 4 MPEG-2 부호기 전체 구조와 알고리즘 ( 4.6 ~ 4.10 ) 알기 쉬운 MPEG - 2 Chapter 4 MPEG-2 부호기 전체 구조와 알고리즘 ( 4.6 ~ 4.10 ) 2003. 7. 22 2003 SUMMER SEMINAR Software and System Lab. 이좌형
Chapter 4.6 ~ 4.10 4.6 init() 초기화 과정 4.7 프레임 재순서화 4.8 프레임과 필드 설정 4.7 프레임 재순서화 4.8 프레임과 필드 설정 4.9 초기 프레임 설정 4.10 움직임 예측
MPEG – 2 부호기의 전체구조
Init() 초기화 과정
Init() 초기화 과정
Main() int main(argc,argv) int argc;char *argv[]; { if (argc!=3) printf("\n%s, %s\n",version,author); printf("Usage: mpeg2encode in.par out.m2v\n"); exit(0); } readparmfile(argv[1]); /* read parameter file */ readquantmat(); /* read quantization matrices */ if (!(outfile=fopen(argv[2],"wb"))) /* open output file */ sprintf(errortext,"Couldn't create output file %s",argv[2]); error(errortext); init(); putseq(); fclose(outfile); fclose(statfile); return 0;
Init() static void init() { int i, size; static int block_count_tab[3] = {6,8,12}; initbits(); init_fdct(); init_idct(); /* round picture dimensions to nearest multiple of 16 or 32 */ mb_width = (horizontal_size+15)/16; mb_height = prog_seq ? (vertical_size+15)/16 : 2*((vertical_size+31)/32); mb_height2 = fieldpic ? mb_height>>1 : mb_height; /* for field pictures */ width = 16*mb_width; height = 16*mb_height; chrom_width = (chroma_format==CHROMA444) ? width : width>>1; chrom_height = (chroma_format!=CHROMA420) ? height : height>>1; height2 = fieldpic ? height>>1 : height; width2 = fieldpic ? width<<1 : width; chrom_width2 = fieldpic ? chrom_width<<1 : chrom_width; block_count = block_count_tab[chroma_format-1];
메모리 공간 할당 for (i=0; i<3; i++) { size = (i==0) ? width*height : chrom_width*chrom_height; if (!(newrefframe[i] = (unsigned char *)malloc(size))) error("malloc failed\n"); if (!(oldrefframe[i] = (unsigned char *)malloc(size))) if (!(auxframe[i] = (unsigned char *)malloc(size))) if (!(neworgframe[i] = (unsigned char *)malloc(size))) if (!(oldorgframe[i] = (unsigned char *)malloc(size))) if (!(auxorgframe[i] = (unsigned char *)malloc(size))) if (!(predframe[i] = (unsigned char *)malloc(size))) }
매크로 블록 할당 및 파일오픈 mbinfo = (struct mbinfo *)malloc(mb_width*mb_height2*sizeof(struct mbinfo)); if (!mbinfo) error("malloc failed\n"); blocks = (short (*)[64])malloc(mb_width*mb_height2*block_count*sizeof(short [64])); if (!blocks) /* open statistics output file */ if (statname[0]=='-') statfile = stdout; else if (!(statfile = fopen(statname,"w"))) { sprintf(errortext,"Couldn't create statistics output file %s",statname); error(errortext); }
프레임 재순서화 부호기 입력 - 0 1 2 3 4 5 6 7 8 9 10 11 I B B P B B P B B I B B P B B 코딩된 비트 스트림 - 0 1 2 3 4 5 6 7 8 9 10 I P B B P B B I P B B
프레임 번호 계산 for (i=0; i<nframes; i++) /* loop through all frames in encoding/decoding order */ { if (i==0 || (i-1)%M==0) /* I or P frame */ /* f: frame number in display order */ f = (i==0) ? 0 : i+M-1; if (f>=nframes) f = nframes - 1; } else /* B frame */ f = i - 1; pict_type = B_TYPE;
프레임 읽기 sprintf(name,tplorg,f+frame0); readframe(name,neworg); void readframe(fname,frame) { switch (inputtype) case T_Y_U_V: read_y_u_v(fname,frame); break; } static void read_y_u_v(fname,frame) char name[128]; FILE *fd; sprintf(name,"%s.Y",fname); if (!(fd = fopen(name,"rb"))) { sprintf(errortext,"Couldn't open %s\n",name); error(errortext); } for (i=0; i<vertical_size; i++) fread(frame[0]+i*width,1,horizontal_size,fd); fclose(fd);
프레임 번호 계산 예 I, P frame f = (i==0) ? 0 : i+M-1 B frame f = i - 1 Example 1 - M = 3, i = 0 I frame - 0 == 0 f = 0 Example 2 - M = 3, i = 1 P frame - 1 + 3 – 1 f = 3 Example 3 - M = 3, i = 2 B frame - I – 1 f = 1
프레임과 필드 설정 순차주사와 격행주사 프레임 구조와 필드 구조 프레임 예측과 필드 예측 프레임 DCT와 필드 DCT
순차주사와 격행주사
프레임 DCT와 필드 DCT
Read Frame void readframe(fname,frame) { switch (inputtype) case T_Y_U_V: read_y_u_v(fname,frame); case T_YUV: read_yuv(fname,frame); case T_PPM: read_ppm(fname,frame); default: break; }
Motion Estimation
Estimation
움직임 예측용 파라미터 파일 1 /* top_field_first */ 0 0 0 /* frame_pred_frame_dct (I P B) */ 0 0 0 /* concealment_motion_vectors (I P B) */ 1 1 1 /* q_scale_type (I P B) */ 1 0 0 /* intra_vlc_format (I P B)*/ 0 0 0 /* alternate_scan (I P B) */ 0 /* repeat_first_field */ 0 /* progressive_frame */ 2 2 11 11 /* P: forw_hor_f_code forw_vert_f_code search_width/height */ 1 1 3 3 /* B1: forw_hor_f_code forw_vert_f_code search_width/height */ 1 1 7 7 /* B1: back_hor_f_code back_vert_f_code search_width/height */ 1 1 7 7 /* B2: forw_hor_f_code forw_vert_f_code search_width/height */ 1 1 3 3 /* B2: back_hor_f_code back_vert_f_code search_width/height */
움직임 예측시 함수호출 관계
프레임 예측 과정
프레임 예측의 전체 구조
I 픽쳐 움직임 예측과정
P 픽쳐 움직임 예측 과정
B 픽쳐 움직임 예측 과정
전탐색 블록 매칭 알고리즘
프레임과 필드 픽쳐구조
프레임과 필드 움직임 예측
필드 예측
I 픽쳐와 P 픽쳐의 필드 예측
B 픽쳐의 필드 예측