한 동안 그냥 미뤄두고만 있었던 RTSP 미디어 서버 기능이 현재 진행하고 있는 프로젝트에서 필요하게 되어 더이상 미룰 수 없게 되었다. 원래는 RTSP 표준 문서인 RFC인가 치킨집 이름과 비슷한 표준 규약을 분석해서 직접 소켓으로 구현하고 싶었으나, stackoverflow에 한 글을 보고 관련 라이브러리를 찾아 보게 되었다.

 

Q) RTSP 미디어 서버를 구현하려고 하는데 어떻게 하면 되나요?

A) RFC 규약을 구현해 본 경험이 있습니다. 왜 스스로 지옥으로 걸어 들어가려고 하나요?

 

실제답변)

Don't do it yourself if you've never written a networking application before. It's no easy task to write a scalable and robust networking app and it's even harder to implement an existing protocol so that the implementation is fully compatible with the specification

 

그래서 일단은 미디어 서버를 구현하는데 기존의 라이브러리를 사용하기로 마음먹고, 상용으로 사용 가능한 라이브러리들을 찾아보았다. 구글링 결과 LIVE555 Streaming Media, 다윈 스트리밍 미디어, gStreamer를 찾았는데, 이 세 라이브러리 중에 gStreamer가 훨씬 보기 쉬운 API 문서를 제공하고 있는데다가, 전송, 수신, 코덱처리, 렌더링과 같은 다양한 기능을 모두 제공하고 있어서 배워두면 이곳저곳 여러모로 쓸 수 있을 것 같아 일단은 요걸 좀 살펴보고 잘 안된다 싶으면, LIVE555로 갈아 타야지 하고 마음먹었다.

 

(Darwin은 안 찾아 봐서 잘 모르겠고, LIVE555 streaming media, gStreamer는 둘다 LGPL을 따르고 있어서 상용으로 쓸 때도 소스코드를 공개할 필요는 없는것으로 보였다.)

 

그리하야... 학습 목표는

 

1순위 gStreamer

2순위 LIVE555 streaming media

 

요렇게 결정이 되었다.

Posted by 굿쟌
,

코딩 하다보니까 조금 헷갈려서 확인차 이것 저것 해보다보니 더 헷갈렸다.

C#의 reference, value참조에 대해서 MSDN에 나와 있는 것 + 구글링 한 내용으로 정리 해 본다.

 

코드를 보는게 가장 빠르다.

 

Call By Value 

 public void CallByValue(int a)

{

a = 100;

}

 

static void main(string args[])

{

int test = 0;

CallByValue(test);

Console.WriteLine(test);

}

 

결과는 0

 

Call By Reference 

 public void CallByReference(ref int a)

{

a = 100;

}

 

static void main(string args[])

{

int test = 0;

CallByReference(test);

Console.WriteLine(test);

}

 

결과는 100

참고로 out을 써도 되는데 ref와 out에는 다음과 같은 차이가 있다.

out : 초기화 안되도 됨

ref : 초기화 되어야만 함

 

Class경우

 public class A

{

    public int m_Int = 0;

}

 

// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 1개 증가

public Function1(A param)

{

    //참조카운터 2 상태 (main에서 사용하는 instance와 이 함수의 param)

    param.m_Int = 100;

   

    // 동일 메모리를 가리키는 하나의 포인터 제거 의미

    // 참조 카운터 1상태 (main에서 사용하는 instance는 메모리에 할당 된 A를 여전히 가리킴)

    param = null;

}

 

// 파라미터로 입력되는 A의 Instance에 대한 참조 카운터가 그대로 유지

public Function2(ref A param)

{

    //참조 카운터가 증가하지 않음

    // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미

    param.m_int = 100;

   

    // param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다.

    // 더이상 main의 instance도 null이다.

    param = null;

 

}

 

 

static void main(string args[])

{

A instance = new A();

Function1(instance);

Console.WriteLine(instance.m_int);  //100 출력, instance는 여전히 메모리에 할당 된 영역 가리킴

 

Function2(instance);

Console.WriteLine(Instance.m_int); // Instance는 null이므로 에러가 발생한다.

 

}

 

Structure의 경우

 public structure A

{

    public int m_Int = 0;

}

 

// 구조체는 instance의 값이 param에 복사된다.

public Function1(A param)

{

    param.m_Int = 100;   

    param = null;

}

 

public Function2(ref A param)

{

    // main의 instance를 param이라는 이름으로 바꿔 쓰는 의미

    param.m_int = 100;

   

    // param이 가리키는 메모리에 대한 참조 카운터가 0이 되어 메모리 에서 릴리즈 된다.

    // main의 instance도 이제 null이다.

    param = null;

 

}

 

 

static void main(string args[])

{

A instance = new A();

Function1(instance);

Console.WriteLine(instance.m_int);  //0 출력, instance는 Function1에 값만 복사 해 줬다.

 

Function2(instance);

Console.WriteLine(Instance.m_int); // Instance의 m_int는 100이 되었다.그러나 instance가 null이 되어

                                                  // 이 문구에서 에러가 발생하게 된다. 

}

 

http://msdn.microsoft.com/en-us/library/0f66670z.aspx 

이 문서를 참조 하였다.

 

'프로그래밍 > 기타' 카테고리의 다른 글

UML-클래스다이어그램 관계 정리  (1) 2015.01.15
Posted by 굿쟌
,

다음과 같은 폼으로 헤더파일을 만들어 주면, #ifndef 전처리 문으로 인해

2번째 선언시에 _CLASS_ 상수가 정의 되어 있어서 중복선언을 막아준다. 

 

전방선언 하고 헤더를 소스파일 cpp에 넣어서 교차포함을 피하는 방법도

있기는 하지만,이것저것 오류가 나는 경우가 굉장히 많았다.

 

이 방법이 그냥 단순무식 하면서도 편하게 코딩 할 수 있는 방법인듯 하다.

 

// class 헤더의 선언

// "class.h"

 

 #ifndef _CLASS_

 

#define _CLASS_                   

#include "포함할 헤더파일"

[클래스 및 함수 선언]

 

#endif

    

 

 

 

 

 

 

 

 

 

 

 

 // class 소스파일

// "class.cpp"

 

#include "stdafx.h"

#include "class.h"

 

[클래스 및 함수 정의]

 

미리 컴파일 된 헤더파일을 사용하면 헤더에 헤더를 포함해 주지 않아도

stdafx.h에 선언된 클래스를 class.h에서 사용 할 수 있다.

 

단, 소스파일에서 stdafx.h를 반드시 추가시켜 줘야 미리 컴파일 된 헤더를 사용할 수 있다.

참고로 stdafx.h 이전에 포함 된 헤더파일은 모두 무시 되니, 이 점을 꼭 고려해야 한다.

 

Posted by 굿쟌
,