본문 바로가기

일하면서 사용한 짧은 지식

(15)
Handle Leak 디버깅 Go 버튼 Break 버튼 0:000> !htrace -enable htrace 활성화 - 윈도우가 모든 핸들의 생성과 소멸에 관련된 호출에 대해서 기록하게 된다. Go 버튼 대기 또는 Handle Leak 상황 재현 Break 버튼 0:000> !htrace -diff !htrace -diff - 동일한 핸들 값에 OPEN만 있고 CLOSE가 없는 것들을 출력해준다. 이후 출력되는 Call Stack으로 Handle Leak 원인 추적 https://learn.microsoft.com/ko-kr/windows-hardware/drivers/debugger/ WinDbg 설치 - Windows drivers Windows 디버거 및 WinDbg 설치에 대한 개요는 여기에서 시작합니다. learn.micr..
C++에서 std::to_string으로 int를 string으로 변환, c_str()로 string에서 const char* 반환 1. 상황 GStreamer를 사용중에 GObject의 property를 설정할 필요가 있었다. property를 설정하기 위해서는 g_object_set()의 두 번째 파라미터로 property이름을 const gchar* 형태로 넘겨줘야한다. 여기서 property 이름을 원하는 조건에 맞는 string값으로 조합할 필요가 있었다. 이때 C++로 string을 조작한 방법을 복습하기 위해 정리한다. 2. 사용했던 string 조작 방법 1) std::to_string으로 int를 string으로 변환 2) '+' 연산자로 string 합치기 3) c_str()로 string에서 const char* 반환 3. 예제 코드 작성 #include #include void MakeStringAndShow()..
DirectX11 COM 객체 메모리 누수 원인 추적하기 https://social.msdn.microsoft.com/Forums/SECURITY/en-US/2b043a3a-2320-4cf5-8b9b-4fe5c2a7f119/what-does-setprivatedata-mean-in-directx-11?forum=vcgeneral What does SetPrivateData(...) mean in DirectX 11? I've read the documentation about SetPrivateData but I don't know how to use it, I know that it's a memory leak detection according to the documentation but I don't know how to use it. There are ..
IntPtr로 전달되는 바이너리 데이터 파일로 쓰기 1. 상황 ffmpeg 디코더로 인코딩된 데이터를 넘기기 전에 제대로 된 데이터가 들어오는지 검증하기 위하여 파일로 써서 팟플레이어나 VLC로 확인하려고 했다. 이벤트가 발생할 때 IntPtr 형태로 포인터가 넘어오는 상태였고 이 포인터가 가리키는 바이너리 데이터를 파일로 써야 했다. 2. 사용한 방법 Marshal.Copy를 이용하여 byte 배열에 데이터를 복사하고 FileStream으로 Write하였다. byte[] data = new byte[streamLen]; Marshal.Copy(streamData, data, 0, (int)streamLen); string fileName = "test.ts"; using (FileStream test = new FileStream(fileName, Fi..
HEVC(H.265)의 구조 https://www.codeproject.com/Tips/896030/The-Structure-of-HEVC-Video The Structure of HEVC Video This tip is about HEVC, HEVC syntax elements and opensource tool for analyzing HEVC bitstreams. www.codeproject.com HEVC(H.265)로 인코딩된 스트리밍 영상도 우리 회사 솔루션에서 지원해야 할 필요가 있어 SPS Parsing 작업을 하였다. FFmpeg 디코딩의 옵션을 설정하기 위하여 인코딩된 영상의 해상도와 프레임 레이트가 필요하였고 SPS에서 해당 정보를 얻었다. 위 사이트를 통해 이 작업에 필요했던 SPS를 포함하여, HEVC(H.2..
HEVC(H.265) SPS Parsing 작업을 하면서 알게 된 Base64 HEVC(H.265)로 인코딩된 스트리밍 영상도 우리 회사 솔루션에서 지원해야 할 필요가 있어 해당 작업을 시작. 기존에 구현된 H.264 SPS를 파싱하는 코드를 분석하면서 Base64를 알게되었다. 1. Base64란? 8비트 이진 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로 인코딩하는 방식. 2. Base64를 사용하는 이유 통신과정에서 바이너리 데이터의 손실을 막기 위해 사용. ASCII로 Encoding 하여 전송하게 되면 아래와 같은 문제가 발생할 수 있다. ASCII는 7 bits Encoding인데 나머지 1bit를 처리하는 방식이 시스템 별로 상이하다. 일부 제어 문자의 경우 시스템 별로 다른 코드값을 가진다. Base64는 ASCII 중 제어 문자와 일부 특수..
WireShark로 RTP over UDP 와 RTP over TCP로 설정했을 때, RTSP SETUP 메서드의 Transport 차이 확인 WireShark를 처음 설치한 후 추가 설정이 필요한 부분 1. Decode As... 에서 RTSP 추가 - 이걸 추가해야 Protocol Column에서 RTSP 보인다. 2. Column Preferences에서 Type : information 항목 추가 - 이걸 추가하면 RTSP 메서드 확인 가능 VLC에서 RTP over UDP 와 RTP over TCP로 설정했을 때, WireShark에서 SETUP 메서드의 Transport 차이 HTTP (기본) 옵션 Real Time Streaming Protocol Request: SETUP rtsp://192.168.0.42:9801/streamid=1 RTSP/1.0\r\n CSeq: 4\r\n User-Agent: LibVLC/2.1.4 (LI..
Direct2D에서 SetTransform으로 설정한 값 초기화하기 1. 상황 Direct2D를 이용하여 기존 이미지를 Transform하여 렌더링할 필요가 있었다. ID2D1DeviceContext2의 SetTransform 메서드에 Matrix3x2F::Scale(D2D1_SIZE_F,D2D1_POINT_2F)를 전달하여 원하는 모양으로 렌더링하였다. 하지만 이렇게만 하니 이 과정 이후에 진행되는 기존에 Direct2D를 통해 렌더링하던 부분도 SetTransform으로 설정한 영향을 받게 되었다. 2. SetTranform을 호출하고 적용하면 이후 drawing에서도 해당 설정이 남아있다. The transform is applied to all later drawing operations until you call SetTransform again. 3. 만약 설..