평소에 지금 유동닉과 같은 고정닉으로 여러 갤 눈팅하는 사람인데 지금 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에 집어넣고 호출해도 내가 원하는 연속된 배열들의 비트는 불러와 지지 않음?
먼말인지 잘 모르겠음
base64비슷한거 같은데
굵은줄만 읽으시면 대여
하고자 하는 목표가 0000 0000 0000 0000의 연속된 두 char형 배열중에 short형이랑 비트 연산자를 활용해서 8비트만 취하고 싶었었음
잘모르겠네 내가 이해 한게 맞다면 리틀엔디안 이란 개념 찾아봐
공용체를 쓰면 편하지 안음? - dc App
와 감사합니다 인텔 시퓨가 리틀엔디안 방식으로 데이터를 스택해서 short으로 불러올때 에러가 나는거였네요 감사합니다
공용체 말씀도 정말 감사합니다 배웠는데도 써먹지도 못했네요 감사합니다 다만 fp.read가 char형만 가능케 해서 좀 짱구를 굴려야 해서 일단 다른 찾은 방법 사용해볼게요