평소에 지금 유동닉과 같은 고정닉으로 여러 갤 눈팅하는 사람인데 지금 VS10 trial버전 끝나서 날짜 변경해서 썼더니 디시에 로긴이 안됨.

잡설이 길었고



지금 다니고 있는 랩에서 교수님이 주신 과제가


10비트짜리 YUV(4:2:0) 영상을 8비트 형식으로 출력해보라는게 과제인데,


일단 영상을 10비트짜리지만 8비트짜리 char에 담았음. 배열은 원래의 WIDTH*HEIGHT의 10/8 배를  선언해서 

그다음에 10비트를 8비트로 잘라야 하는데, (맨 앞의 두 비트는 제외한 나머지 8비트만을 취하면 됨)


char형 배열에 저장되어 있는걸


16비트짜리 short *형을 선언을 해서


short = (short *)(&char[0]) 의 메모리를 불러 오면,


char[0], char[1] 의 메모리까지 불러 와 져서,

이걸 (*short) >> 6; 해준 다음, 다른 char형 배열에 집어넣으면 데이터 스택 완료! 가 될줄 알았어. 

0000 0000 0000 0000 

char[0]    char[1]    

(당연히 배열을 char short 처럼 선언형 그대로 선언하진 않았음)


코드를 보여주면, 


/////////////////////////////

int YUVdata_count = 0;

int Buffer_count = 0;


short *tempPointer;


for(int five_count = 0; five_count < (WIDTH*HEIGHT / 5) ; five_count++){


for(int bit_count = 4; bit_count>0 ; bit_count--){

//tempPointer = tempAV


tempPointer = (short *)( &(tempAVFrame->data[0][Buffer_count]) );

YUVdata->data[0][YUVdata_count] = (UCHAR)( ( (*tempPointer) >> (bit_count*2 - 2 ) ) & (short)255);

YUVdata_count++;

Buffer_count++;

//먼저 short 형으로 데이터를 불러 오고, (short)tempAVFrame->data[0][five_count] -> 16비트

//그다음에 >> 연산자를 통해서 (bit_count*2 - 2) 만큼 비트 연산을 취해준 뒤에, (표 참조)

//YUVdata_count (진짜 YUV의 데이터가 담길 파트) 의 카운터를 five_count 문에서 올려 준 다음에,

//Buffer_count (short(16비트) 으로 불러오는 버퍼YUV의 카운터도 올려 준다.


Buffer_count++; //이 때, short으로 불러오는 버퍼데이터는 4번 YUV 데이터 보내줄때마다 하나씩 추가해 주어야 하므로, -- 포문 끝나고 밑에 하나 넣어준다.

}


/////////////////////


tempPointer 에는 원래 데이터를 스택할 YUVdata보다 10/8배 많은 데이터를 집어 넣은 malloc 해준 상태고, 저렇게 불러오면 될줄 알았는데


생각처럼 short*로 데이터를 불러 올 때 문제가 있던 모양이야. 콘솔에서 해봐도 잘 안되네 진짜

콘솔에서는 char[0] = 127, char[1] = 255; 처럼 불러 오고, short으로 불러오면 0111 1111 1111 1111 의 값이 나올줄 알았는데 그렇지 않았음



질문 1줄요약


char의 배열의 포인터를 강제 형변환 시켜서 short에 집어넣고 호출해도 내가 원하는 연속된 배열들의 비트는 불러와 지지 않음?