- 일부만 인코딩 하기

 

ffmpeg -i Schtraus.pcm -ss 00:00:15 -f mp3 -t 00:00:30 test.mp3

 

- ffmpeg Format 정보

ffmpeg -formats

 

- 1920x1080을 30 fps로 읽어서 mpeg2video 로 만들기 (Bitrate 19M)

 

ffmpeg -f rawvideo -s 1920x1080 -r 30 -i MW105H_YV12_990frames.yuv -r 30 -s 1920x1080 -f mpeg2video -b 19000 test_video.ps

 

 

ffmpeg

ffmpeg -f mpeg2video -i test_video.ps -i test.mp3 -f avi -vcodec copy -acodec copy test_full_HD.avi

 

ffmpeg YUV->mpeg2TS

ffmpeg -f rawvideo -s 1920x1080 -r 30 -i MW105H_YV12_990frames.yuv -r 30 -s 1920x1080 -i test.mp3 -b 19000 -acodec copy test_video.ts

-f

 

 

 

Mplayer MOV->YUV (YUV4mpeg) (H264 -> YUV4mpeg)

Mplayer -rawvideo w=1920 h=1080 -i AAA.mov (output file stream.yuv)

Mplayer -rawvideo w=1280 h=720 -i AAA.mov (output file stream.yuv)

 

Mplayer YUV(YUV4mpeg) -> YUV (YV12 : YVU)

Mplayer -dumpvideo stream.yuv (output file : test.stream -> ex) test_video.yuv)

 

Mplayer MOV->AAC

Mplayer -dumpaudio AAA.mov (output file : test.stream)

 

ffmpeg YUV+AAC -> MPEG-2 TS (1080P)

ffmpeg -f rawvideo -s 1920x1080 -r 24 -i test_video.yuv -i test.mp3 -b 19000 -acodec copy test_video.ts

 

ffmpeg YUV+AAC -> MPEG-2 TS (720P)

ffmpeg -f rawvideo -s 1280x720 -r 24 -i test_video.yuv -i test.mp3 -b 9500 -acodec copy test_video.ts

 

 

 

 

MOV에서 YUV4MPEG 뽑기

./mplayer -vo yuv4mpeg -ao null -rawvideo w=1280 h=720 /home/jinwuk/Work/Test_work/basic_instinct_2_h720p.mov

 

ffmpeg -s 1280x688 -i B_I_YV12.yuv -padtop 16 -padbottom 16 -t 00:00:7 B_I_1280x720.yuv

 

Padding의 경우

ffmpeg -s 1280x544 -r 23.97 -i happy_feet_h720p_1729f.yuv -padtop 88 -padbottom 88 happy_feet_h720p_1729F.yuv

 

 

동기 맞는 오디오 뽑기

./mplayer -vo null -fps 23.976 -af resample=48000 -ao pcm:file=test_B_I.wav /home/jinwuk/Work/Test_work/basic_instinct_2_h720p.mov

 

 

ffmpeg -i test_B_I_48KHz.wav -ar 48000 -ac 2 -ab 192 -f mp3 test_B_I_48KHz.mp3

-

동기 맞는 다중화

ffmpeg -r 23.976 -f h264 -i basic_instinct_2_h720p_3338f_202222_1SL.264 -r 23.976 -f mp3 -i test_B_I_48KHz.mp3 -vcodec copy -acodec copy -r 23.976 -f avi basic_instinct_2_h720p_3338f_202222_1SL.avi

 

 

ffmpeg을 make하기전에 xine을 make한다. (xine-lib)-i ri

dts.h 파일이 깔린다.

 

이 상태에서 ffmpeg을 make 한다.

./configure --enable-gpl --enable-pp --enable-faac --enable-faad --enable-dts --enable-xvid --enable-vorbis --enable-libogg --enable-mp3lame --enable-faadbin

 

MPEG4IP

./configure --enable-server --enable-player --enable-ffmpeg=/home/jinwuk/Program_Files/ffmpeg

 

Makefile 파일 133 line에

FFMPEG_INC = -I/home/jinwuk/Program_Files/ffmpeg/libavcodec

만 있어서 컴파일시 헤더파일 없는 에러 발생

다음과 같이 고쳐준다.

 

FFMPEG_INC = -I/home/jinwuk/Program_Files/ffmpeg/libavcodec

FFMPEG_INC += -I/home/jinwuk/Program_Files/ffmpeg/libavformat

FFMPEG_INC += -I/home/jinwuk/Program_Files/ffmpeg/libavutil

 

Google

mpeg2 TS container

 

Intel Commnad Line

Prompt>nmake -f your_project.mak CPP=icl.exe LINK32=xilink.exe

D:\WORK-2006\Encoder\H264_Work\20060327>nmake /f "lencod.mak" CFG="lencod - Win32 Release" CPP=icl.exe LINK32=xilink.exe

 

 

Resize % MSmpeg4 AVI

ffmpeg -s 1280x720 -r 23.97 -i stream.yuv -vcodec msmpeg4 -f avi -s 320x180 -r 23.97 -b 1000 -ss 00:01:00 -t 00:00:09 happy_small.avi

 

ffmpeg configurat

[root@ecprt2 ffmpeg]# ./configure --enable-gpl --enable-pp --enable-faac --enable-dts

 

 

 

VLC 0.8.4a 버전의 ffmpeg은 ffmpeg-20051126 버전이다.

고로 ffmpeg 최신 CVS를 설치했을 경우 VLC 컴파일이 안되며 별도로 ffmpeg을 설치하여 사용해야 한다.

이때 Configure 옵션은 다음과 같다.

[root@ecprt2 vlc-0.8.4a]# ./configure --with-ffmpeg-tree=/home/jinwuk/Program_Files/Miscellious_program/ffmpeg-20051126

 

이것은 Local ffmpeg에서의 static library를 사용한 compile이므로 주의하여야 한다

 

 

동기화 다중화 문제

Mplayer, ffmpeg 버전에 따라 문제가 발생할 수 있다.

 

Mplayer는 가급적 최신 버전을

ffmpeg은 안정화 버전을 사용하는 것이 좋다.

encoder.cfg 에서 frame rate를 정확히 적어 주어야 한다.

디코더가 H.264 헤더 정보를 보고 그에 따라 다중화를 수행한다.

 

비디오 오디오 한번에 뽑기 (chapter 3만)

mplayer -vo yuv4mpeg -rawvideo w=720 -rawvideo h=480 -af resample=48000 -af volume=15 -ao pcm:file=kaeda_t02.wav dvd://1 -chapter 3-3

 

AVI 파일의 비디오 오디오 매핑 변환을 통해 오디오 전환

ffmpeg -i HD_H264_0001_480SD.avi -i HD_H264_0001_480SD.wav -map 0.0:0.0 -map 1.0:0.1 -vcodec copy -f avi HD_H264_0001_480SD_L.avi

 

 

MP4Creator

mp4creator -rate=29.970 -create=Kaeda_1.264 Kaeda_1.mp4 (First Video)

mp4creator -create=Kaeda_1.mp3 Kaeda_1.mp4 (Second Audio)

 

MP4Box -hint -mtu 1024 -fps %1 -add %2 %2.mp4

 

-create

 

"The reason why sometimes vlc doesn't work is that when muxing to TS it expects to find AVC in bytestream format (NALS prefixed by 0x000001 as mpeg1/2/4), that for is never the case when the original stream is contained in mp4/mov and sometimes in avi (when the fourcc is avcc). In cases like those AVC is in raw NAL format, that unfortunately can only be muxed in SL substreams when inserted in TS (that vlc doesn't even read)."

 

 

h264 PSM (type 0x1b?)

 

./configure --disable-mencoder --disable-x264 --disable-mad --disable-faac --with-livelibdir=/home/jinwuk/Program_Files/live/ > configure_result.txt

 

JPEG 파일 뽑기

mplayer -vo jpeg:outdir=./figure -fps 30 cv_st.264

 

[no]progressive Specify standard or progressive JPEG. [no]baseline Specify use of baseline or not. optimize=<value> Optimization factor [0-100] smooth=<value> Smooth factor [0-100] quality=<value> Quality factor [0-100] outdir=<value>

mplayer H.264 debugger 사용하기

mplayer -vo jpeg:outdir=./figure -lavdopts debug=0x4000:vismv=3:gray -fps 30 pr_rb.264

 

Windows에서 Telnet 사용

제어판->서비스 에서 Telnet 구동

제어판->컴퓨터관리->사용자 에서 Telnet 사용자 등록 그룹은 Administrator 혹은 TelnetClient 로 등록

 

Deinterlace & 시작점

mpalyer -vo yuv4mpeg -vf pp=fd -ss 33:00 mpeg.ts

ffmpeg Deinterlaced filter 사용 다른 필터의 경우는 man page

 

VISIO에서 EPS 만들때는 AI format check 할 것 Level 3.0 recommend

 

 

AAC 인코딩

faac -X -P -b 218 -C 2 -R 48000 -o take_the_lead_h720p.aac take_the_lead_h720p.wav

 

bitrate 는 192kbps 이어야 하나 여기에 26kbps 를 더해야 한다.

 

Paypal pw: sj1612!1

Rapid_share : pw 1612sofm

http://rapidshare.de/files/13413024/dmode_attackk_III_02.zip.html1612

 

login

1845018

pw

453751

 

 

Account arrived! Please write it down!

Login: 102692

Password: 750851

Valid until: Thu, 30. Nov 2006

 

PWs

祝喵大dMOdE生日快樂by MWZG and 不歸之森

VOID-SHARE_ON_MWZG_ONLY

 

 

 

winavi

http://www.winavi.com/video-converter.htm

 

./mono -f 1080i60 -asp 16 9 -o component_yuv_m2 http://129.254.189.204/take_the_lead_h720p_right_mp3_byela.ts

 

 

Mplayer 현재 컴파일 옵션

./configure --enable-live --with-livelibdir=/home/jinwuk/Program_Files/live --disable-mencoder --disable-mad --disable-faac

 

 

MP4Creator : 비디오/오디오 hinted mp4 다중화

mp4creator -hint -rate 23.97 -create=take_the_lead_h720p_f3553_qp202022_ffrf0.264 -create=take_the_lead_h720p.mp3 take_the_lead_h720p_mp4cr.mp4

 

 

Darwin Server에서는 hinted mp4만 먹는다. 아울러 mp4creator 에서 생성된 것만 가능

Mplayer는 RTP Payload 타입이 맞지 않아 잘 안된다. Live555를 수정해야 함

RFP3984 Type RTP Payload 는 H.264 용

VLC 에서 mp4 의 RTP Payload Type을 알아보자.

 

 

Intel Compiler와 SDK

1. Platform SDK 2003 SP 1 만 가능하다.

2. Typical로 설치해야만 한다.

3. DirectSDK 9.0 을 설치해야 한다, c:\dxsdk

4. Intel Compiler 설치시 OPtion으로 환경변수가 자동으로 들어가도록 하면 편하다.

5. Intel Compiler 는 Platform SDK가 설치되었을 경우 자동으로 경로를 인식한다. (실은 세팅되어 있다. 셋팅되어 있지 않을 경우 bin\icl.cfg 를 통해 셋팅할 수 있다.)

6. Intel Compiler 에서 Link시 문제가 되면 Link Option (LINK32_FLAGS= …) 를 통해 조정하면 된다. 예를들어 /machine:AMD64 같은 것 … AMD64 용 Pass라는 의미

7. SDK를 사용하여 다른 플랫폼용 (windows server 2003 EM64T 등 단 64bit는 OS가 지원하지 않으면 소용이 없다.) Application을 만들 수 있다.

8. SDK VC가 깔린 다음 인텔 컴파일러를 깔아야 한다.

9. icl \help > icl_help.txt 로 컴파일러 옵션을 알 수 있다. 대단히 많다.

10. 인텔 컴파일러의 라이센스는 C:\Program Files\Common 에 있다.

 

VLC컴파일에서는 ffmpeg 약간 예전 버전이 필요하다…

이를 고려하여 ffmpeg을 두벌 사용해야 한다. 신버전/구버전

VLC는 구버전 특히 pre 버전에서 안정하며 svn 버전에서는 컴파일이 잘 안된다.

 

LAME mp3 encoder Option

lame -s 48 -b 192 FileTest4.wav FileTest4.mp3

 

Deinterlace Option

Mplayer :

-vop lavcdeint

-vf pp=fd/ffmpegdeint

 

 

Ffmpeg을 사용한 편집 및 YUV 추출

: 파일 시스템을 전적으로 사용한다는 점에서 mplayer 보다 좋으며 편집이 용이하다.

 

ffmpeg –I data.mpg –deinterlace –ss start_time(sec) –t duration_time(sec) –f yuv4mpegpipe stream.yuv

 

ffmpeg –s 1920x1080 –r 29.97 –I stream.yuv –s 1920x1080 –r 29.97 I420data.yuv

 

mplayer 사용한 wave 뽑기

mplayer –vc null –vo null –af resample=48000 … -ao pcm:file=aaa.wav aaa.mp3

 

ffmpeg 사용한 mp3

ffmpeg –i data.wav –ar 48000 –ab 192 –ac 2 –f mp3 data.wav

 

 

Value STB 문제

- 1080P30 의 경우 1080P60으로 두배 높게 TV에 뿌려 줘야 정상적으로 화면이 보인다.

- 사이즈 문제의 경우 자동으로 사이즈를 맞추면 된다. 16:9로 맞출 경우 3% 가량 잘리는 현상이 발생한다.

- 1080P30의 경우 –f edid 일때 1080P를 720P로 오 인식하는 문제가 있다. 이것은 HDMI 초기 세팅이 잘못될 경우 발생하는 문제로서 GLOBALSET.ini 에서

-f edid -> -f HDMI_1080p60 으로 맞춘다음

-asp 16 9 를 –asp 0 0 으로 바꾸면 사이즈 및 1080P 문제가 해결된다.

한번 1080P로 맞추어 지면 그 다음에는 자동적으로 1080P로 맞추어진다.

 

 

 

-TS ㅡ Muxer Bug report

Bug code

void inherit_au(au_t *parent, au_t *child)

{

memcpy(child->sps + 0, parent->sps + __max(parent->no_sps - 1, 0), sizeof(sps_t));

memcpy(child->pps + 0, parent->sps + __max(parent->no_pps - 1, 0), sizeof(pps_t));

}

 

Right code

void inherit_au(au_t *parent, au_t *child)

{

memcpy(child->sps + 0, parent->sps + __max(parent->no_sps - 1, 0), sizeof(sps_t));

memcpy(child->pps + 0, parent->pps + __max(parent->no_pps - 1, 0), sizeof(pps_t));

}

 

VC++ 6.0 에서 ASM 컴파일 하는 법

1. Project 파일에 일단 ASM 파일 넣는다.

2. Project 안의 ASM 파일의 Project Setting (혹은 Setting)을 통해 Project Setting 한다.

3. Custom Build 선택하여 다음과 같이 세팅한다.

 

Commands

Description

Assembling $(InputPath)

 

Release :

nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj $(InputPath)

 

Debug :

nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj $(InputPath)

 

Output :

$(IntDir)\$(InputName).obj

 

Installation of a new version of ffmpeg for windows

http://ffmpeg.mplayerhq.hu/documentation.html

download the new version of ffmpeg from the above site

http://sourceware.org/pthreads-win32/

download the pthreadGC2.dll from the above site.

Copy the ffmpeg and pthreadGC2.dll to a particular folder.

 

 

Mplayer

To show the parameters of decoding process,

Edit ./mplayer/config as quite=yes to #quite=yes

 

 

PRN->EPS

Adobe Postscript Printer 선택

Eps 파일로 저장

 

%%BoundingBox: 0 0 510 390 부분 (좌측 하단 원점, 우측 상단이 좌표점) 수정

 

/mysetup [ 72 600 V 0 0 -72 600 V 0.0 583.00128 ] def 의 3번째 부분을 수정하여 맞춤

 

Paypal seokjeff@hitel.co.kr

Newpaypal passwd : 1612sofm

 

RapidShare

Login: 1393322

 

Password: 830587517

Valid until: Sun, 9. Sep 2007

 

 

PTS/DTS/PCR

 

PTS/DTS

PTS 는 DTS 보다 최소한 1 프레임 뒤에 나타나도록 만들어야 한다.

Time_scale : 29.97 이면 보통 30000 (frame_rate x 1000)

Num_unit_in_tick : time_scale/frame_rate = 30000/29.97=1001

 

PCR 문제

 

 

 

 

 

Ffmpeg 에서 fixel format

-pix_fmt 여기에서 yuv420, yuv422 등을 정할 수 있다.

 

지원 포맷 yuv420p, yuv422p, yuv444p, yuv411p, gray

Bgr24 로 raw 데이터가 되어 있는 경우 유용하다. Yuv4pegpipe를 쓰지 않아도 된다.

 

 

VC2005 로 인코딩된 Application 실행 문제

0xc050001 error 발생은 Microsift.VC80.CRT_XXXXXX.maniesto 관련 파일 및 디렉토리를

Windows\WinSxS 에서 찾는다.

해당 디렉토리의 Manifest, Profiles 디렉토리 밑의 파일들과 WinSxS 디렉토리들을 모두 카피하여

Windows\WinSxS 밑에 카피하면 해결된다.

 

해당 디렉토리는 Visual C++ 2005 즉, VC8.0 버전의 기계어 코드/ 어셈코드들을 담고 있는 system file 로서 해당 Microsift.VC80.CRT_XXXXXX.maniesto 파일에는 MSVCR80.dll, MSVCP80.DLL, MSVCM80.dll과 Application을 연결해 주는 매개 역할을 한다.

 

 

Conversion of 5.1 channel audio to 2 channel audio

There is no way without using mplayer

 

mplayer -vo null -noframedrop -ao pcm:file=HitachHD.wav -af channels=2 HitachHD_P10.avi

(HitachHD.wav inludes a PCM audio with 5.1 channel)

 

 

Registry Booster Serial Number

RB-0HRX57-NWYFR1-30KG32-VKY3WQ-X2X907

 

SpeedUpMyPC3

SP-00Y7MH-M5TY2T-3T6WVX-6MN88H

 

DVD Play

mplayer -vo yuv4mpeg -rawvideo w=720 -rawvideo h=480 -af channels=2 -afvolume=15 -ao pcm:file=aaa.wav -dvd-device e: dvd://1_1

 

 

 

mencoder -dvd-device e: dvd://1_1 -ovc copy -oac copy -o dvd_me.avi

 

 

Visual C++ 2005에서 LoadLibrary의 DLL이 놀라오지 않는 문제

if ((m_hdll = LoadLibrary("TSMux_DLL.dll")) == NULL)

{

printf("LoadLibrary(TSMux_DLL.dll) Error");

exit(0);

}

 

Project Properties 에서

General -> Character Set 에서

Use Unicode Character Set 를

Use Multi-Byte Character Set 로 바꾸어 준다. 그래야 특수 문자 혹은 일반 문자들이 제대로 인식됨

 

 

DLL에 있는 함수들이 제대로 인식되지 않는 문제

CPP로 만들어진 DLL의 경우에는 DLL의 함수 이름들이 암호화 되어서 나온다.

이 경우에는 Visual C++의 Tool인 Dumpbin 을 사용하여

(dumpbin은 Visual C++에 있는 Commandline 창을 사용하여야만 실행시킬 수 있다.)

 

Dumpbin /export aaa.dll

 

을 통해 암호화된 함수를 GetProcAddress 로 매핑 시켜주면 된다.

 

더 좋은 방법은 다음과 같이 하는 것이다.

 

이 문제는 CPP에 의해 발생한 것이므로 CPP 대신 c로 선언해준다. 즉

#define DLL_DECL __declspec(dllexport)

 

extern "C" DLL_DECL void TS_Initial_process (H264VideoParameter *h264param, pes_t *audio_pes, long *read_size, ETRIFile *v_src, ETRIFile *a_src, ATYPE atype);

 

 

 

c:\document and Settings\User\Local Settings\Temp\Temporary Internet Files 다 지우기.,..

 

 

TSMux dll 을 인텔컴파일러로 컴파일 할 경우 LIBMMD.DLL을 함께 카피해 주어야 한다. (인텔 컴파일러에 있는 것을 카피해 주어야 한다.)

 

 

TSMux VC 6.0 으로 컴파일시 에러 발생하면…

TSMux_EXE pchi 파일 때문에 발생하므로….

1.     먼저 rebuild all을 수행한다.

2.     sys/stat.h 에서 에러가 발생하면 TSMux_EXE pchi 파일을 지우고 Build TSMux_EXE (F7) 을 수행한다.

3.     에러가 계속되면 다시 2번을 반복한다. 될때까지…

 

VC6.0에서 __int64형 printf 옵션 %I64d 다음과 같이 하면 된다.

%9I64d

  s

* Pre-Proessing과 Bit-rate 관계

-움직임이 많으며 조명 변화가 심하다.

- 매우 높은 고주파 성분이 많은 부분이 여러 화면에서 나타난다.

 

HD_Unee_Processed

720x480

5852 frames

3,032,807,660 Bytes

1 :

Resize

Internal Deinterlaced

Smart Deblocking

Color Space : IYUV

5514.3 Kbps : 22, 20, 20

Wrong Test !!

 

2:

Internal Deinterlaced

Smart Deblocking

Resize

7482.9 Kbps

3:

Deinterlaced MAP (Default)

Smart Deblocking

Resize

8766.2 Kbps

4:

Smart Deblocking

Resize

8195.2Kbps

 

5:

Internal Deinterlaced

Resize

7721.5Kbps

 

6:

Deinterlaced MAP (Default)

Resize

9036Kbps

현재까지는 Internal Deinterlacing과 Smart De-interlacing이 좋은 방법이다.

 

7.

Resize (BiCubic A=0.75)

9175Kbps

 

 

Virtual-Dub 실행시Application Error 0xc0150002 발생 원인

Microsoft.VC80.DebugCRT 관련 파일들이 windows/winSxS 에 없기 때문이다.

복사해주고 컴을 다시 켜주면 된다.

 

만일 해당 프로그램이 없으면 Windows/WinSxS 아예 windows update를 통해 VS2005SP1 서비스팩 1을 받아 깐다.

그래도 안되면..

 

Virtual-Dub 컴 파일 오더

1. 전체 Rebuild

2. Riza build

3. Virtual-dub Rebuild

4. Aska build

 

 Linux에서 파일 분할 방법

split -b 10000000K test.ts

->xa , xb, ....

 

cat xa? > test.ts

 

Intel Compiler 10.0 이상에서 E264_VFW 제대로 컴파일 되지 않던 문제

Intel Compiler에서는 DLL 내부 함수의 Export는 무조건 __declspec(dllexport) 를 붙여 주어야만 한다.

DriveProc.def 보면 함수 2개 즉,

DriverProc

Configure

가 export 되어야 한다. 그런데 이전 에는 다음과 같이 되어 있어, Link 에러가 발생했다.

 

LRESULT WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lParam1, LPARAM lParam2 )

 

다음과 같이 바꿔주고 컴파일 시 보통 클린 정도가 아닌 프로젝트 클린을 해준 다음,  rebuild 한다.

LRESULT __declspec(dllexport) WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lParam1, LPARAM lParam2 )

 

 

파일 비교하는 콘솔 명령어 fc foo.exe와 foo2.exe 비교 

 fc /b foo.exe foo2.exe > out.txt

 

MPEG-2 트랜스 코딩

- 최신 ffmpeg, ffdshow는 에러 발생

- 2007년 2월 이전 버전의 경우 에러가 없다.

- ffmpeg 으로 MPEG2 PES 로 바꾸어야 하며 포맷은 "vob" 이다.

- 단, ffmpeg은 2007년 2월 이전 버전, 최소 7월 이전 버전을 사용하여야 에러가 발생하지 않는다.

- ffmpeg으로 2007년 2월 이전 버전으로 vob 포맷으로 바꾼 후, virtual-dub for MPEG-2 1.6.2 버전을 사용하여 인코딩등을 수행한다.

- virtual-dub도 최신 버전은 vob를 인식하지 못한다.

 

 

Vdub 사용 

vdub /s .\200809\test_001.vcf /capture /capfile test_001.avi /capstart

VirtualDub CLI Video Processor Version 1.8.1 (build 29879/release) for 80x86

Copyright (C) Avery Lee 1998-2008. Licensed under GNU General Public License

Connected to capture device: Logitech QuickCam Pro 5000 (DirectShow)

Starting capture to: test_001.avi

Attempting to abort, please wait....

Capture was completed successfully.

 

간단한 VC2008 컴파일된 프로그램 실행법

 C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT 이 경로에 있는 모든파일을 다 복사해서 실행(exe)파일에 같이 넣어두면 돼요 ^^

Microsoft.VC90.CRT.manifest, msvcm90.dll, msvcp90.dll, msvcr90.dll 요고 4개만 복사하면 돼요 ^^

 

IEEE membership

User Name

jinwuk_seok

PW (is equal to member #)

41307554

 

suf5.0

password : 0000

 

시작프로그램으로 만드는 방법

HKEY_ LOCAL_MACHINE> Software> Microsoft> Windows> CurrentVersion> Run 에서

오른쪽 창의 빈 곳을 마우스의 오른쪽 버튼을 클맄-> “ 문자열 값 “ 을 고른다.

 

예를 들어.... 새로운 “ 문자열 값 “ 을 <탐색기>라고 하고 “ 값의 데이터 “ 란에

탐색기의 [실행파일 경로를 입력]하면 작업이 끝나고 재 부팅시 탐색기가 곧바로 실행된다 

 

현재 인코더에는 ETRI_Full_HD_Encoder 라는 이름으로 BAT 파일의 내용이 시작 프로그램으로 등록되어 있음

 

윈도우 시작시 자동로그온방법

regedit-->HKEY_LOCAL_MACHINE>SOFTWARE>Microsoft>WindowsNT>CurrentVersion>Winlogon항목에서

오른쪽마우스 클릭하여 새문자열값으로 다음값을 등록한다

이름 값

AutoAdminLogon ---> 1

DefaultUserName ---> 유저명(사용하시는 유저명) : 이 항목은 보통 만들어져 있다

DefaultPassword --->패스워드(유저의 패스워드) : 지정없이 사용할때는 값을 공란으로 둔다

현재는

AutoAdminLogon ---> 1

DefaultUserName ---> sjw

DefaultPassword --->root00

 

 

시간, Time 함수

#include <windows.h>

 

__int64 freq, start, end;

if (QueryPerformanceFrequency((LARGE_INTEGER*)&freq));

{

  QueryPerformanceCounter((LARGE_INTEGER*)&start);

 

  // Job

 

  QueryPerformanceCounter((LARGE_INTEGER*)&end);

  a = (float)((double)(end - start)/freq * 1000));

}

 

 

 

d:\WORK-2009>shutdown /?

사용법: shutdown [-l | -s | -r | -a] [-f] [-m \\컴퓨터 이름] [-t xx] [-c "설명"] [-d up:xx:yy]

        No args                 이 메시지를 표시합니다.(-?와 동일)

        -i                      GUI 인터페이스 표시합니다.(처음 옵션이어야 합니다.)로그오프합니다. (-m 옵션과 함께 사용될 수 없음)

        -s                      시스템을 종료합니다.

        -r                      시스템을 종료한 후 다시 시작합니다.

        -a                      시스템 종료를 중단합니다.

        -m \\컴퓨터 이름        원격 컴퓨터를 종료/다시 시작/중단합니다.

        -t xx                   시스템 종료의 만료 시간을 xx초로 설정합니다.

        -c "설명"               시스템 종료 설명을 지정합니다. (최대 127 문자)

        -f                      실행 중인 응용 프로그램을 경고 없이 강제로 종료합니다. 응용 프로그램 강제 종료하고 시스템 로그 오프

        -d [u][p]:xx:yy 종료에 대한 이유코드를 지정합니다.

                                u: 사용자 코드

                                p: 계획된 종료 코드

                                xx: 주 이유 코드 (256 보다 작은 양수)

                                yy: 부 이유 코드 (65536 보다 작은 양수)

 

 

 

 

d:\WORK-2009>tasklist /?

TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]]

         [/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]

설명:

    이 명령줄 도구는 현재 로컬 또는 원격 시스템에서  실행되고 있는 응용 프로그램 및 관련 작업/프로세스 목록을 표시합니다.

 

매개 변수 목록:

   /S     시스템           연결할 원격 시스템을 지정합니다.

   /U     [domain\]user    명령을 실행해야 하는 사용자 컨텍스트를 지정합니다.

   /P     [암호]           해당 사용자 컨텍스트의 암호를 지정합니다.  생략한 경우에는 물어봅니다.

   /M     [모듈]           해당 패턴 이름과 일치하며 DLL 모듈이 로드된 모든 작업을 나열합니다. 모듈 이름을 지정하지 않으면 각 작업에서 로드한 모든 모듈을 표시합니다.

   /SVC                    각 프로세스에 있는 서비스를 표시합니다.

   /V                      자세한 정보를 표시하도록 지정합니다.

   /FI    필터             필터에서 지정한 조건과 일치하는 작업 집합을 표시합니다.

   /FO    형식             출력 형식을 지정합니다. 사용할 수 있는 값: "TABLE", "LIST", "CSV".

   /NH                     출력에 표시하지 않을 "열 머리글"을 지정합니다. "TABLE"과 "CSV" 형식에서만 사용할 수 있습니다.

   /?                      이 도움말/사용법을 표시합니다.

 

필터:

    필터 이름       유효한 연산자             유효한 값

    -----------     ---------------           --------------

    STATUS          eq, ne                    RUNNING | NOT RESPONDING

    IMAGENAME       eq, ne                    이미지 이름

    PID             eq, ne, gt, lt, ge, le    PID 값

    SESSION         eq, ne, gt, lt, ge, le    세션 번호

    SESSIONNAME     eq, ne                    세션 이름

    CPUTIME         eq, ne, gt, lt, ge, le    CPU 시간

                                              (hh:mm:ss 형식)

                                              hh - 시간,

                                              mm - 분, ss - 초

    MEMUSAGE        eq, ne, gt, lt, ge, le    메모리 사용(KB)

    USERNAME        eq, ne                    사용자 이름([domain\]user

                                              형식)

    SERVICES        eq, ne                    서비스 이름

    WINDOWTITLE     eq, ne                    창 제목

    MODULES         eq, ne                    DLL 이름

예:

    TASKLIST

    TASKLIST /M

    TASKLIST /V

    TASKLIST /SVC

    TASKLIST /M wbem*

    TASKLIST /S 시스템 /FO LIST

    TASKLIST /S 시스템 /U domain\username /FO CSV /NH

    TASKLIST /S 시스템 /U 사용자 이름 /P 암호 /FO TABLE /NH

    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

d:\WORK-2009>

 

 

Commandline에서 Application 죽이기

taskkill /F /FI "IMAGENAME eq vdub.exe" /T

 

vdub.exe와 관련된 모든 모듈이 죽는다.

taskkill /? 를 통해 각 옵션의 특성을 알아본다.

 

taskkill /F /IM vdub.exe /T

 

도 같은 의미임

 

 

 

Visual C++ 6.0 으로 진행되던 프로젝트를 Visual C++ 2005로 포팅하게 되면(Visual C++ 2005 툴을 이용한 Project 변환 이용) WINVER 가 정의 되지 않아 Default 값인 Windows Server 2003으로 설정된다는 메세지를 보게 된다.

(VC 2008 이상에서도 마찬가지다. 따라서 StdAfx.h 파일에 #include <afxwin.h> 위 부분에 #define WINVER 0x0501 (XP의 경우) 를 넣어 주면 된다.)

WINVER not defined. Deafaulting to 0x0502 (Windows Server 2003)

만들고 있는 프로젝트가 지원해야 할 최소 OS 를 설정하기 위해서는 WINVER를 설정해야 한다.

 

설정값은 다음과 같다.

 

 

Minimum system required

Macros to define

Windows Vista

_WIN32_WINNT>=0x0600

WINVER>=0x0600

Windows Server 2003

_WIN32_WINNT>=0x0502

WINVER>=0x0502

Windows XP

_WIN32_WINNT>=0x0501

WINVER>=0x0501

Windows 2000

_WIN32_WINNT>=0x0500

WINVER>=0x0500

Windows NT 4.0

_WIN32_WINNT>=0x0400

WINVER>=0x0400

Windows Me

_WIN32_WINDOWS=0x0500

WINVER>=0x0500

Windows 98

_WIN32_WINDOWS>=0x0410

WINVER>=0x0410

Windows 95

_WIN32_WINDOWS>=0x0400

WINVER>=0x0400

 

 

 

 

 

netstat /?

프로토콜 통계 및 현재 TCP/IP 네트워크 연결을 표시합니다.

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p 프로토콜] [-r] [-s] [-v] [시간]

  -a            모든 연결 및 수신 대기 포트를 표시합니다.

  -b            각 연결 또는 수신 대기 포트를 만드는 데 관련된 실행 프로그램을

                표시합니다. 잘 알려진 실행 프로그램에서 여러 독립 구성 요소를

                호스팅하는 경우에는 연결 또는 수신 대기 포트를 만드는 데

                관련된 구성 요소의 시퀀스가 표시됩니다. 이런 경우에는

                실행 프로그램 이름이 아래쪽 대괄호 안에 표시되어 있고 위에는

                TCP/IP에 도달할 때까지 호출된 구성 요소가 표시되어 있습니다.

                이 옵션은 시간이 오래 걸릴 수 있으며 사용 권한이 없으면

                실패합니다.

  -e            이더넷 통계를 표시합니다. 이 옵션은 -s 옵션과 같이 사용될

                수 있습니다.

  -n            주소 및 포트 번호를 숫자 형식으로 표시합니다.

  -o            각 연결의 소유자 프로세스 ID를 표시합니다.

  -p 프로토콜   지정한 프로토콜에 해당되는 연결을 표시합니다. 프로토콜은

                TCP, UDP, TCPv6 또는 UDPv6 중 하나입니다. -s 옵션과 함께

                사용하여 프로토콜별 통계를 표시할 경우 프로토콜은 IP, IPv6,

                ICMP, ICMPv6, TCP, TCPv6, UDP 또는 UDPv6 중 하나입니다.

  -r            라우팅 테이블을 표시합니다.

  -s            프로토콜별로 통계를 표시합니다. 기본값으로 IP, IPv6, ICMP,

                ICMPv6, TCP, TCPv6, UDP 및 UDPv6에 관한 통계를 표시합니다.

                -p 옵션을 함께 사용하면 기본값의 일부 집합에 대한 통계만

                표시할 수 있습니다.

  -v            -b 옵션과 함께 사용하면 모든 실행 프로그램에 대한 연결

                또는 수신 대기 포트를 만드는 데 관련된 구성 요소의 시퀀스를

                표시합니다.

  시간          다음 화면으로 이동하기 전에 지정한 시간 동안 선택한 통계를

                다시 표시합니다. 통계 표시를 중단하려면 CTRL+C를 누르십시오.

                지정하지 않으면 현재 구성 정보를 한 번 표시합니다.

 

****모든 프로그램의 옵션에서 멀티바이트 코드를 사용하여야 정확하게 문자열이 표현된다.

 

msconfig 을 사용하여 서비스등 사용되고 있는 windows의 서비스등을 중지 시키거나 할 수 있다. 

Apache 서버 동작 안하는 경우

1. IIS 서버와 충돌하는 경우 -> IIS 서버를 중지시킨다.

2. httpd.conf 를 정확하게 써준다.

   예) Documnet Root 와 Document Directory는 항상 일치해야 한다.

3. 윈도우즈 방화벽 예외로 httpd.exe를 설정해 주어야 한다.

 

셋탑 ID

        root

pw : etri

 

MSN

ID : sderoen@htmail.com

PW : sj1612

 

 

_mm_mpsadbw_epu8

Microsoft Specific

Emits the Streaming SIMD Extensions 4 (SSE4) instruction mpsadbw. This instruction computes multiple packed sums on the absolute value of the difference between two parameters.

A 128-bit result that contains eight 16-bit unsigned integers. The values of these integers can be computed as follows:

 Copy Code

i = mask2 * 4

j = mask0-1 * 4

for (k = 0; k < 8; k = k + 1) {

        t0 = abs(a[i + k + 0] - b[j + 0])

        t1 = abs(a[i + k + 1] - b[j + 1])

        t2 = abs(a[i + k + 2] - b[j + 2])

        t3 = abs(a[i + k + 3] - b[j + 3])

        r[k] = t0 + t1 + t2 + t3

}

 Requirements

Intrinsic

 Architecture

 

_mm_mpsadbw_epu8

 x86, x64 

Header file <smmintrin.h>

 Remarks

a[n] and b[n] indicate the nth ordered unsigned 8-bit integer of parameters a and b where a[0] and b[0] are the lowest 8 bits. r[n] is the nth ordered unsigned 16-bit element of result r, where r[0] refers to the lowest 16 bits. mask0, mask1, and mask2 are the three least significant bits of parameter mask.

Before you use this intrinsic, software must ensure that the processor supports the instruction.

 Example

 Copy Code

#include <stdio.h>

#include <smmintrin.h>

int main ()

{

    __m128i a, b;

    // A mask value of 0101 (5) will add four to each index

    const int mask = 5;

    a.m128i_u8[0] = 15;

    a.m128i_u8[1] = 60;

    a.m128i_u8[2] = 55;

    a.m128i_u8[3] = 31;

    a.m128i_u8[4] = 0;

    a.m128i_u8[5] = 1;

    a.m128i_u8[6] = 2;

    a.m128i_u8[7] = 4;

    a.m128i_u8[8] = 8;

    a.m128i_u8[9] = 16;

    a.m128i_u8[10] = 32;

    a.m128i_u8[11] = 64;

    a.m128i_u8[12] = 128;

    a.m128i_u8[13] = 255;

    a.m128i_u8[14] = 1;

    a.m128i_u8[15] = 17;

    b.m128i_u8[0] = 2;

    b.m128i_u8[1] = 4;

    b.m128i_u8[2] = 8;

    b.m128i_u8[3] = 64;

    b.m128i_u8[4] = 255;

    b.m128i_u8[5] = 0;

    b.m128i_u8[6] = 1;

    b.m128i_u8[7] = 16;

    b.m128i_u8[8] = 32;

    b.m128i_u8[9] = 64;

    b.m128i_u8[10] = 128;

    b.m128i_u8[11] = 255;

    b.m128i_u8[12] = 75;

    b.m128i_u8[13] = 31;

    b.m128i_u8[14] = 42;

    b.m128i_u8[15] = 11;

    __m128i res = _mm_mpsadbw_epu8(a, b, mask);

    __m128i final;

    int temp1, temp2, temp3, temp4, index;

    for (index = 0; index < 8; index++)

    {

        temp1 = abs(a.m128i_u8[4 + index] - b.m128i_u8[4]);

        temp2 = abs(a.m128i_u8[4 + index + 1] - b.m128i_u8[4 + 1]);

        temp3 = abs(a.m128i_u8[4 + index + 2] - b.m128i_u8[4 + 2]);

        temp4 = abs(a.m128i_u8[4 + index + 3] - b.m128i_u8[4 + 3]);

        final.m128i_u16[index] = temp1 + temp2 + temp3 + temp4;

    }

    printf_s("Res0 should be %d: %d\nRes1 should be %d: %d\n",

                final.m128i_u16[0], res.m128i_u16[0],

                final.m128i_u16[1], res.m128i_u16[1]);

    printf_s("Res2 should be %d: %d\nRes3 should be %d: %d\n",

                final.m128i_u16[2], res.m128i_u16[2],

                final.m128i_u16[3], res.m128i_u16[3]);

    printf_s("Res4 should be %d: %d\nRes5 should be %d: %d\n",

                final.m128i_u16[4], res.m128i_u16[4],

                final.m128i_u16[5], res.m128i_u16[5]);

    printf_s("Res6 should be %d: %d\nRes7 should be %d: %d\n",

                final.m128i_u16[6], res.m128i_u16[6],

                final.m128i_u16[7], res.m128i_u16[7]);

    return 0;

}

 Copy Code

Res0 should be 269: 269

Res1 should be 267: 267

Res2 should be 264: 264

Res3 should be 290: 290

Res4 should be 342: 342

Res5 should be 446: 446

Res6 should be 653: 653

Res7 should be 588: 588

 

mask의 의미

_mm_mpsadbw_epu8(a, b, mask);

에서

a Destimation

b Source

mask bit 는 3비트로서 [1:0] 은 src의 4바이트로 된 하나의 그룹을 가리킨다. 즉,

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 의 16개 1 bute로 src가 구성되어 있다면

00 : 3 2 1 0

01 : 7 6 5 4

10 : 11 10 9 8

11 : 15 14 13 12

 를 의미한다.

maskbit[2]는 DST의 11 바이트로 된 두개의 그룹중 하나를 가리킨다. 즉,

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 의 16개 1 bute로 DST가 구성되어 있다면

0 : 10 9 8 7 6 5 4 3 2 1 0 : 11 byte

1 : 14 13 12 11 10 9 8 7 6 5 4 : 11 byte

이것이 슬라이딩 하면서 4 byte 단위로 SAD 값을 한꺼번에 계산한다.

_mm_minpos_epu16

include <stdio.h>

#include <smmintrin.h>

int main ()

{

    __m128i a;

    a.m128i_u16[0] = 127;

    a.m128i_u16[1] = 10000;

    a.m128i_u16[2] = 65535;

    a.m128i_u16[3] = 1;

    a.m128i_u16[4] = 2;

    a.m128i_u16[5] = 64;

    a.m128i_u16[6] = 314;

    a.m128i_u16[7] = 27;

    __m128i res = _mm_minpos_epu16(a);

    printf_s("Result res:\t%d\t%d\t%d\t%d\n\t\t%d\t%d\t%d\t%d\n",

                res.m128i_u16[0], res.m128i_u16[1], res.m128i_u16[2],

                res.m128i_u16[3], res.m128i_u16[4], res.m128i_u16[5],

                res.m128i_u16[6], res.m128i_u16[7]);

    return 0;

}

Result res:     1       3       0       0       0       0       0       0

res.m128i_u16[0]은 값, res.m128i_u16[1]은 Position

 

res = _mm_shuffle_epi32(s0, 0x44);

s0의 하위 64 bit 상위 64bit로 그대로 카피하는 명령어다.

 

ffmpeg 큰 파일 자르기

ffmpeg은 큰 파일은 쓰지 못한다. 4GB 이상은 못쓴다. 따라서 나누어야 한다.

win-command 의 파일 메뉴에 파일 자르기 메뉴가 있다. 이걸로 일단 적절히 나눈다. 4000 MB

TS 이므로 나누어진 파일은 전혀 문제가 없다.

 

 

 

즎 부팅 속도 향상

다음에 설명하는 방법은 MS에서 권장하는 방법이 아닌 ‘꽁수’에 해당한다(Prefetch 기술). Prefetch에 대해 설명하면 윈도우의 부팅 커널까지 포함하여 모든 프로그램 실행시 실행됐던 기계어와 실행하는 데 필요한 DLL 파일들의 주소를 파일에 저장해 놓고, 다음 번에 실행시 정보를 저장한 파일을 읽어 미리 하드디스크에서 RAM으로 로딩하게끔 하는 기술이다

 

짾 regedit 실행

짿 HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters로 이동

쨁 EnablePrefetcher를 더블클릭해 값을 0으로 해준다.

쨂 재부팅시에는 windowsprefetch에 파일이 저장되지 않는다. 참고로 1은 응용 프로그램 실행시, 2는 부팅시, 3은 언제나 사용하게끔 되어 있다. 기본 값은 3.

Sync 문제 없는 Virtual-Dub 용 입력 컨텐츠

ffmpeg -i "2008-12-29(월)오후103847-CADTV6-1-HD. 2008SBS가요대전(1부,15세).001" -vcodec copy -acodec copy -f dvd 2008-12-29-001.mpg

 

그 다음 500 msec Pre-load를 없애고 0~25msec 정도    Pre-load를 하면 문제가 없다.

 IPSTB Monitoring

./value/bin 에서

 

./run-multi.sh 224.1.1.2:3003 -monitor

 

에서 일단 기본적인 버퍼 모니터링을 할 수 있다.

한장희 사장 말로는 TS 분석도 가능하다고 하는데, 현재 알 수 없다.

 

Mplayer Debug Option

−lavdopts <option1:option2:...> (DEBUG CODE)

 

 

Specify libavcodec decoding parameters. Separate multiple options with a colon.

EXAMPLE:

 

 

−lavdopts gray:skiploopfilter=all:skipframe=nonref

 

 

Available options are:

 

 

bitexact

 

 

Only use bit-exact algorithms in all decoding steps (for codec testing).

 

 

bug=<value>

 

 

Manually work around encoder bugs.

 

 

0: nothing

1: autodetect bugs (default)

2 (msmpeg4v3): some old lavc generated msmpeg4v3 files (no autodetection)

4 (mpeg4): Xvid interlacing bug (autodetected if fourcc==XVIX)

8 (mpeg4): UMP4 (autodetected if fourcc==UMP4)

16 (mpeg4): padding bug (autodetected)

32 (mpeg4): illegal vlc bug (autodetected per fourcc)

64 (mpeg4): Xvid and DivX qpel bug (autodetected per fourcc/version)

128 (mpeg4): old standard qpel (autodetected per fourcc/version)

256 (mpeg4): another qpel bug (autodetected per fourcc/version)

512 (mpeg4): direct-qpel-blocksize bug (autodetected per fourcc/version)

1024 (mpeg4): edge padding bug (autodetected per fourcc/version)

 

 

debug=<value>

 

 

Display debugging information.

 

 

0: disabled

1: picture info

2: rate control

4: bitstream

8: macroblock (MB) type

16: per-block quantization parameter (QP)

32: motion vector

0x0040: motion vector visualization (use −noslices)

0x0080: macroblock (MB) skip

0x0100: startcode

0x0200: PTS

0x0400: error resilience

0x0800: memory management control operations (H.264)

0x1000: bugs

0x2000: Visualize quantization parameter (QP), lower QP are tinted greener.

0x4000: Visualize block types.

 

 

ec=<value>

 

 

Set error concealment strategy.

 

 

1: Use strong deblock filter for damaged MBs.

2: iterative motion vector (MV) search (slow)

3: all (default)

 

 

er=<value>

 

 

Set error resilience strategy.

 

 

0: disabled

1: careful (Should work with broken encoders.)

2: normal (default) (Works with compliant encoders.)

3: aggressive (More checks, but might cause problems even for valid bitstreams.)

4: very aggressive

 

 

fast (MPEG-2, MPEG-4, and H.264 only)

 

 

Enable optimizations which do not comply to the specification and might potentially cause problems, like simpler dequantization, simpler motion compensation, assuming use of the default quantization matrix, assuming YUV 4:2:0 and skipping a few checks to detect damaged bitstreams.

 

 

gray

 

 

grayscale only decoding (a bit faster than with color)

 

 

idct=<0−99> (see −lavcopts)

 

 

For best decoding quality use the same IDCT algorithm for decoding and encoding. This may come at a price in accuracy, though.

 

 

lowres=<number>[,<w>]

 

 

Decode at lower resolutions. Low resolution decoding is not supported by all codecs, and it will often result in ugly artifacts. This is not a bug, but a side effect of not decoding at full resolution.

 

 

0: disabled

1: 1/2 resolution

2: 1/4 resolution

3: 1/8 resolution

 

 

If <w> is specified lowres decoding will be used only if the width of the video is major than or equal to <w>.

 

 

o=<key>=<value>[,<key>=<value>[,...]] Pass AVOptions to libavcodec decoder. Note, a patch to make the o= unneeded and pass all unknown options through the AVOption system is welcome. A full list of AVOptions can be found in the FFmpeg manual. Note that some options may conflict with MEncoder options.

 

 

EXAMPLE:

 

 

o=debug=pict

 

 

sb=<number> (MPEG-2 only)

 

 

Skip the given number of macroblock rows at the bottom.

 

 

st=<number> (MPEG-2 only)

 

 

Skip the given number of macroblock rows at the top.

 

 

skiploopfilter=<skipvalue> (H.264 only)

 

 

Skips the loop filter (AKA deblocking) during H.264 decoding. Since the filtered frame is supposed to be used as reference for decoding dependent frames this has a worse effect on quality than not doing deblocking on e.g. MPEG-2 video. But at least for high bitrate HDTV this provides a big speedup with no visible quality loss.

<skipvalue> can be either one of the following:

 

 

none: Never skip.

default: Skip useless processing steps (e.g. 0 size packets in AVI).

nonref: Skip frames that are not referenced (i.e. not used for decoding other frames, the error cannot "build up").

bidir: Skip B-Frames.

nonkey: Skip all frames except keyframes.

all: Skip all frames.

 

 

skipidct=<skipvalue> (MPEG-1/2 only)

 

 

Skips the IDCT step. This degrades quality a lot of in almost all cases (see skiploopfilter for available skip values).

 

 

skipframe=<skipvalue>

 

 

Skips decoding of frames completely. Big speedup, but jerky motion and sometimes bad artifacts (see skiploopfilter for available skip values).

 

 

threads=<1−8> (MPEG-1/2 and H.264 only)

 

 

number of threads to use for decoding (default: 1)

 

 

vismv=<value>

 

 

Visualize motion vectors.

 

 

0: disabled

1: Visualize forward predicted MVs of P-frames.

2: Visualize forward predicted MVs of B-frames.

4: Visualize backward predicted MVs of B-frames.

 

 

vstats

 

 

Prints some statistics and stores them in ./vstats_*.log.

 

 RC_Analysis 사용법

RC_Analysis.exe -v test.264 -o test.ts -bv 1000000 -cpb 19500000 -GOPL 30 > 20090808_rca.txt 

 

mplayer -fs -aspect 4:3 -lavdopts vstats test.264

 

Platform SDK DirectShow Filter Visual C++ 셋팅

 

1. 최신 SDK를 다운 받는다. SDK는 6.1이 최신 버전이다.

제목 :

Windows SDK for Windows Server 2008 and .NET Framework 3.5

 

사이트 :

http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&displaylang=en

 

이것을 설치하고

MicroSoft Windows SDK 6.1 -> Visual Studio Registration -> Windows SDK Configuration Tool

을 사용하여 Registry에 등록한다.

 

그러면

HKCU (HKEY_CURRENT_USER) /Software/MicroSoft SDKs/Windows/CurrentInstallFolder

에 다음과 같이 경로가 잡힌다.

C:\Program Files\Microsoft SDKs\Windows\v6.1\

 

이것은 HKLM (HKEY_LOCAL_MACHINE)/Software/MicroSoft SDKs/Windows/CurrentInstallFolder

에서도 동일하다.

해당 키값은 동일한 값으로

HKCU (혹은 HKLM) /Software/MicroSoft SDKs/Windows/v6.1/InstallationFolder

를 살펴봐도 마찬가지다.

 

한편 이전 버전의 SDK가 깔려 있을 경우 다음을 살펴봐야 한다.

 MicroSoftSDK/InstallationSDKs/....../InstallationFolder

여기에는 이전 버전의 SDK 경로가 잡혀 있다.

C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\

 

그러므로 어느 SDK를 사용하는지 알아야 한다.

이것을 아는 방법은 Visual C++ 2008에서

c:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat

혹은

c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat

를 보고 알 수 있다.

 

여기를 보면 SDK의 경로가 어떻게 설정되어 있는지 볼 수 있다.

 

:GetWindowsSdkDir

@call :GetWindowsSdkDirHelper HKLM > nul 2>&1

@if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1

@if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\

@exit /B 0

:GetWindowsSdkDirHelper

@SET WindowsSdkDir=

@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO (

 if "%%i"=="CurrentInstallFolder" (

  SET "WindowsSdkDir=%%k"

 )

)

@if "%WindowsSdkDir%"=="" exit /B 1

@exit /B 0

 

 

그런데 경로를 잘 모를 수 있으므로 정확한 경로를 파악하는 방법은

시작->프로그램->MicroSoft Visual Studio 2008->VisualSudioTools->Visual Studio 2008 Command Prompt

에서 다음과 같이 환경변수를 나타나게 하면 알 수 있다.

echo %WindowsSdkDir%

 

이것의 실행 결과는 다음과 같다.

 

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>echo %WindowsSdkDir%

C:\Program Files\Microsoft SDKs\Windows\v6.1\

이렇게 SDK 경로가 정확하게 되어 있음을 확인되었음에도 제대로 컴파일이 안된다면 다음의 문제이다.

 

Visual Studio IDE 에서

도구->옵션 클릭한다.

플랫폼 Win32 , "다음파일의 디렉터리 표시"에서 "실행파일"로 되어 있고

$(WindowsSdkDir)\bin

이 등록되어야 한다.

 

 

 

만일 DirectX SDK도 설치 했다면,

C:\Program Files\Microsoft DirectX SDK (November 2008) 경로도 나타날 수 잇도록 해야 한다. 이 경우에는 환경변수 없이 경로를 직접 입력한다.

경로명은 다음과 같다.

C:\Program Files\Microsoft DirectX SDK (November 2008)\Developer Runtime\x86

해당 경로는 $(WindowsSdkDir)\bin  다음에 나타나야 한다.

 

다음 "다음파일의 디렉터리 표시"에서 "포함파일"에서 기존 SDK보다 먼저 Microsoft SDKs\Windows\v6.1\이 걸리도록 기존 SDK 위에

C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses

C:\Program Files\Microsoft SDKs\Windows\v6.1\Include

 

이 나타나도록 해야 한다.

 

DirectX SDK도 설치 했다면,

C:\Program Files\Microsoft DirectX SDK (November 2008)\Include

를 그 다음에 위치시킨다.

 

 

다음 "다음파일의 디렉터리 표시"에서 "라이브러리파일"에서 기존 SDK보다 먼저 Microsoft SDKs\Windows\v6.1\이 걸리도록 기존 SDK 위에

C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib

가 나타나도록 한다.

 

DirectX SDK도 설치 했다면,

C:\Program Files\Microsoft DirectX SDK (November 2008)\Lib\x86

를 그 다음에 위치시킨다.

 

 

 

이렇게 해주고 컴파일하면 문제없이 컴파일 된다.

 

참고 http://blog.tinywolf.com/167 

 

 Debug 폴더에는 strmbasd.lib 파일이 Release 폴더에는 strmbase.lib 파일이 생성되는데

   

   

 

이 파일들을 C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib 폴더에 복사한다.

 

 

 

ffmpeg 보다 mencoder가 VirtualDub에서 호환성이 더욱 좋다.

ffmpeg은 FourCC Copy 에서 문제를 일으킴 최신 mplayer가 기존 문제점을 거의 없앴음

 

mplayer input.tp -ovc copy -oac copy -noskip -ffourcc MPEG2 -of avi output.avi

mencoder input.tp -ovc copy -oac copy -noskip -ffourcc MPEG2 -of avi -o output.avi

 

ipod Video Contents

d:\Transfer\200912>mencoder "video[1].flv" -vf scale=640:-10 -ovc x264 -x264encopts bitrate=1500:bframes=0

-oac pcm -of avi -noskip -ofps 30 -o Tango_de_Roxane.avi

and..

 

d:\Transfer\200912>ffmpeg -i Tango_de_Roxane.avi -vcodec copy -acodec aac -ab 128000 -f mp4 Tango_de_Roxane_ipod.mp4

 

 

 

 

/******************************************************************************\

* Constants.

\******************************************************************************/

/* The representation of the value zero. */

#define JAS_FIX_ZERO(fix_t, fracbits) \

 JAS_CAST(fix_t, 0)

/* The representation of the value one. */

#define JAS_FIX_ONE(fix_t, fracbits) \

 (JAS_CAST(fix_t, 1) << (fracbits))

/* The representation of the value one half. */

#define JAS_FIX_HALF(fix_t, fracbits) \

 (JAS_CAST(fix_t, 1) << ((fracbits) - 1))

/******************************************************************************\

* Conversion operations.

\******************************************************************************/

/* Convert an int to a fixed-point number. */

#define JAS_INTTOFIX(fix_t, fracbits, x) \

 JAS_CAST(fix_t, (x) << (fracbits))

/* Convert a fixed-point number to an int. */

#define JAS_FIXTOINT(fix_t, fracbits, x) \

 JAS_CAST(int, (x) >> (fracbits))

/* Convert a fixed-point number to a double. */

#define JAS_FIXTODBL(fix_t, fracbits, x) \

 (JAS_CAST(double, x) / (JAS_CAST(fix_t, 1) << (fracbits)))

/* Convert a double to a fixed-point number. */

#define JAS_DBLTOFIX(fix_t, fracbits, x) \

 JAS_CAST(fix_t, ((x) * JAS_CAST(double, JAS_CAST(fix_t, 1) << (fracbits))))

 

 

 DLL 에서 각종 문제가 발생하면

Dependecy Walker 를 사용하여 DLL Dependency를 체크하면 된다.

e264vfw의 경우 매우 많은 DLL dEPENDENCY를 가지고 있다. (E264Core.dll은 Kernel32.dll/NTDLL.dll 두 개만 의존)

그러므로 많은 경우 여기에서 문제가 발생할 수 있으므로 문제 발생시 해당 컴퓨터에 Depemdency Walker를 사용하여 DLL Dependency를 Check 하면 문제를 해결할 수 있다.

 

mp4 에서 H.264 비디오 추출하는 법

mp4creator -extract=1 "videoplayback[1].mp4" test_720p.264

트랙 번호를 알아야 한다.

 

D:\zTemp_dir\HD_Files>mp4info "videoplayback[1].mp4"

mp4info version 1.6.1

videoplayback[1].mp4:

Track   Type    Info

1       video   H264 High@3.1, 345.246 secs, 1997 kbps, 1280x720 @ 29.969934 fps

2       audio   MPEG-4 AAC LC, 345.233 secs, 128 kbps, 44100 Hz

D:\zTemp_dir\HD_Files>mp4creator -extract=1 "videoplayback[1].mp4" test_720p.264

 

 

최신 VLC 에서 UDP 멀티캐스팅 플레이 하는 방법

udp://@224.1.1.2:3003

 

DXVA  Option을 보면 뜻밖에도  Data들이 예상하지 못한 부분에서 gpu를 쓰고 있음을 알게된다.

DXVA 코덱 옵션 확인할 것.

 

Digital Cinema

1. Video 는 Image Magic의 Convert(IMConvert) 사용하여 8bit depth를 16bit depth로 전환하면 된다.

2. Audio 는 24 비트, 46 바이트 헤더, 48KHz 의 3가지를 반드시 지켜야 한다.

    44.1 -> 48 KHz Resampling은 Golden Wave를 통해 쉽게 해결할 수 있으며 또는 만들어도 된다.

 

ffmpeg에서 mp4 (3gp등등 ...) 파일에서 h264 만 뽑기

ffmpeg -i VID_20110124_225812.3gp -vcodec copy -vbsf h264_mp4toannexb -an out.h264

 

 

Image Magic Option

sprintf_s(csParams,  FileNameLength, "%s -depth 16 -colorspace XYZ %s", infile, outfile);

 

최신 VLC에서 UDP 멀티캐스팅 스트리밍

UDP Legacy 에서 224.1.1.2:3003

트랜스코딩은 (옵션은 선택하지 않는다 :  MPEG VIdeo + MPEG Audio)

마지막 페이지에서 Element Stream 재생 체크 + SAP 어나운스 체크

이렇게 까지 해야 된다.

 

C Compile 할때 Project 혹은 Header File에 문제가 있는 것은 (예를 들어 에러가 100개 생기는 경우)

Header File의 순서에 문제가 있는 것이다.

높은 Priority를 갖는 헤더 파일을 위에 두면 컴파일은 문제 없이 된다. 

 

NVIDIA GPU

1. 클라우드 컴퓨팅 지원

- NVIDIA GPU에 클라우드 컴퓨팅에 맞게 그래픽 가속 기능이 있음 VID (Virtual Desktop Infrastructure) Quadro가 되면 클라우드 컴퓨팅 환경에 맞는 그래픽 가속 기능으로 보다 빠르게 가상머신을 실행 시킬 수 있도록 함 (가장 강력한 기능이 가상 데스크톱임)

 

 

2. Maximus GPU = Teslar + Quadro

 

 

- e264 64bit OS에 설치하는 방법

32비트 이므로 Windows\SysWOW64\ 밑에 설치되어야 한다.

INF 파일을 잘 만들면 되고 현재 INF를 사용하면 된다.

ntamd64 부분을 통해 Registry도 WOW6432node 에 일단 등록되어야 한다.

64비트 OS 등록 부분을 잘 만든 다음에도 코덱이 보이지 않으면

DLL 종속성 문제로 이것이 제대로 올라오지 않아서 이다,

따라서 e264의 경우에는 libguide40.dll, libio5mp.dll, libmmd.dll 3개의 32비트 버전 파일을 SysWOW64 폴더에 카피하고 다시 설치하면 된다.

INF 파일의 설치와 제거는 64비트 버전에서는 Sys64WOW\RunDLL32.exe 를 사용하여 설치해해야 한다. 이 부분도 다 만들어져 있다.

DefaultInstall을 통하면 WIndows 버전을 보고 INF를 분석하여 적절하게 설치된다.

 

 

Setting of Daumpot player for 4K Monitor

 

1. Rebderer

VMR9 DirectX Renderer is an optimal choice.

 

2. Decoder

Choose DXVA decoder and in the left windows

Set the decoder of H.264/AVC to NVIDIA H.264 Decoder.

 

이랬을 때 가장 잘 된다.

Default는 Intel Quick Sync Decoder 이므로 이를 바꿔준다.

 

 

RedOne R3D 파일 읽어들이는 법

http://arenafilm.hu/alsog/vdr3d/

여기에서 VirtualDub 용 plugin 즉, R3D.vdplugins 를 32비트 virtualdub의 경우 plugins32 에 64비트의 경우 plugins64에 넣으면 된다. 만일, pluins32/64 폴더가 없으면 manually 만들면 된다.  그러면 filter 필요없이 Open AVI 에서 자동적으로 읽어들일 수 있으며 Open AVI 메뉴를 띄울 경우 좌측하단의 Ask for extended options after this dialog 를 체크하여 반드시 Full-resolution으로 만들어야 한다.

 

입력 plugin은 plugins 폴더에 넣으면 된다. virtualdub plugins 를 검색하여 여러가지 파일들 특히 mp4를 직접 불러들일 수 있다. 현재 1.9.9 에 세팅 되어 있다.

 

VirtualDub 관련 유용한 파일들은

http://www.videohelp.com/tools/Virtualdub

에서 다운 받을 수 있으며

 

VDubbatcher 를 통해 Vdub 작업을 Batch 파일로 할 수 있다.

 

ping 안될 때

- inbound ping 이 방화벽에 막혀 있어서임

제어판-관리도구-고급보안 Inbound Rule에서 Enable Rule 하면 된다.

 

 

배치파일을 사용하여 ImageMagic 의 Converter 를 통해 Post Processing

 

@echo off

SET CNT=1

 

FOR %%A IN (.\RED_test_01\*.tiff) do (CALL :CONVERTIMG)

 

GOTO :EOF

 

:CONVERTIMG

SET COUNTERSTR=00000%CNT%

SET INFILE=.\RED_test_01\RED_test_%COUNTERSTR:~-4%.tiff

SET OUTFILE=.\RED_test_01\out\OUT_%COUNTERSTR:~-4%.tiff

SET CMATRIX="1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525"

 

REM IMConvert %INFILE% -alpha Off -gamma 0.384615 -color-matrix "1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525" -gamma 1.25 -set colorspace sRGB -depth 8 %OUTFILE%

IMConvert %INFILE% -alpha Off -gamma 0.384615 -color-matrix %CMATRIX% -gamma 1.25 -set colorspace sRGB -depth 8 %OUTFILE%

 

echo %INFILE% %OUTFILE%

 

SET /A CNT=%CNT%+1

 

@echo off

 

GOTO :EOF

 

 

IMConvert RED_test_0001.tiff -alpha Off -gamma 0.384615 -colo

r-matrix "1.0 -0.25 0.0 -0.25 1.25 0 0 0 5.525" -gamma 1.25 -set colorspace sRGB

 -depth 8 out.tiff

 

RGB<-> XYZ Matrix

http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html

 

ffmpeg Image Conversion :

ffmpeg -i A012_C021_051607_001_rgb24_24fps_408.avi -f image2 -compression_algo raw .\RED_test_01\RED_test_%4d.tiff

 

ffmpeg -i .\RED_test_01\out\OUT_%4d.tiff -vcodec rawvideo -pix_fmt bgr24 -f avi -r 24.0 RED_test_01.avi

 

 

RED ONE (R3D 변환 방법)

1. VirtualDub 에서 24bit rgb888 color format으로 video 변환

2. ffmpeg : tiff 생성

ffmpeg -i A012_C021_051607_001_rgb24_24fps_408.avi -f image2 -compression_algo raw .\RED_test_01\RED_test_%4d.tiff

 

3. ColorCorrection.bat 수행

 

4. ffmpeg : Color 변환된 tiff에서 avi로 재 변환

ffmpeg -i .\RED_test_01\out\OUT_%4d.tiff -vcodec rawvideo -pix_fmt bgr24 -f avi -r 24.0 RED_test_01.avi

 

이떄, -pix_fmt는 yuyv422를 사용한다.

ffmpeg은 최신 버전이어야 함 2012년 5월 부터 가능함

 

AVI 에서 깨끗한 h264 bitstream 뽑는 방법

ffmpeg -i R3D_E264_30M_24fps.avi -vcodec copy -f h264 R3D_E264_30M_24fps.264

 

이렇게 뽑아야 TS가 된다.

 

wget -r -l1 --no-parent -A "*.exr" http://media.xiph.org/mango/linear-exr/04_5f/

 

 

열린 포트 찾는 법 (예 port 21)

netstat -an … 포트와 IP만 보인다.

netstat -ano … 포트와 IP  그리고 PID가  보인다.

 

-o option이 소켓사용 프로그램의 PID를 보여준다.

 

PID를 알면 Taskkill 을 사용하여

taskkill /F /PID xxxxx

이렇게 죽인다. /F 옵션은 강제 종료 옵션

 

포트스캔의 경우 nmap을 사용한다..... 컴퓨터 해킹이 가능하다.

 

 

Windows 7 이상에서 winsxs 에 DLL 모듈 추가 하기

그냥 복사해서는 안됨

Visual C++ 에서 New Project -> Other Project ->mergemodule 을 선택한다.

mergemodule 프로젝트에서 ADD 하면 개발자 PC에 설치된 winsxs 모듈들이 나타난다.

필요한 모듈을 ADD 한다.

컴파일 한다. 그러면 msm 파일이 생성된다.

 

해당 프로젝트에서 New Project로 Setup Project를 생성한다.

필요한 항목을 넣은 다음... 위에서 생성한 msm 모듈을 ADD 하여 포함시킨다.

컴파일 하면 setup.exe 와 setup.msi 가 생성된다.

 

이것을 해당 PC에서 수행시키면 winsxs에 필요 DLL이 설치된다.

 

 

Gimp 에서 투명 레이어 만들기

 

1. jpg등 투명함이 없는 이미지를 로드한다.

2. 먼저 레이어에서 알파채널을 더한다.

3. 선택에서 색상으로 선택한다.

4. 편집에서 선택된 부분을 지운다.

5. 이미지를 저장한다.

보통 이와 같은 프로세스면 웬만큼은 해결되나 보다 나은 품질을 위해서는 선택이아 레이어->투명도에서 알파채널을 조합하거나 해야 한다.

 

 

다수의 파일을 copy 하여 합치는 법

2개나 몇개의 파일의 경우

copy /b 1.avi+2.avi result.avi

 

폴더 속의 모든 파일의 경우

copy /b .\F0\*.avi result.avi

 

이렇게 하면 차례대로 result.avi에 copy된다.

 

위와 같이 된다...

 

mplayer 계열의 화면 출력은 yuy2 에 맞추어져 있는 관계로 yv12 보다 yuy2 를 플레이 하는데 더욱 적합하다.

 

같은 콘텐츠를 yv12 대신 yuy2로 했을 떄, 120GB -> 160GB 로 25% 증가했음에도 끊김 없이 사운드까지 잘 재생할 수 있었다.

 

 

커맨드창 없이 bat 파일 수행하기

만약, vbs 파일에 WScript 명령을 이용해서 한다면, 아래와 같은 방법으로 커맨드 창이 뜨지 않고 명령을 실행하도록 할 수 있다.

 

Set WshShell = WScript.CreateObject("WScript.Shell")

wshShell.run "explorer"

Set WshShell = nothing

 

위에서는, explorer 을 실행시키기 때문에, 별도로 옵션을 주지 않아도 커맨드 창이 뜨지는 않는다.

그러나, 만약, 이 파일에서 배치화일(bat)을 실행시킨다면 커맨드창이 뜨게 되는데, 이때는 뒤에 옵션을 붙여준다.

 

만약, 실행하려는 파일이 test.bat 라고 하자.

그러면, 아래와 같이 옵션을 주어서 명령을 실행시키면 커맨드 창이 뜨지 않는다.

 

wshShell.run "test.bat",0,True

 

ffmpeg : lossless h264 실험결과

c:\WORK\2012\EBU_TestSeq\4K test sequences\rain_fruits>ffmpeg -i 4k_rain_fruits_%4d.dpx -v

codec libx264 -g 1 -crf 0 -threads auto -pix_fmt yuv420p -f avi ..\4K_rain_fruits_lh264_yuv420p

.avi

 

GOP Size : -g 1 로 하면 전부  I-frame 이다.

crf  or qp : 0 이면 lossless 이다.

- threads auto 이면 상태에 맞게 최대 Thread로 인코딩 된다.

 

I-frame Only가 2 fps 정도로 일반 lossless 보다 속도가 더 빠르다.

4K YUV420P의 경우 약 100Mbps 이다.

 

Lossless I-Frame Only의 경우 1Gbps, YUV420P는 2.50Gbps 약 2.5배 압축률이다.

속도는 YUV420P는 : 1.2~1.5 fps Lossless I_frame은 2 fps 이다.

 

편집 테스트 결과 Lossless I-Frame의 편집 속도는 충분히 만족할 만하다.

 

 

TSMuxer 2.1 GB  이상 대용량 데이터 지원 가능.  _lseeki64 함수와 _telli64 함수를 사용하여 지원 가능... 관련 변수들을 추적하여 64bit로 전부 바꿔주면 됨 .  현재 문제 없음

즉, 저 수준 함수의 경우, 32bit/64bit 모두 지원 가능하며, 굳이 WINAPI 함수를 쓸 필요가 없음 , Multithread도 OpenMP 로 카버됨.  단, tell, lseek 와 같이 파일 내 위치를 알아야 하는 함수의 경우는 문제가 될 수 있음

 

대용량 h.264 파일의 경우 너무 많은 양의 Null packet이 문제를 일으킬 수 있음.

이 경우 bitio 의 temporal data의 크기가 너무 작아서 발생한 현상임. 이것을 크게 늘려줌으로서 해결 했음. 약 120M 까지는 카버할 수 있을 것으로 파악됨

 

문제는 이렇게 하니까 너무 Mux 속도가 너무 느려짐. 관련 데이터를 초기에 크게 잡아서 주는 방법론등을 생각하여야 할 것으로 보임

 

VirtualDub 대용량 데이터 처리 문제

1. 일반적인 경우, 멀티쓰레드를 사용하는 코덱으로 인코딩 하면, io Thread와 코덱 Thread간에 문제가 발생한다. 특히 Virtualdub의 경우는 32비트를 사용하면 32비트 한계 문제에 부딛혀 RGB444 포맷의 4K 영상의 경우 49 frame에서 진행이 되지 않는 문제가 발생한다.

 

2. 해결책 1. : 64 비트 버전을 사용한다. 그럴경우, VirtualDub 32비트에서 발생하는 문제점이 해결된다,. 그러나 64비트 코덱의 경우 사용할 수 있는 종류가 많지 않다. 특히, lossless H.264를 사용할 수 없기 때문에, Lossless JPEG으로 인코딩 하면 제대로 인코딩 되지 않는다. 64비트는 좋지 않은 해결책이다.

 

3. 해결책2 : VirtualDub에서 제공하는 AVI Parser를 windows system 디렉토리에 설치한다. VirtualDub 폴더에 있는 auxsetup.exe 에서 VirtualDub AVI Parser를 설치하면 된다. 이경우, 양상은 64비트의 경우와 비슷하지만, 32비트에서 해결이 되며, 따라서, 32비트  코덱을 사용할 수 있다.

 

4. 양상 : 48의 배수로 인코딩이 정지한다. 이유는 IO Thread와의 동기 문제이다. RGB444 4K의 경우 해당 프레임이 2.1 GB 이므로 여기까지는 Thread를 사용 고속으로 IO를 읽어 들여 메모리에 저장하지만, 그 다음에는 메모리 Management 의 이유로 처리가 이루어질 떄까지 혹은 다른 이유등으로 프로세스가 잠시 멈춘다. 즉, 약 30초간 멈춘다. 즉, VirtualDub Process Cycle이 LibLock 된다. .. Log 파일 정보를 통해 알 수 있다.

 

mp4creator  대용량 파일 처리 옵션

 

mp4creator -create=Edit02_avi.264 -rate=23.97 -use64bits -use64bitstime Edit02.mp4

mp4creator -create=Edit02_0110.mp3 Edit02.mp4

 

 

mp4 file에서 H.264 copy 형탤호 뽑기 :

ffmpeg -i Edit02_80B.mp4 -i Edit02_0110.ac3 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -map 0:0 -map 1:0 -f avi Edit02_80BnoN.avi

 

 

ffmpeg jpeg 2000 다중화

ffmpeg -i 4K_rain_fruits_yuv420p.avi -pix_fmt yuv420p -vcodec jpeg2000 -use_odml 1 -f avi 4K_rain_fruits_j2k.avi

 

simple 하게 Lossless로 인코딩 된다. FCC mjp2 현재 이것을 제대로 디코딩 할 수 있는 코덱은 Morgan codec 외에 없음 ….  Mainconcept 코덱은 AVS를 통해 읽어도 잘 안된다.

snow  코덱  wavelet 기반 놀라운 압축 성능

 

ffmpeg -i test_yuv420p_31f.avi -pix_fmt yuv444p -vcodec snow -strict -2 -threads auto -f avi test_snow.avi

 

yuv444 만 현재 가능

 

 

Lossless encoding Option

ffmpeg -i test_yuv420p_31f.avi -pix_fmt yuv422p -vcodec huffyuv -q:v 0 -threads auto -f avi -an test_hyuv.avit

 

*** Sharpen 방법론

 

http://forum.doom9.org/showthread.php?s=&threadid=84196

 

 

보통은 이러한 방법을 사용 resize(x4)-XSharpen-resize(x1)

 

 

Visual C++ 2008 CommandLine Compile 방법

 

%comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86

 

c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat 에 VC 컴파일러를 위한 환경이 있다. 실제로는 각 플랫폼에 해당하는 env 변수를 세팅하도록 되어 있다.

시작위치는

 

"c:\Program Files\Microsoft Visual Studio 9.0\VC\"  이다..

 

 

변수 %comspec%

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

 

를 의미한다.

 

따라서...

 

D:\WORK-2013\HEVC_ETRI\HM10.0\bin\vc9\Win32\Debug>%comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86  수행하면...  오호

 

Setting environment for using Microsoft Visual Studio 2008 x86 tools.

 

이런 메시지가 뜬다.

 

D:\WORK-2013\HEVC_ETRI\HM10.0\build>devenv HM_vc9.sln /build "Release|Win32"

 

 

어쨌든 , cmd Link 파일에 다음과 같이 한다.

 

 

이렇게 하면 Compile은 다음과 같이 한다.

 

devenv HM_vc9.sln /build "Release|Win32"

 

makefile 대신 sln 을 사용하여 컴파일이 된다.

 

devenv의 컴파일 옵션은 다음과 같다.

 

/Build          Builds the solution or project with the specified solution

                 configuration. For example "Debug". If multiple platforms

                 are possible, the configuration name must be enclosed in quotes

                 and contain platform name. For example: "Debug|Win32".

/Clean         Deletes build outputs.

/Command    Starts the IDE and executes the command.

/Deploy                Builds and then deploys the specified build configuration.

/Edit           Opens the specified files in a running instance of this

                 application. If there are no running instances, it will

                 start a new instance with a simplified window layout.

/LCID          Sets the default language in the IDE for the UI.

/Log           Logs IDE activity to the specified file for troubleshooting.

/NoVSIP               Disables the VSIP developer's license key for VSIP testing.

/Out           Appends the build log to a specified file.

/Project       Specifies the project to build, clean, or deploy.

                 Must be used with /Build, /Rebuild, /Clean, or /Deploy.

/ProjectConfig        Overrides the project configuration specified in the solution

                 configuration. For example "Debug". If multiple platforms are

                 possible, the configuration name must be enclosed in quotes

                 and contain platform name. For example: "Debug|Win32".

                 Must be used with /Project.

/Rebuild       Cleans and then builds the solution or project with the

                 specified configuration.

/ResetAddin  Removes commands and command UI associated with the specified Add-in.

/ResetSettings       Restores the IDE's default settings, optionally resets to

                 the specified VSSettings file.

/ResetSkipPkgs      Clears all SkipLoading tags added to VSPackages.

/Run           Compiles and runs the specified solution.

/RunExit       Compiles and runs the specified solution then closes the IDE.

/SafeMode   Launches the IDE in safe mode loading minimal windows.

/Upgrade      Upgrades the project or the solution and all projects in it.

                 A backup of these files will be created as appropriate.  Please

                 see Help on 'Visual Studio Conversion Wizard' for more

                 information on the backup process.

 

Product-specific switches:

 

/debugexe    Open the specified executable to be debugged. The

                 remainder of the command line is passed to this

                 executable as its arguments.

/useenv                Use PATH, INCLUDE, LIBPATH, and LIB environment variables

                 instead of IDE paths for VC++ builds.

 

To attach the debugger from the command line, use:

         VsJITDebugger.exe -p <pid>

 

 

Source Insight Compiler Connection

 

Option -> Custom Commands  혹은 메누 중에서 빈 단추를 누르면 Edit 하겠냐는 창이 뜬다 거기에서 시작한다.

 

 

 

 

Run 안에 수행할 Compiler 명령이 있는 bat 파일을 써 넣는다. bat파일은 다음과 같이 이루어져 있다,.

 

echo off

REM For Everytime of compile, a cmd window is called newly.

 

cd ..\..\build

 

REM Set an environment of compile with visual c++

REM %comspec% /k ""c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86

 

call "c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

 

REM Compile with VC

echo on

devenv HM_vc9.sln /build "Release|Win32"

 

위에서 Run을 써 넣어 준 다음 Menu 를 눌러서

 

 

 

여기에서 Insert -> OK 하면 된다.

 

 

 


 

 

스코프를 벗어난 객체 주시하기

디버깅을 하다 보면 스코프를 벗어난 객체를 계속 주시하고 싶을 때가 있습니다. 하지만 비쥬얼 스튜디오의 조사식 창(Watch Window)에서는 입력한 객체가 스코프를 벗어나면 비활성화가 되어 더이상 값을 확인 할수 없게 되어버리죠. 이 때, 조사식에 주시 하고픈 객체의 포인터를 입력하면, 해당 객체가 스코프를 벗어났더라도 (해당 객체가 살아 있다면) 지속적으로 값을 확인할 수 있습니다.

 

 

위 코드를 보면 mHyuna 객체는 이미 스코프를 벗어나 조사식 창에서 비활성화가 되었지만, (CHyuna*)0x0031fe2c 식으로 직접 객체의 주소를 참조하여 스코프를 벗어난 객체의 값을 확인할 수 있습니다

배열값 확인 (특정 영역 배열값 확인)

간혹 매우 큰 크기의 배열을 사용할때가 있습니다. 대략 1만개라고 해보죠. 이 배열 내부의 값을 확인하려면 어떨까요? 1만개의 배열을 일일히 확인하려면 엄청나게 스크롤링을 해야 할 것 입니다.

 

이럴때 범위식을 사용하여 특정 구간의 값만을 확인하는 방법이 있습니다. 배열명, 범위 식으로 조사식 창에 입력하여주면 그 범위 만큼의 배열만 보여주는 것이죠. 또한 포인터 연산을 통해서 특정 범위 부터의 값도 확인할 수 있습니다.

 


 

 

CRT 라이브러리를 활용한 메모리 누수 탐지

메모리 누수는 항상 골치 거리입니다. 수많은 코드들 중에서 어디서 메모리가 새는지 원인을 찾기도 힘들죠. CRT 라이브러리를 활용하여 메모리 누수 지점을 찾기 위한 방법이 있습니다. 먼저 아래와 같이 CRT 라이브러리를 사용하기 위한 헤더를 선언 해줍니다. 그리고 메모리 누수 체크를 위한 플래그를 선언 해줍니다( _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); ).

 

 

위 코드를 보시면 일부러 char[8] 만큼의 메모리를 할당 해주고, 해제를 안하고 있습니다. 이 코드를 실행시키면 아래와 같이 출력 창에서 메모리 누수가 탐지 되었다는 메시지가 나타납니다.

 

 

출력창 메시지에서 빨간 네모 박스의 숫자를 잘 기억해두세요. 이 것이 메모리가 누수되는 위치를 가리키고 있는 값입니다. 이제 이 값을 이용해 메모리 누수 위치를 찾아보도록 하겠습니다.

 

우선 프로그램 아무 곳에나 중단점을 걸고 디버깅 모드로 들어갑니다. 되도록 이면 프로그램의 시작 점에 거는 것이 좋습니다. 디버깅 모드에 들어갔으면 아래와 같이 조사식 창에 {,,msvcrXXXd.dll}_crtBreakAlloc 을 입력해줍니다. 여기서 XXX는 비쥬얼 스튜디오 버전을 적어줍니다. 2008일 경우 msvcr90d.dll, 2010일 경우 msvcr100d.dll, 2012 일 경우 msvcr110d.dll 입니다.

 

 

조사식 창에 위의 구문을 입력하면 처음에는 값이 -1로 나올 것입니다. 여기에 출력창에 나왔던 메모리 누수 위치값을 입력해줍니다. 위의 예제에서는 108 이죠. 그 다음 F5를 눌러 프로그램 실행을 재개합니다.

 

그러면 어디선가 중단점이 걸립니다. 이제 콜스택을 확인해봅니다.

 

 

중단점이 걸린 곳은 msvcr110d.dll 모듈입니다. 이 부분은 디버깅을 위한 곳이니 신경 쓰지 마시고, 밑으로 따라 내려가 보시면 실제 작업 영역 호출 부분이 있습니다. 이 곳으로 따라 가보면...

 

 

짜잔~ 메모리를 할당하고 해제 하지 않은 부분을 찾아냈습니다. 이렇게 CRT 라이브러리를 이용하여 메모리 누수 원인을 찾아 낼수 있습니다.

 

 

값이 변경 되는 위치 찾기

디버깅을 하다보면 특정 변수가 어디서 값이 변경 되는 지를 알고 싶을 때가 있습니다. 변수를 사용하는 곳을 전부 검색하여 중단점을 걸어서 볼수도 있지만 데이터 중단점 기능을 이용하면 값을 변경 하는 곳을 손쉽게 찾을 수 있습니다.

 

먼저 추적 하고 싶은 데이터의 주소를 파악합니다.

 

 

그 다음 비쥬얼 스튜디오의 디버그 -> 새 중단점 -> 새 데이터 중단점을 선택합니다. 여기에 위의 데이터 주소 값을 입력 해줍니다. 타입의 크기 값에 주의 합니다.

 

 

중단점을 추가 한 후, F5를 눌러 실행을 재개합니다. 그러면 어디선가 해당 데이터가 값이 변경 되면 아래와 같이 중단점이 작동하게 됩니다.

 

 

위의 예제에서는 SexyUp 함수에서 해당 데이터를 변경하는 것을 알아냈습니다.

 

 

DLL 컴파일 시 문제가 되는 경우

 

1. 보통 Static Library를 사용하여 DLL을 만들려고 하면 LINK error가 발생한다.

이것은 Satatic Library용 libxxx.lib 와 DLL용 msvcrxx.lib 와의 충돌때문인데, Link error 메시지를 보고 Satatic Library용 libxxx.lib 를 LINK할때 해제하면 된다.

LINK->Input 에서 Ignore Specific Library에서 libcmt.lib를 해제하였다.

 

1.1 Link2005 에러의 경우

 

 

2. Static Library가 Import 되지 않는 LINK 에러의 경우

 

DLL이 다수의 Static Library를 사용하여 Import 할 경우 …. “USE Libray Dependecy Inputs” yes 로 되어 있어야 한다.

 

 

3. VS2010 에서 DLL 만들기

VS 2008 보다 훨씬 어렵다. 링크 에러가 수시로 일어나며 이를 일일이 하니씩 추적하며 만들어야 한다.

 

3.1 기본 Concept

다중 Thread DLL은 기본적으로 MSVCRT.lib (C 라이브러리)와  MSVSPRT.lib (C++ 라이브러리)를 사용한다. 따라서, 이에 대응하는 정적 라이브러리인, LIBCMT.lib와 LIBCPMT.lib를 제외시켜야 한다.

 

그 다음, TDllEncoder에 종속되는 static 라이브러리들인, TLibCommon, TLibEncoder, TLibVideoIO (이것은 안해도 된다), TAppCommon 을 다중 Thread DLL로 맞추어야 한다.

 VS2008에서는 이럴 필요가 없었으나, VS2010은 이렇게 해야 한다.

 

물론, TDllEncoder 에서는 VS2008에서와 마찬가지로  “USE Libray Dependecy Inputs” 이 Yes 로 되어 있어야 한다.

 

이럴때만 정상적으로 DLL이 나온다.

 

단, 종속 라이브러리들을 DLL 형식으로 만들경우, static library를 사용하는 TAppEncoder 는 링크에러가 난다. 따라서 TAppEncoder를 만들고자 할 경우에는 다시 4개의 종속 라이브러리들을 멀티쓰레드 static으로 바꾸어 주어야 한다.

 

 

 

 

 

 

다중 메모리 Allocation 할때 주의할 점

 

int ** em_tmm;

 

1. 첫번째 메모리 할당시

 

em_tmm    = (UInt **)_aligned_malloc(ETRI_VER_nSAD * sizeof(Int *), 32);

 

Int * 의 사이즈로 메모리를 할당해야 한다. 그래야 안정적이다. 32비트에서는 Int *과 Int의 사이즈가 같지만 64비트에서는 size(int)=32 < size(int *)=64 이므로 이렇게 하지 않으면 위험하다.

 

2. 두번째 이하 메모리 할당시, 실제 두번째가 마지막이면 이렇게 하고 마지막이 아니면 위와 같이 size(int *)를 잡아야 한다.

 

em_tmm[0] = (UInt *) _aligned_malloc(ETRI_VER_nSAD * ETRI_HOR_nSAD* sizeof(Int), 32);

for (j=1; j<ETRI_VER_nSAD; j++)

em_tmm[j]=  em_tmm[j-1] + ETRI_HOR_nSAD;

 

이렇게 잡아야 연속적으로 메모리가 잡힌다.

 

----- 자바 설치 문제

 

오래 되어서 ms java부터 설치했는지 oracle java부터 설치했는지는 기억이 나지 않지만,

현재 etriware 접속해서 쓰는 윈도우 컴퓨터에서 freemind, staruml 같은 java 응용 프로그램도 잘 쓰고 있습니다.

 

etriware는 브라우저 내에서 java를 씁니다.

정확히는 브라우저에서 쓰이는 java가 ms java이어야만 etriware가 제대로 동작을 하지요.

 

요즘의 oracle java jre(32bit)는 제어판 메뉴를 통해서 "브라우저의 java 콘텐츠 사용"을 끌 수 있습니다.

저 옵션 on/off와는 무관하게 os 상에서 .jar 확장자 파일은 oracle java jre에 의해서 정상적으로 실행이 됩니다.

 

따라서 브라우저에서 실행되는 oracle 자바 프로그램만 포기하시면,

ms java와 oracle java jre를 하나의 윈도우에 동시에 설치해서 사용하실 수 있습니다.

단, os가 64비트이더라도 oracle java jre는 32비트 버전으로 설치하시기 비랍니다.

 

1.  Boost Library  설치법

1.1 설치 exe 파일을 실행한다.

보통 c:\local 에 설치된다.

1.2 bootstrap.bat 를 수행한다.

시간이 걸린 후 b2.exe 와 bjam.exe 가 생성된다.

1.3 b2를 사용하여 built 옵션을 주어 build 한다.

 

 

보면 MPI 관련 라이브러리가 있음을 알 수 있다.

 

그런데, 현재 옵션에서는 Skipping 되어 있다 관련 라이브러리의 Add-On은 해당 지침을 따른다.

 

보다 자세한 빌딩 옵션은

http://www.boost.org/libs/python/doc/building.html

을 참조한다.

 

64비트 설치

 

C:\local\boost_1_54_0>b2 toolset=msvc-9.0 variant=debug,release link=static threading=mult

i address-model=64 runtime-link=static

 

32비트 설치

C:\local\boost_1_54_0>b2 toolset=msvc-9.0 variant=debug,release link=static threading=mult

i address-model=32 runtime-link=static

 

Visual C++ 8.0 : msvc-9.0

Visual C++ 2010 : msvc-10.0

Visual C++ 2012 : msvc-11.0

 

무엇보다 c++ Standard Library 버전에 차이가 잇을 듯.

 

컴파일이 끝나면 다음과 같이 include 파일과 Linker Library Path를 알려준다.,

 

 

그 다음 CPP 프로젝트 에서

Include 파일과 링커를 맞춘다.

먼저 Include의 경우는

 

생성한 프로젝트 ->Properties->C/C++ ->General ->Additional Include Directories

에서

c:\local\boost_1_54_0 로 맞춤

 

 

Linker의 경우는 

생성한 프로젝트 ->Properties->Linker ->General ->Additional Library Directories

에서

c:\local\boost_1_54_0\stage\lib 로 맞추어야 하나, Thread Library의 경우는 거기 있지 않고

c:\local\boost_1_54_0\lib32-msvc-9.0  에 있다. 여기에 맞추어 줘야 한다.

64비트의 경우는

c:\local\boost_1_54_0\lib64-msvc-9.0 

 

그리고 threadpool package를 받아 해당 package의 boost 폴더를 boost_1_54_0 의 boost 로 카피한다. 그러면 boost 폴더에 threadpool.hpp 가 깔리고 추가로 threadpool 폴더가 생성된다.

 

여기에 task_adaptor.hpp 앞에

 

#include <boost/version.hpp>
#if BOOST_VERSION < 105000
#define TIME_UTC_ TIME_UTC
#endif

로 놓고 내부에서 TIME_UTC 를 TIME_UTC_ 로 고치거나 반대로 한다.

 

 

 

2013.10.25

1. 함수 포인터 in C++

C++에서의 함수 포인터는 C에서의 함수 포인터와는 달리, Class Scope, Static 함수 사용등에 따라 매우 주의 깊게 사용되어야 에러가 없다.

 

1. 1  Class 밖에서 함수 포인터를 정의하고 이 함수 포인터가 Class의 함수를 지정할 때, 다음과 같다.

 

class TestFunctions;

// for function pointer

typedef void (TestFunctions::*FpFunc)(int* );

 

typedef struct __ThreadData

{

         int              InputData;

         int              OutputData;

         HANDLE       mevent;                //Event

 

         bool            bWork;

 

         TestFunctions*       m_pcTF;

         FpFunc        s_pf;

 

}ThreadData;

. . . . . . .

class  TestFunctions

{

 

public:

 

         ThreadPool            m_sThreadPool;

         ThreadData*          m_psThreadData;

         ThreadHandles*      m_psThreadHandles;

 

         MSGBlock             m_sblock;

         FpFunc                 m_fpFunc[MAX_THREAD];

 

1.2 이 경우 함수가 Class TestFunctions 의 멤버함수 일때, Class 멤버로 함수포인터를 지정할 때는 다음과 같다.

 

         m_fpFunc[0] = &TestFunctions::TestSUMThread_1;

         m_fpFunc[1] = &TestFunctions::TestSUMThread_2;

 

1.3 static 함수가 Class 멤버로 지정된 함수 포인터를 사용하려 할 때는 다음과 같이 해야 한다.

함수 포인터는 ThreadData 구조체의 멤버로서 정의되었다고 가정하자, 즉,

 

pParam->s_pf = m_fpFunc[0]  … 이런 식으로..  즉, pParam 구조체가 언제 데이터를 가지느냐에 따라, 함수포인터의 인자가 결정된다고 생각하자.

 

void TestFunctions::WorkerThreadFunction(ThreadData* pParam)       //함수는 static 으로 정의 됨

{

         bool            WorkCondition = true;

         int              sValue, *iValue = &sValue;

 

         TestFunctions*    Lm_pcTF = pParam->m_pcTF;

 

 

         while(WorkCondition)

         {

                 Lm_pcTF->Synchro_Event(pParam);

 

                 WorkCondition = pParam->bWork;

                 sValue = pParam->InputData;

 

                 (Lm_pcTF->*pParam->s_pf)(iValue);

        

                 _tprintf(_T("InputData: %d \n"), sValue);

 

         };      //      while(WorkCondition)

 

 

         Lm_pcTF->Set_Event(pParam);

}

 

즉, Class를 지정하는 어떠한 형식의 인자라도 정의되면

예를 들어

TestFunctions*    Lm_pcTF

TestFunctions             Lm_cTF

둘 중하나가 지정되어 있다면

 

함수 포인터는 다음과 같이 사용해야 한다. (예를들어 함수 포인터가 m_fpFunc[0] 이라면)

(Lm_pcTF->*m_fpFunc[0])();

(Lm_cTF::*m_fpFunc[0])();        

즉, 함수포인터의 Scope를 Class 멤버라는 것으로 확실하게 지정해 주어야 static 함수 에서 문제 없이 컴파일 된다.

 

 

2. Threadpool

Threadpool은 Thread를 먼저 생성 시키고 Thread 내부는 while 문으로 무한하게 동작하지만, 조건에 따라 실제 함수를 동작하고 그 결과 값을 리턴하게 만드는 것이 목적이다.

이를 통해, Thread 생성에 따른 오버헤드를 줄이고 Thread의 생성과 소멸 없이 계속 재 사용할 수 있게 만드는 것이 목적이다.

 

Mutex와 Event를 통해, Thread간 데이터를 주고 받도록 하는 것이 목적이다.

 

Mutex는 메인 Thread와 Sub Thread와의 동기화를 위해서 (Main Thread에서 파생된 모든 Sub Thread가 동기화 된다.)

그리고 Event는 메인 Thread와 Sub Thread 간의 데이터를 주고 받는 것을 시그널링 하기 위해 사용된다.

 

int main()

{

               TestFunctions        m_cTF, *m_pcTF = &m_cTF;

 

               m_cTF.InitialDataSetting(&m_cTF.m_sThreadPool);

               m_cTF.InitThread();

 

               // Data Setting

               {

                              m_cTF.Synchro_Mutex(); //Mutex를 기다려서 모든 쓰레드를 동기화 시킨다.

                             

                              m_cTF.SetThreadData(0, false, 10);

                              m_cTF.Set_Event(&m_cTF.m_sThreadPool.workerThreadData[0]);

 

                              m_cTF.SetThreadData(1, false, 20);

                              m_cTF.Set_Event(&m_cTF.m_sThreadPool.workerThreadData[1]);

 

                              m_cTF.Release_Mutex();

               }

 

               // Thread Working

 

 

               // Data Acqusition

               {

                              HANDLE   hEVENT[MAX_THREAD];      

                             

                              m_cTF.Synchro_Mutex();

                             

                              for(int k=0; k<MAX_THREAD; k++)

                                             hEVENT[k] = m_cTF.m_sThreadPool.workerThreadData[k].mevent;

 

                              WaitForMultipleObjects(MAX_THREAD, hEVENT, true, INFINITE); 모든 이벤트를 기다린다. 끝내려고

 

                              _tprintf(_T("ThreadFunction[0] Output: %d \n"),  m_cTF.m_sThreadPool.workerThreadData[0].OutputData);

                              _tprintf(_T("ThreadFunction[1] Output: %d \n"),  m_cTF.m_sThreadPool.workerThreadData[1].OutputData);             

 

                              m_cTF.Release_Mutex();

               }

              

               // Final

               m_cTF.CloseThread();

 

               printf("\n");

               printf("Test is finished \n");

 

               return 0;

}

 

 

이를 위한 데이터 구조체의 형식은 다음과 같다.

 

typedef struct __ThreadData

{

               int                           InputData;

               int                           OutputData;

               HANDLE                  mevent;                  //Event

               bool                       bWork;

               TestFunctions*      m_pcTF;

               FpFunc                   s_pf;                      

 

}ThreadData;         EVENT는 서로 Sub Thread간에 서로 달라야 한다.

 

typedef struct __ThreadHandles

{

               HANDLE   hThread;

               DWORD   idThread;

 

}ThreadHandles;

 

typedef struct __ThreadPool

{

               ThreadHandles*    workerThreadList;

               ThreadData*          workerThreadData;

 

}ThreadPool;

 

typedef struct         __msg_block

{

               HANDLE   mutex;                    //mutex   Mutex는 거의 전역으로 사용되어야 한다.

 

}MSGBlock;

 

class      TestFunctions

{

public:

               ThreadPool            m_sThreadPool;

               ThreadData*          m_psThreadData;

               ThreadHandles*    m_psThreadHandles;          

 

               MSGBlock              m_sblock;

               FpFunc                   m_fpFunc[MAX_THREAD];

 

 

기존 Project 구조 유지하며 새 프로젝트 더하기

 

l. 일단 기존 솔루션에서 프로젝트를 만든다.

 

 

디렉토리를 맞추어 생성하면 대체로 다음과 같게 된다.

 

d:\WORK-2013\HEVC_ETRI\HM10.0\build\vc9\  에 TAppMultiEncoder 를 생성하는 경우이다.

이 경우, 상위 Solution의 sln 은 그대로 변경 없이 존재하면서 하위 폴더인 d:\WORK-2013\HEVC_ETRI\HM10.0\build\vc9\ 에 TAppMultiEncoder 가 생성된다.

 

따라서, TAppMultiEncoder 를 충돌 없이 잘 없애 주는 것이 관건이다.

 

 

잘 정의된 솔루션인 TAppEncoder_vc9 솔루션의 프로젝트를 살펴 보면 다음 그림과 같다.

 

(Project Properties->General->Output Directory->Edit ->Macro 를 통해 살펴볼 수 있다)

 

이때 Input Directory를 보면

 

Output 디렉토리와 Project 디렉토리 를 살펴보면

 

 

이를 지금 만들어진 디렉토리와 비교해보면

Input Directiry, Input Path, IntDir 이 다르다. (그림은 TAppMultiEncoder 의 디렉토리이다.)

 

한편 Output과 Project Directory를 비교해 보면

OutDir/ ProjectDir/ProjectPath 가 다르다.

 

또한 TargetDirectory, Target Path 도 다르다.

실행 파일 이름등 잔잔한 다른 것들도 다른 것들이 있다. 그러나 전체적인 구조를 맞추기 위해서 가장 중요한 것은 Input File Name/Input Name/Project File Name 과 Safe File Name 이다.

 

즉, “ _vc9” 이 붙는 것이 중요하다.

 

Input 관련 세팅을 바꾸기 위해서는 먼저 헤더 파일과 CPP 파일을 덧 붙여 일단 프로젝트가 구동 가능하게 만들어야 한다.

 

*.sln (Solution 파일) 에서 다음과 같이 Path와 vcproj 이름을 변경한다.

 

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TAppMultiEncoder", "vc9\TAppMultiEncoder_vc9.vcproj", "{F8B7B6EF-3632-490E-99D6-3A3C8FF1678D}"

 

그리고 해당 폴더에 TAppMultiEncoder_vc9.vcproj 및 TAppMultiEncoder_vc9.vcproj.jinwuk-PC.jinwuk.user  를 넣어준다.

 

Inherit from parent or project defaults 가 체크 되어 있으므로 자동으로 해당 프로젝트들의 이름들이 바뀐다.

 

변경되는 디렉토리는 Input Directiry, Input Path,  ProjectDir, ProjectPath 가 자동으로 변경되며 Input File Name, Input Name, Project File Name 과 Safe File Name 아 자동으로 변경된다.

 

한편 IntDir 은 Intermediate Directory 이기 때문에 Project Property 에서 매뉴얼하게 변경해야 한다.

 

TAppEncoder 프로젝트에서 복사해서 넣어준다.

(이전) $(ConfigurationName)

(변경) $(SolutionDir)\vc9\$(PlatformName)\$(ConfigurationName)\$(RootNamespace)

 

이렇게 되면

가 된다.

 

OutDir의 경우는 Configuration Properties->General 에서 찾아 보면 된다.

여기서 $(SolutionDir)$(ConfigurationName) 에서

$(SolutionDir)\..\bin\vc9\$(PlatformName)\$(ConfigurationName)

로 변경한다.

 

이것으로 Target Path의 까지 변경된다. Target Name은  Linker->General->Output File에서 변경한다.

 

추가로 C/C++ 에서

Additional Include Directory를

 

"$(SolutionDir)\..\source\Lib\";"$(SolutionDir)\..\compat\msvc"

로 해준다. 뒤의 것은 DLL 때문이다.

 

그런데 이렇게 하고 난 다음 파일이 없다고 컴파일이 안되는 경우가 있다.  이 경우에는 변경 전에 프로젝트에 파일을 넣어서 발생한 일이므로 해당 파일을 제거 했다가 다시 넣으면 된다.

 

Character Set의 경우 Use Multi-Bute Character Set 사용 여부를 체크한다.

 

 

Windows Server 2008 에서 ftp 방화벽 열기

 

1. 고급 보안이 포함된 Windows 방화벽 (시작->관리도구->고급 보안이 포함된 Windows 방화벽)

 

2. 우측 창에서 인바운드 규칙 -> 새규칙 ->새 인바운드 규칙 마법사 -> 프로그램 선택

 

 

 

 

3. 다음 프로그램 경로에서 찾아보기 ->  windows\system32\ftp 선택

 

4. 작업 단계에서 연결 허용

 

5. 프로필에서 모든 규칙이 선택되어야 함

6. 이름에서 “ftp 연결”  이라 하고 마치면 다음과 같이 새로운 인바운드 규칙이 생성됨

 

 

SxS 에러 발생시 디버그 방법 (sxstrace 사용)

 

c:\Jinwuk>sxstrace

WinSxs 추적 유틸리티

사용법: SxsTrace [옵션]

옵션:

   Trace -logfile:FileName [-nostop]

       sxs에 대한 추적을 사용하도록 설정합니다.

       추적 로그는 FileName에 저장됩니다.

       -nostop이 지정된 경우 추적을 중지할지 여부를 묻지 않습니다.

   Parse -logfile:FileName -outfile:ParsedFile  [-filter:AppName]

       원시 추적 파일을 사람이 읽을 수 있는 형식으로 변환한 다음 결과를 ParsedFile에 저장

합니다.

       -filter 옵션을 사용하여 출력을 필터링합니다.

   Stoptrace

       아직 추적이 중지되어 있지 않은 경우 추적을 중지합니다.

예:  SxsTrace Trace -logfile:SxsTrace.etl

          SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt

 

 

1. cmd 를 하나 연다. SxsTrace 추적을 시작한다.

 

2. 어플리케이션을 실행한다.

어플리케이션이 command 창에서 수행되는 것이면, 또 다른 Command 창을 열어준다.

 

3. 에러가 발생할 때 까지 수행한다.

4. 에러가 발생하여 어플리케이션이 종료하면 SxsTrace 가 실행되는 창에서 Enter를 눌러 추적을 중지시킨다.

5. etl 로그 파일을 Parsing 하여 문제를 추적한다.

 

 

Side by SIde 구성이 잘못되어 응용 프로그램을 시작하지 못하는 오류 해결

 

이벤트 뷰어에 다음과 같은 에러가 뜰 떄

 

"..."에 대한 활성화 컨텍스트를 생성하지 못했습니다. 종속 어셈블리

Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50608.0"을

(를) 찾을 수 없습니다. 자세한 진단을 위해서는 sxstrace.exe를 사용하십시오.

 

혹은

 

 

이런 에러가 뜰 떄,

 

SxsTrace를 통해 살펴보면 다음 과 같은 에러가 있다.

 

활성화 컨텍스트 생성을 시작합니다.

입력 매개 변수:

         Flags = 0

         ProcessorArchitecture = AMD64

         CultureFallBacks = ko-KR;ko;en-US;en

         ManifestPath = c:\Jinwuk\HEVC_Encoder_0.dll

         AssemblyDirectory = c:\Jinwuk\

         Application Config File =

-----------------

정보: c:\Jinwuk\HEVC_Encoder_0.dll 매니페스트 파일을 구문 분석하는 중입니다.

         정보: 매니페스트 정의 ID는 (null)입니다.

         정보: 참조: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"

정보: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" 참조를 확인하는 중입니다.

         정보: ProcessorArchitecture amd64에 대한 참조를 확인하는 중입니다.

                 정보: culture Neutral에 대한 참조를 확인하는 중입니다.

                          정보: 바인딩 정책을 적용하는 중입니다.

                                  정보: 게시자 정책이 없습니다.

                                  정보: 바인딩 정책 리디렉션이 없습니다.

                          정보: 어셈블리 검색을 시작합니다.

                                  정보: WinSxS에서 어셈블리를 찾지 못했습니다.

                                  정보: C:\Windows\assembly\GAC_64\Microsoft.VC90.CRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.

                                  정보: c:\Jinwuk\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.

                                  정보: c:\Jinwuk\Microsoft.VC90.CRT.MANIFEST에서 매니페스트를 검색하려고 합니다.

                                  정보: c:\Jinwuk\Microsoft.VC90.CRT\Microsoft.VC90.CRT.DLL에서 매니페스트를 검색하려고 합니다.

                                  정보: c:\Jinwuk\Microsoft.VC90.CRT\Microsoft.VC90.CRT.MANIFEST에서 매니페스트를 검색하려고 합니다.

                                  정보: culture Neutral에 대한 매니페스트를 찾지 못했습니다.

                          정보: 어셈블리 검색을 끝냅니다.

         오류: Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" 참조를 확인할 수 없습니다.

정보: 활성화 컨텍스트를 생성하지 못했습니다.

활성화 컨텍스트 생성을 끝냅니다.

 

첫번쨰  활성화컨텍스트 내용은 HEVC_Encoder_0.dll dl x64 응용 프로그램이며 특별히 Path를 지정하지 않았기에 ManifestPath와 Assembly Path가 각각 ManifestPath = c:\Jinwuk\HEVC_Encoder_0.dll, AssemblyDirectory = c:\Jinwuk\ 로 되어 있다는 것이다.

 

하지만, 당연히 해당 디렉토리에는 Manifest와 어셈블리가 없다.

그래서 해당 DLL의 Manifest를 분석하면 일단, Manifest가 없으므로 DLL의 파일 정보를 분석하여 Manifest를 다음과 같이 참조한다.

 

Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"

 

따라서,일단, OS는 무조건 WinSxS 에서 Microsoft.VC90.CRT 관련 라이브러리를 찾으려 한다.

 

                          정보: 어셈블리 검색을 시작합니다.

                                  정보: WinSxS에서 어셈블리를 찾지 못했습니다.

 

현재 WinSxS에는 관련 라이브러리가 없으므로 당연히 찾지 못한다.

즉 SxsTrace를 보면, Microsoft.VC90.CRT 관련 Sxs 라이브러리가 없는 것이며 해당 라이브러리는 msvcr90.dll (디버그 모드는 msvcr90d.dll) 이다. VC90 에서 컴파일해서 그런 것이며 VC80이면 msvcr80.dll (디버그 모드는 msvcr80d.dll), VC100이면 msvcr100.dll (디버그 모드는 msvcr100d.dll) 이다.

 

해결책은 세가지가 있다.

 

일단 배포 패키지를 만들어야 한다는 점에서는 공통적이다.

Visual C++ Redist 패키지를 설치하면 해결이 된다.

 

하지만, install에서 자동으로 설치되는 것이 훨씬 깔끔하다.

따라서 TDllEncoder_HM101r_x86v09F135.dll 을 설치하는 배포 패키지를 만들어 해결하도록 한다.

 

Setup Program 만드는 법

1. 필요한 WInSxS 배포 배키지 만드는 법

1. 새 프로젝트를 만든다.

 

 

 

 

 

 

 

2. New Project->Other Project->Setup and Deployment 를 선택하고 Merge Module Project를 선택한다.

3. 이름을 써주고 프로젝트를 만들면 다음과 같은 프로젝트가 형성된다.

 

4. Solution explorer 에서 MergeModule 프로젝트 이름 ->Add->MergeModule Reference 를 선택한다.

 

 

5. 앞에서 살펴본 msvcr90.dll 을 설치하기 위해서 WInSxS 폴더를 배포 프로그램에 넣기 위해 MicroSoft_vc90_CRT_x86_x64를 선택한다. 이 패키지는 C:\Program Files\Common Files\Merge Modules 에서 제공되는 것으로서 Visual Studio 와 관련 SDK 등을 선택하게 되면 관련 시스템 라이브러리들을 포함하는 msm 패키지이다.

 

 

이는 Windows의 System 라이브러리 폴더인 c:\Windows\winsxs 과 관련이 있는데, c:\Windows\winsxs  폴더 안에 보면 다음과 같은 시스템 라이브러리들이 있다.

 

여기에서 Sxstrace 를 통해서 알고 있는 필요한 Sxs 정보는

 

Microsoft.VC90.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"

 

이므로

 

amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.210228 …. 을 찾아본다. 해당 Sxs는 본 예제에서는 하나 밖에 없다.

 

 

이 폴더는 msvcm90.dll,  msvcp90.dll , msvcr90.dll 이 들어 있다.

따라서 앞에서 우리가 설치하고자 하는 시스템 dll 파일이 있음을 알 수 있다.

 

6. 배포 패키지를 빌드 한다. 필요하면 해당 프로젝트의 Properties->Output File name 에서 Browse 를 통해 출력 파일의 경로를 조절할 수 있다.

 

 

2. Setup Program 만드는 법

1. New Project->Other Project->Setup and Deployment 를 선택하고 Setup Project를 선택한다.

 

2. 이름을 써주고 프로젝트를 만들면 다음과 같은 프로젝트가 형성된다.

 

3. File System -> Application folder 에서 Add->FIle 을 선택한다.

 

설치하고자 하는 DLL  TDllEncoder_HM101r_x86v09F135.dll 을 선택한다.

그리고 실행 파일인 TDllEncoder_HM101r_x86v09F135.exe도 선택한다.

마지막으로 앞에서 만들어진 시스템 라이브러리 배포 패키지를 Solution Exploere 에서 프로젝트 이름->ADD->MergeModule 을 통해 입력 받는다. 그러면 앞에서 만들어진 MergeModule_HEVC_DLL.msm 이 포함되면서 Detected Dependecy에 자동으로 필요 msm 이 들어가게 된다.

 

 

 

4.폴더는 주어진 폴더를 사용한다. 만약 폴더를 변경하고자 한다면 주의 깊게 변경해야 한다.

 

5. 해당 프로젝트의 Property를 통해 중요한 Parameter를 수정한다. (TargetPlatform : x86->x64 등)

 

6. 그 외 관련된 여러 정보들을 보려면 프로젝트 이름->View 를 통해 정보들을 볼 수 있다. 컴파일해서 깨끗하게 빌드 되면 성공이다.

 

 

 

 

7. Setup 프로그램이 완료된 후 설치시, Windows Server 2008 등에서 간혹 Dotnet Framework 3.5 등이 설치 되지 않은 경우가 있다. 이 경우에는 Windows update를 통해 설치하거나, (3.5/4.5) 혹은 프로젝트->Properties->Prerequissities 를 통해 이부분의 체크를 해제하여 만들 수도 있다. 혹은 필요한 라이브러리의 경우는 체크하여 포함 시킬 수도 있다

그러나 dotnetFramework 3.5는 윈도우 어플 설치를 위해서는 반드시 설치 되어 있어야 한다.

 

 

.NetFramework 3.5 를 Windows Server 2008에서 설치하는 법

 

시작->관리도구->서버관리자->기능->기능추가->.NetFramework 3.5 를 선택하면 설치 가능함

 

 

Pointer가 해제 되었는지 해제 되지 않았는지를 체크하는 방법

Windows API 중 IsBadReadPtr

 

IsBadReadPtr function

4 out of 7 rated this helpful - Rate this topic

Verifies that the calling process has read access to the specified range of memory.

Important  This function is obsolete and should not be used. Despite its name, it does not guarantee that the pointer is valid or that the memory pointed to is safe to use. For more information, see Remarks on this page.

Syntax

C++

Copy

BOOL WINAPI IsBadReadPtr(
  _In_  const VOID *lp,
  _In_  UINT_PTR ucb
);

Parameters

lp [in]

A pointer to the first byte of the memory block.

ucb [in]

The size of the memory block, in bytes. If this parameter is zero, the return value is zero.

Return value

If the calling process has read access to all bytes in the specified memory range, the return value is zero.

If the calling process does not have read access to all bytes in the specified memory range, the return value is nonzero.

If the application is compiled as a debugging version, and the process does not have read access to all bytes in the specified memory range, the function causes an assertion and breaks into the debugger. Leaving the debugger, the function continues as usual, and returns a nonzero value. This behavior is by design, as a debugging aid.

 

Bad Pointer이면 True 정상 포인터이면 false 나옴

 

예제

 

for (int k=0; k<2; k++){

bool      badPtr = IsBadReadPtr(testOutput[k],(MAX_ANNEXB_BUFFER_SIZE * sizeof(char)));

 

if (!badPtr) _aligned_free(testOutput[k]);

testOutput[k] = NULL;

}

 

asdasdasㅁㄴㅇㅁㄴㅇ

 

Sony Raw MXF 보는 법

방법이 없다. 오직 Sony 에서 나오는 Raw Viwer 만 사용해야 한다.

version 2.1.1.0100 으로만 MXF를 변환 시킬 수 있다.

 

컬러의 경우는 Default Color를 사용하면 까맣게 나온다.

 

잘 볼 수 있는 방법은

 

Input Setting -> Color를 REC709 / Tone Curve를 REC709 로 맞추어야 한다.

(HDTV용 Color Space)

 

다른 더 좋은 컬러가 있을 수도 있다.

 

Redmine과 Tortoise Subversion 연동

 

일단, Redmine 내 Subversion과 Tortoise Subversion 이 모두 설치되어 있다고 가정하자.

 

기본적인 Tortoise Subversion 사용법은 다음을 참고하자.

http://hotcoffee.tistory.com/entry/Tortoise-SVN-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%82%AC%EC%9A%A9%EB%B2%95 

 

Windows 에서 Redmine 사용에 관해서는 다음을 참고하자.

http://nieaunder.egloos.com/viewer/4627054

 

다음 링크에서 많은 것을 참조할 수 있었다.

http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=1Kqux&fldid=GMj7&datanum=10&openArticle=true&nil_openapi=search

 

 

먼저 Subversion Repository를 만든다.

 

C:/BitNami/Subversion_repo 

 

이 디렉토리 안에서 Create Repository를 수행하면 C:/BitNami/Subversion_repo 가 Repository 가 된다. 하지만,

 

이때 저장소는

 

C:/BitNami/Subversion_repo/trunk 로 지정해야 한다. 그래야 연동된다.

 

그리고 이 trunk에 Tortoise Subversion 을 사용하여 Import 시켰다고 가정하자.

 

 

이때 계정을 만들어야 한다. 지금까지 이 과정이 없어서, 계정이 없어서 제대로 연동되지 않았다.

 

계정은

 

c:\BitNami\Subversion_repo\conf\passwd 

 

 

[users]

# harry = harryssecret

# sally = sallyssecret

root = root00

 

이렇게 추가해 주어야 한다. 좌측이 ID 우측이 pw 이다.

 

 

c:\BitNami\Subversion_repo\conf\svnserve.conf

 

svn server의 conf를 수정해 주어야 한다.

 

 anon-access = read

 auth-access = write

 password-db = passwd

 

이렇게 되어야 제대로 동작한다.

 

명령창에서 등록된 윈도우 서비스 중 redmineSubversion을 내립니다. ( 몰랐는데 sc 라는 명령어도 있네요)

    \BitNami Redmine Stack\Subverion\scripts\serviceinstall.bat REMOVE

 

이렇게 해도 되고

여기서 Stop 시켜도 된다.

 

다음 Redmine 의 Subversion Config을 수정해 주어야 한다.

 

c:\BitNami\redmine-2.4.2-0\subversion\scripts\serviceinstall.bat

 

중간에 보면

"C:\BitNami\redmine-2.4.2-0/subversion\scripts\winserv.exe" install redmineSubversion -displayname "redmineSubversion" -start auto "C:\BitNami\redmine-2.4.2-0/subversion\bin\svnserve.exe" -d --root="c:\BitNami\Subversion_repo" --listen-port=3690

 

이렇게 만들어 주어야 한다. 이게 가장 중요하다.

 

다시 redmineSubverion 을 윈도우 서비스로 등록한다.

    \BitNami Redmine Stack\Subverion\scripts\serviceinstall.bat INSTALL

 

혹은

여기서 Start 시켜도 된다.

 

그리고…

 

c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\config\configuration.yml

 

Redmine Config 이다.

 

이 부분은 별다르게 고칠 필요가 없는 것 같다.

단,

 

c:\BitNami\redmine-2.4.2-0\scripts\setenv.bat

 

를 수행하면 다음과 같이 기본 redmine Path가 설정된다.

 

set PATH=C:\BitNami\redmine-2.4.2-0/git\cmd;C:\BitNami\redmine-2.4.2-0/DevKit\bin;C:\BitNami\redmine-2.4.2-0/DevKit\mingw\bin;C:\BitNami\redmine-2.4.2-0/sqlite;C:\BitNami\redmine-2.4.2-0\imagemagick;C:\BitNami\redmine-2.4.2-0\ruby\bin;C:\BitNami\redmine-2.4.2-0/subversion\bin;C:/BitNami/redmine-2.4.2-0/php;C:\BitNami\redmine-2.4.2-0/mysql\bin;%PATH%

 

 

보면 subversion의 경우는 path가 설정되나. Git은 설정되지 않은 것을 알 수 있다.

 

rem ##### GIT ENV #####

 

에서 추가로 설정하는 것이 좋다.                         

 

Redmine에서 Tortoise Git 설정

1. Tortoise Git을 설치한다. Windows Git은 설치할 필요가 없다. Redmine을 연결하여 사용하면 된다.

 

2. Redmine 설정에서 Git 경로가 제대로 잡혀있지 않다. redmine의 c:\BitNami\redmine-2.4.2-0\scripts\setenv.bat   에 Path를 잡아주거나 설정에서 아예 Git.exe 경로를 잡아주던가 해야 한다.

 

3. 그 다음에는 정상적인 Git Repository를 만들어야 한다. Git 은 ServeVersion 과 달리 맨 처음에 GitHub 혹은 Google 등에서 Origin을 만들고 이것의 Clone 을 만들어서 저장소와 연결하는 방식을 사용한다.

 

4. Git 설치 방법은 다음 사이트를 참조한다.

http://dikafryo.kr/entry/github-사용법

http://dikafryo.kr/entry/github-사용법-24-TortoiseGit-설치

http://dikafryo.kr/entry/github-사용법-34-SSH접속을-위한-비밀Key-생성-및-공개키-등록

http://dikafryo.kr/entry/github-사용법-44-github-저장소-만들기-및-원격-저장소에-데이터-저장

 

비밀 키는 현재

c:\BitNami\Git_Repository\GitKey\mygitkey.ppk

에 저장되어 있다.

 

5. Git 은 Repository를 만든 다음 맨 먼저 GitHub에서 Pull을 수행해야 한다. 그래야 상호 연동이 준비되고 그 다음에 Push를 해야 정상적인 Push 가 된다.

 

6. 이상이 되고 나면 저장소를 Bare 저장소로 지정하면 Git을 저장소로 사용할 수 있다.

 

c:\BitNami\Git_Repository\General_Project\test_Git\.git

 

Bare 저장소는 .git 이다.

 

Redmine Plugin 설치

c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins\

 

에 설치한다.

 

만일 “redmine_code_review” 라는 plugin 이 있다면 해당 폴더를 plugins 에 복사한다.

 

1. MySQL Database 는 켜고 나머지 서버는 중지한다. (특히 Apache)

2. 다음을 선택한다 “Shift” 를 누르고 선택하여 가급적 관리자 권한으로 선택한다.

 

3. 다음 폴더로 이동한다.

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs

 

4. 이곳에서 다음 명령을 수행한다.

ruby bin\rake redmine:plugins:migrate RAILS_ENV=production

 

Linux 와는 다르게 ruby 는 전체 Redmine 폴더에서 수행 가능하나, rake의 경우는 전체에서 수행가능한 버전은 0.9.2 이며 plugin 설치를 위한 10.0.1 은

 

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\bin

 

밑에 있으므로 이렇게 수행시켜야 한다.

 

5. 다시 서버들을 켜고 redmine을 수행한다.

 

6. plugin을 지울 때는 다음과 같다.

Bitnami Redmine stack 사용 cmd를 수행시키고 마찬가지로 다음 폴더로 이동한다.

 

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs

 

7. 여기에서 다음 명령을 수행한다. (plug-in 이름이 redmine_code_review 일 경우)

ruby bin\rake redmine:plugins:migrate NAME=redmine_code_review VERSION=0 RAILS_ENV=production

 

ruby bin\rake redmine:plugins:migrate NAME=redmine_ckeditor-master VERSION=0 RAILS_ENV=production

 

8. 해당 플러그인을 지운다.

 

9. 다시 앞의 명령을 수행한다.

ruby bin\rake redmine:plugins:migrate RAILS_ENV=production

 

10. 서버를 켜고 레드마인을 재 수행한다.

 

 

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins>bundle install --without development test

 

CKEditor Pluin 설치

1. MySQL 만 켜도 나머지 서버는 모두 중단한다.

2. 다음 폴더에서 작업한다.

 

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs

 

C:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\plugins\redmine_ckeditor>

 

 

bundle install --without development test

 

 

c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\vendor\bundle\ruby\1.9.1\gems\rake-10.1.0\bin\rake

 

c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\vendor\bundle\ruby\1.9.1\gems\rake-10.1.0\bin\rake redmine:plugins:migrate RAILS_ENV=production

 

CKeditor 설치 실패기

http://redmine.or.kr/boards/4/topics/225?r=226

 

Daum Pot Player에서 WebDaV로 콘텐츠 보기

 

 

호스트에서 IP를 적어준다.  혹은 다음과 같이 http:// 없이 주소를 적어준다.

반드시 WebDav Port를 확인해야 한다.

그리고 로컬에서 방화벽을 열어줘야 한다.

UTF8의 경우 파일 명의 한글이 깨질 경우 check를 해제한다.

 

 

 

Local 컴퓨터에 Git Server 만들기

 

http://composite.tistory.com/40

http://www.codeproject.com/Articles/296398/Step-by-Step-Setup-Git-Server-on-Windows-with-CopS

 

다음의 3 프로그램을 설치한다.

 

-     Msysgit (server and Client)

-     CopSSH (server side)

-     PuTTY    (server and Client)

 

현재, MSysgit 과 CopSSH는 서버에 설치되어 있고

Client와 Server 에는 TortoiseGit 이 설치되어 있다고 가정한다. (PuTTY는 TortoiseGit 에 있다)

 

1.  서버 환경변수에서 다음을 설정해준다.

 

C:\Program Files\Git\bin

C:\Program Files\Git\libexec\git-core

 

2.  CopSSH를 설치한다. Service Account와 Password는 다음과 같다.

 

Service Account : SvcCOPSSH

password          :  root0000

 

 

3.  CopSSH의 Control Panel을 연다.

 

 

4.  Users -> Add

 

5.  컴퓨터에 Access 가능한 User를 Windows 사용자 중 하나를 선택하도록 되어 있다.

나의 경우는 따라서 root를 선택한다.

 

 

6.  다음과 같이 세팅되도록 한다. (Linux Shell은 Windows shell로 바꿀 수 있다)

 

 

Apply를 통해 Activation 시킨다. 시간이 걸린다. Activation 되면 다음의 User 창이 뜬다. Keys를 클릭한다.

 

         

 

Key wizard가 뜬다. 다음의 방식대로 수행한다. Passphrase는 jnwseok21408을 사용한다. File 이름은 직접 입력이다. Confirm 에서 Apply를 한다.

 

      

 

여기까지 완료하면 다음이 뜬다. c:\Users\root\jnwhome-root_2048.ppk 로 존재한다. Client로 나중에 복사한다.

 

root@ROOT-PC 는 중요하다.

 

Git bash 에서

ssh root@ROOT-PC  -> root@root-PC pw : root00 -> git 하면 다음과 같이 실패한다.

 

이는 CopSSH에 제대로 된 Path를 설정하지 못했기 때문이다.

 

CopSSH의 Service를 Stop 시키고 c:\Program Files\ICW\etc\profile 을 연다.

Git이 위치하는 곳은 다음이므로

 

C:\Program Files\Git\bin

C:\Program Files\Git\libexec\git-core

 

다음과 같이 profile을 편집한다.

 

 

여기에서 export PATH="/bin:$syspath:$winpath:/cygdrive/c/Program Files/git/bin:/cygdrive/c/Program Files/git/libexec/git-core"

와 같이 편집해 준다.

 

중지된 copSSH를 다시 활성화 시킨다.

다시한번 똑같이 Bash에서 입력해 본다.

 

 

양상이 다르다. 정상적인 login 이 된다.

 

발견된 에러

1.   Profile 편집 에러 : Profile 파일에 대한 접근 문제이다. 이 경우, 오직 notepad 만 편집이 가능하다. 그 외의 것으로 할 경우 $’\r’ 에러등이 발생한다. 즉, LF/R 문제가 발생한다.

2.   다음의 에러

ssh 접속이 안되는 경우 - Host key verification failed.

서버를 교체하거나, 서버의 아이피 변경으로 인해 기존의 서버의 아이피와 겹칠경우
${HOME}/.ssh/known_hosts
파일에 이전의 정보가 남아있는 바람에 생기는 에러이다.
"
에러" 라고 한이유는, 경고라고 해놓고 접속이 안되기 때문이다.

해결 방법은, 위의 파일을 삭제하거나(그러면 다음 접속시 키를 다 받아야 하는 귀차니즘이)
해당 서버의 아이피가 들어있는 줄을 지우면 된다.

$ ssh USERID@SERVER_IP
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
5b:c1:63:e6:6c:53:30:ea:fd:fd:f3:72:22:a0:a1:aa.
Please contact your system administrator.
Add correct host key in /home/USERID/.ssh/known_hosts to get rid of this message.
Offending key in /home/USERID/.ssh/known_hosts:2
RSA host key for SERVER_IP has changed and you have requested strict checking.
Host key verification failed.

 

정상적이면 이렇게 된다.

 

TortoiseGit 폴더에서 PuttyGen을 실행한다.

 

 

User/root <- 나의 경우는 root에 발생시켰으므로 … 에 있는 ppk 파일을 Load한다.

 

 

Passphrase를 요구하므로 이를 잘 기억하고 있어야 한다.

 

제대로 되면 이런 메시지가 뜬다.

 

Saveprivate key를 수행한다.

 

 

다음 이전에 있었던 Git Repository를 Github에 만들던 방식을 차용하여 Git Repository를 만든다.

 

Github 는 이렇게 되어 있으므로…

https://github.com/Jinwuk/HEVC_Encoder.git

git@github.com:Jinwuk/HEVC_Encoder.git

 

https://jnwhome.iptime.org/root/ ETRI_HEVC_Git_Home.git

git@jnwhome.iptime.org:root/ ETRI_HEVC_Git_Home.git

 

 

    README.md 는 그럼에도 잘 add 된다.

   

 

주소를 잘못쓰고 origin도 존재해서 발생한 에러다. TortoiseGit에서 origin을 삭제하고 다시 한다.

 

에러 없이 잘된다.

 

자꾸 실패한다.

 

여기서 실패하는 이유는 일단 commit이 안되었기 떄문이다.

 

 

 

Redmine Subversion Repository에서 404 에러가 날 떄

 

c:\BitNami\redmine-2.4.2-0\apps\redmine\htdocs\lib\redmine\scm\adapters\subversion_adapter.rb

 

 

공유기 문제 일 수도 있다.

SSH 서버 문제 일 수도 있다.

 

보통 그런 문제가 아니라, password 나 Config 파일에서 DOS Style의 LF/CR이 들어가기 때문이다.

따라서 편집기에서 DOS 스타일로 변경할 것인가를 결정할 때, 절대 DOS 스타일로 변경하지 않아야 한다.

또한, Config 에서 앞에 한칸을 띄게 되면, Subversion은 알아듣지 못하므로 맨 앞에 붙여서 편집이 되도록 해야 한다.

 

잘되는, password 파일과 Config 파일을 이용하는 것도 방법이다.

 

Redmine의 Config

 

c:\Bitnami\redmine-2.4.3-0\apps\redmine\htdocs\config\configuration.yml

 

 

Windows 의 사용자 계정 Profile

 

 

Doxygen 그림 안나오는 문제

 

Graphviz 최신 버전의 PATH 가 맞지 않아서 발생한 문제이거나, Graphviz에서 생성한 파일의 이름이 맞지 않아 발생한 문제이다.

 

1.  PATH 문제 해결

 

Wizard->Expert->Dot 에서 DOT_PATH에 다음과 같이 Dot.exe 파일이 있는 폴더를 지정해 준다.

 

 

2.  PNG 파일 이름 문제

Wizard->Expert->Project 에서 SHORT_NAMES 를 체크해 준다. Config 에서 YES 가 된다.

 

 

Bitnami Redmine 애서 SQL 실행하기.

 

C:\Bitnami\redmine-2.4.2-0\mysql\bin 폴더에서 다음과 같이 수행하여야 한다. Path가 열려 있지 않다.

 

My SQL의 ID와 Password는 c:\Bitnami\redmine-2.4.2-0\apps\redmine\htdocs\config\database.yml 에 있다.

 

C:\Bitnami\redmine-2.4.2-0\mysql\bin>mysql -u bitnami -p bitnami_redmine

Enter password: **********

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 32

Server version: 5.5.34 MySQL Community Server (GPL)

 

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

 

mysql> show variables like 'c%';

+--------------------------+-----------------------------------------------+

| Variable_name            | Value                                         |

+--------------------------+-----------------------------------------------+

| character_set_client     | utf8                                          |

| character_set_connection | utf8                                          |

| character_set_database   | utf8                                          |

| character_set_filesystem | binary                                        |

| character_set_results    | utf8                                          |

| character_set_server     | utf8                                          |

| character_set_system     | utf8                                          |

| character_sets_dir       | C:\Bitnami\REDMIN~1.2-0\mysql\share\charsets\ |

| collation_connection     | utf8_general_ci                               |

| collation_database       | utf8_general_ci                               |

| collation_server         | utf8_general_ci                               |

| completion_type          | NO_CHAIN                                      |

| concurrent_insert        | AUTO                                          |

| connect_timeout          | 10                                            |

+--------------------------+-----------------------------------------------+

14 rows in set (0.00 sec)

 

 

SSH Tunneling

http://wiki.dgoon.net/doku.php?id=misc:sshtunneling

 

Here -> There

여기에서 저쪽으로 터널을 뚫어보자. 예를 들어,

이런 상황에서, 나는 LinuxMachine에 ssh로 접속해서 내 WindowDesktop에 핑을 날려 살아있다는 것을 확인할 수 있다. 패킷을 보낼 수 있는 것이다. 공유기에서 연결하진 않았지만, 외부에서 WindowDesktop에 원격접속을 하고 싶다. 원격 접속 포트는 3389 번.

ssh -oport=2222 -L 1010:WindowDesktopIP:3389 LinuxMachineIP

ssh의 옵션 중 -L 이 여기 → 저기를 뜻한다. 콜론으로 구분된 세개의 옵션은 각각, LocalPort, ssh 접속한 머신에서 보이는 목적지 IP, 목적지 IP에 대한 port 이다. 저렇게 ssh 접속을 하고 나면 로컬 머신의 1010 번 포트가 LinuxMachine을 통해서 WindowDesktop의 3389 포트로 연결된다. 원격 데스크탑을 띄워서 localhost:1010 으로 접속해보라!

 

이것을 Putty 로 하려면

 

Putty 의 접속->SSH->터널링

여기에서 원포트를 1010 으로 하고 원격으로 쓰고 싶은 컴퓨터의 ip:3389 로 “대상” 에 적는다.

즉, 129.254.112.185:3389

 

그리고 추가를 눌러주면

L1010 129.254.112.185:3389 가 된다.

 

그 다음에 세션에서 Host Name 에 129.254.112.185 port 22 즉, SSH 접속을 체크하고 이를 저장한다.,

 

그리고 접속을 하면 SSH 접속이 된다. (SSH 서버 즉, SvcCOPSSH 의 사용자를 현재 jinwuk 으로 설정해 놓아야 한다. 즉 내컴퓨터의 사용자)

 

그렇게 하면 SSH telnet 접속이 된다. 윈도우 Telnet 서버는 꺼도 된다.

 

그 다음 원격데스크 탑에서

Localhost:1010 을 하면 포트포워딩이 되면서 원격데스크탑이 열린다.

 

 

jinwuk@JINWUK-PC-185 timestamp: 1396971867

 

Redmine log file 의 제어 방법

 

1.   .\apps\redmine\htdocs\config\Additional_environment.rb 파일을 다음과 같이 수정한다.

 

# Copy this file to additional_environment.rb and add any statements

# that need to be passed to the Rails::Initializer.  `config` is

# available in this context.

#

# Example:

#

#   config.log_level = :debug

#   ...

#

#       config.logger = Logger.new('./log/production.log', 5, 1024000)  

#       1. Location of Lof file

#       2. Maximum number of log files

#       3. Maximum size of log file

#

#       config.log_level = :debug

#       Level of Log file :

#       FATAL : minimum size

#       ERROR :

#       WARN  :

#   INFO  : Default

#   DEBUG : Maximum Size

 

config.action_controller.relative_url_root = '/redmine'

config.logger = Logger.new('./log/production.log', 5, 1024000)

config.log_level = :ERROR

 

 

BDrate 구하는 방법

 

VCEG-AE07_BJM.xla 파일을 Macro Excel 로 사용한다.

VCEG-AE07_BJM.xla 파일을 c:\Program Files\Microsoft Office\Office14\VCEG-AE07_BJM.xla 에 복사

 

엑셀의 파일->옵션->추가기능  에서 “이동” 선택

 

추가기능에서 -> 찾아보기 -> vceg-Ae07_Bjm.xla  선택하고 다음과 같이 되면 확인

 

 

 

ffmpeg 사용한 간단한 편집

 

ffmpeg   -i   동영상.avi -ss  600  -t  120  -vcodec copy -acodec copy  clip.avi

 

-ss   10분(600초)부터 부분파일을 시작

-t      2분간(120초) 해당하는 부분 선택

-vcodec copy         비디오codec을 원본과 동일하게 지정(변환없이 원본그대로 사용)

-acodec copy         오디오codec ........  ...

 

clip.avi   출력파일명

 

 위에 -t  대신에 -fs를 대체하면 파일용량 상한선을 지정할 수 있다..

 

-> 시작옵션만 지정하면, 시작부터 파일끝까지..

-> 끝옵션만 지정하면, 시작부터 제한된 시간까지..

 

mp3를 비롯한 다른 오디오 파일을 잘라내는 방법 또한 위의 내용과 같다.

 

10분짜리 mp3파일을 반절로 나눌때

ffmpeg -i FILE.mp3  -acodec copy  -t 300    전반부.mp3

-t 300 (초)       5분까지라는 뜻으로 시작점이 지정되지 않았기 때문에 처음부터 5분까지이다.

 

ffmpeg -i FILE.mp3  -acodec copy  -ss 300    후반부.mp3

-ss 300 (초)      5분부터라는 뜻으로, 끝부분이 지정되지 않았기 때문에 5분부터 끝까지이다.

 

 

그 외에도 다른 오디오분할도 위와 같이 하면 된다.

단순한 분할이 목적이라면, 오디오편집프로그램보다 이것이 더 빠르다.  

 

만약 안된다면, 해당프로그램버젼에서 지원이 안되는 codec이기 때문이다.

지원되는 형식과, codec 종류를 알고 싶을땐... 아래 명령을 사용

ffmpeg -formats

 

compile할대의 옵션의 차이에 의해서 codec지원이 되고, 안된다.

 

 

Avisynth Frame Doubling 코드

 

필요한 라이브러리

 

LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\mvtools2.dll")     ## MVTools Version 2

 

##............... Processing 1............... Frame Doubling

super = MSuper(Clip2, pel = 2)

backward_vec = MAnalyse(super, overlap=4, isb = true, search=3)

forward_vec    = MAnalyse(super, overlap=4, isb = false, search=3)

ClipE = MFlowFps(Clip2, super, backward_vec, forward_vec, num=2*frameratenumerator(Clip2), den=frameratedenominator(Clip2), mask=0, isse=true, planar=true)

 

 

Main Issue

Redmine 2.4.2

Date

2014-11-09

SubIssue

Gantt 차트 PNG 내보내기 :

SubIssue-2

한글 출력 오류 수정

Contents

 

Gantt를 PNG로 내보낼 때 한글이 표시되지 않는 오류 해결

 

Cd redmine/config/

Configuration.yml을 편집해야 한다.

 

Line 175 – 196 사이에 다음과 같이 되어 있다.

 

  # Configuration of RMagcik font.

  #

  # Redmine uses RMagcik in order to export gantt png.

  # You don't need this setting if you don't install RMagcik.

  #

  # In CJK (Chinese, Japanese and Korean),

  # in order to show CJK characters correctly,

  # you need to set this configuration.

  #

  # Because there is no standard font across platforms in CJK,

  # you need to set a font installed in your server.

  #

  # This setting is not necessary in non CJK.

  #

  # Examples for Japanese:

  #   Windows:

  #     rmagick_font_path: C:\windows\fonts\msgothic.ttc

  #   Linux:

  #     rmagick_font_path: /usr/share/fonts/ipa-mincho/ipam.ttf

  #

  rmagick_font_path: C:\Windows\Fonts\malgun.ttf

 

이 부분을 이렇게 수정하면 된다.

 

Main Issue

Redmine 2.4.2

Date

2014-11-09

SubIssue

Gantt 차트 요일이 아닌 날자 보이기

SubIssue-2

 

Contents

 

Redmine 설치 디렉토리에서 아래의 명령을 이용하여 소스파일을 편집합니다.

 

1

2

cd <redmine 설치디렉토리>

vi ./app/views/gantts/show.html.erb

기존의 소스코드에서 “<% ###### Days headers ####### %>” 부분을 검색한 후 아래의 마크된 라인과 같이 수정을 한 후 저장합니다. Redmine 서버를 재기동합니다.

./app/views/gantts/show.html.erb

Ruby

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<% ###### Days headers ####### %>

<% if show_days %>

  <%

    left = 0

    height = g_height + header_height - 1

    wday = @gantt.date_from.cwday

    day_num = @gantt.date_from

  %>

  <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %>

    <%

      width =  zoom - 1

      style  = ""

      style += "left: #{left}px;"

      style += "top:37px;"

      style += "width: #{width}px;"

      style += "height: #{height}px;"

      style += "font-size:0.7em;"

 

      if wday == 6

        style += "color:blue;"

      elsif wday == 7

        style += "color:red;"

      end

 

      clss = "gantt_hdr"

      clss << " nwday" if @gantt.non_working_week_days.include?(wday)

    %>

    <%= content_tag(:div, :style => style, :class => clss) do %>

      <%= day_num.day%>

      <%#= day_letter(wday) %>

    <% end %>

    <%

      left = left + width + 1

      day_num = day_num + 1

      wday = wday + 1

      wday = 1 if wday > 7

    %>

  <% end %>

<% end %>

정상적으로 적용이 되면, 아래의 화면과 같이 해당 일정이 날짜로 표기되게 됩니다.

 

 

 

Main Issue

AVISynth

Date

2014-11-09

SubIssue

VirtualDub 없이 AVS를 AVI로 만드는 법

SubIssue-2

 

Contents

 

AvsPMode의 AVS2AVI 기능을 사용하면 된다.

이 기능은 AVSPMode에서 tools -> script Encoder(VFW) 에 해당한다

 

AVS2AVI를 수행하면 다음과 같은 창이 뜬다.

 

 

그대로 RUN을 수행하면

조금 있다가 코덱 선택 창이 뜬다.

 

 

살펴보면 다음과 같이 VFW 코덱이 보이게 된다.

 

 

 

다시 압축 안 함을 선택하면 AVS에서 사용되는 Color Space그대로 (보통은 YUV420P 8bit) 를 그대로 AVI 파일로 만들게 된다.

만일 Color space 변환 만으로 해당 부분은 해결 가능하다.

 

“다시 압축 안함”을 선택하고 RUN을 선택하면 다음과 같이 된다.

 

 

정상적으로 인코딩 되는 것을 볼 수 있다.

AVS2AVI는 불안하기 떄문에 Stop을 누른다고 프로그램이 정상 종료하지 않는다. 따라서, 반드시 TaskManager에서 해당 프로세스를 종료해야 한다.

 

 

 

Main Issue

FFmpeg

Date

2014-11-09

SubIssue

Adobe PRemire에서 받아들여지는 MOV 파일 포맷

SubIssue-2

 

Contents

 

Adobe Premire에서 Uncompressed를 선택하면 기본으로 잡히는 코덱은 v210 코덱이다. 이 코덱은  ffmpeg Pix format에서 yuv422p10le 에 해당한다.

 

그러므로 다음과 같이 명령어를 주면 Adobe Premire에서 인식되는 mov 파일을 만들 수 있다,

 

ffmpeg -i SkyTV_Demo_2.avi -vcodec v210 -f mov -use_odml 1 h:\SkyTV_Demo.mov

 

 

 

Main Issue

AVISynth

Date

2014-11-09

SubIssue

Subtitle의 위치

SubIssue-2

 

Contents

 

Subtitle (clip, string text, int "x", int "y", int "first_frame", int "last_frame", string "font", float "size", int "text_color", int "halo_color", int "align", int "spc", int "lsp", float "font_width", float "font_angle", bool "interlaced")

Subtitle (clip, string text)

 

자막을 넣는 subtitle의 위치는 다음과 같다.

 

The align parameter allows you to set where the text is placed relative to the (x,y) location and is based on the numeric keypad as follows:

<left> 7 <top>

<center> 8 <top>

<right> 9 <top>

top of text aligned to y-location for align=7,8,9

<left> 4 <baseline>

<center> 5 <baseline>

<right> 6 <baseline>

baseline of text aligned to y-location for align=4,5,6

<left> 1 <bottom>

<center> 2 <bottom>

<right> 3 <bottom>

bottom of text aligned to y-location for align=1,2,3

start at x for align=1,4,7

center on x for align=2,5,8

end at x for align=3,6,9

 

Note: There is no vertical center alignment setting.

그런데

 

보통 많이 사용되는 align=2 의 경우는 x, y위치에 대하여 다음과 같은 규칙으로 정해진다.

 

Default Values

clip

last 

text

no default, must be specified 

x

8 if align=1,4,7 or none; -1 if align=2,5,8; or width-8 if align=3,6,9 

y

height-1 if align=1,2,3; size if align=4,5,6 or none; or 0 if align=7,8,9

first_frame

0

last_frame

framecount(clip)-1

font

"Arial"

size

18.0

text_color

$00FFFF00 <full opaque yellow>

halo_color

0 <full opaque black>

align

Normally 4 <left and baseline>; if x=-1, then 5 <horizontal center and baseline>

spc

0 <font spacing unchanged>

lsp

<multiline is not enabled>

font_width

0 <system default>

font_angle

0.0 degrees

interlaced

false

 

Align=2 의 경우 이렇게 하고 y의 위치를 변경하여 원하는 위치에 Subtitle을 집어 넣는다.

 

Example:

ClipE1 = Subtitle(ClipE1, "SD (Standard Definition : 720x480)", x=-1, y=1420, first_frame=0, last_frame=ClipE1.framecount-1, font="Times New Roman", size=72, text_color=$FFFF00, halo_color=$000000, align=2, spc=0, font_width=0, font_angle=0.0, interlaced=False)

 

3840x2160 화면 가운데 SD 영상이 있고 그 하단에 subtitle을 넣는 예제이다.

 

 

 

 

Main Issue

FFmpeg

Date

2014-11-12

SubIssue

-map 옵션 사용법

SubIssue-2

 

Contents

만일 입력이 두개인 상황을 가정하자.

 

ffmpeg

-i .\UHD_Audio\0623_KD_v210_12chAudio.mov

-i .\UHD_Audio\KD\KD_all.wav

-map 0:0 -map 0:2 -map 1:0

-c:v copy -c:a copy -c:d copy

-f mov .\UHD_Audio\0623_KD_v210_12chAudio_1.mov

 

이때, 첫번째 입력의 경우는 

 

Stream 0:0  : Video

Stream 0:1 : Audio

Stream 0:2 : (Meta)Data 이다.

 

두번째 입력은

Stream 1:0  : Audio 이다.

 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\UHD_Audio\0623_KD_v210_12chAudio.mov':

  Metadata:

    major_brand     : qt

    minor_version   : 537199360

    compatible_brands: qt

    creation_time   : 2014-11-12 11:15:40

  Duration: 00:01:51.11, start: 0.000000, bitrate: 1062234 kb/s

    Stream #0:0(eng): Video: v210 (v210 / 0x30313276), yuv422p10le, 1920x1080, 1060622 kb/

s, SAR 1920:1920 DAR 16:9, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc (default)

    Metadata:

      creation_time   : 2014-11-12 11:15:40

      handler_name    : Apple Alias Data Handler

      timecode        : 00:00:00:00

    Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb

/s (default)

    Metadata:

      creation_time   : 2014-11-12 11:15:40

      handler_name    : Apple Alias Data Handler

      timecode        : 00:00:00:00

    Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default)

    Metadata:

      creation_time   : 2014-11-12 11:15:40

      handler_name    : Apple Alias Data Handler

      timecode        : 00:00:00:00

 

 

Input #1, wav, from '.\UHD_Audio\KD\KD_all.wav':

  Duration: 00:01:51.13, bitrate: 9216 kb/s

    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 12 channels, s16, 921

6 kb/s

[mov @ 00000000042e17e0] You requested a copy of the original timecode track so timecode m

etadata are now ignored

Output #0, mov, to '.\UHD_Audio\0623_KD_v210_12chAudio_1.mov':

  Metadata:

    major_brand     : qt

    minor_version   : 537199360

    compatible_brands: qt

    encoder         : Lavf55.19.104

    Stream #0:0(eng): Video: v210 (v210 / 0x30313276), yuv422p10le, 1920x1080 [SAR 1920:19

20 DAR 16:9], q=2-31, 1060622 kb/s, 23.98 fps, 24k tbn, 24k tbc (default)

    Metadata:

      creation_time   : 2014-11-12 11:15:40

      handler_name    : Apple Alias Data Handler

      timecode        : 00:00:00:00

    Stream #0:1(eng): Data: none (tmcd / 0x64636D74) (default)

    Metadata:

      creation_time   : 2014-11-12 11:15:40

      handler_name    : Apple Alias Data Handler

      timecode        : 00:00:00:00

    Stream #0:2: Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, 12 channels, 9216 kb/s

 

Stream mapping:

  Stream #0:0 -> #0:0 (copy)

  Stream #0:2 -> #0:1 (copy)

Stream #1:0 -> #0:2 (copy)

 

즉, 순서대로 -map 0:0 -map 0:2 -map 1:0

이렇게 대핑 했기 때문에

 

Stream mapping:

  Stream #0:0 -> #0:0 (copy)

  Stream #0:2 -> #0:1 (copy)

Stream #1:0 -> #0:2 (copy)

 

이렇게 된다. 만일

-map 0:0 –map 1:0 –map 0:2

로 했으면

 

Stream mapping:

  Stream #0:0 -> #0:0 (copy)

  Stream #1:0 -> #0:1 (copy)

Stream #0:2 -> #0:2 (copy)

 

가 되었을 것이다.

 

 

 

Main Issue

IPTime NA

Date

2014-11-09

SubIssue

IPTime NAS Application 이용법

SubIssue-2

 

Contents

APM 사용하기.

ipTIME NAS I/II
펌웨어 1.1.50 이후 버전을 설치 하시면, MYSQL/Apache(PHP) 기능을 통해 PHP 기반 웹 프로그램을
이용할 수 있습니다.

§  I. MYSQL/Apache 설정하기.

§  II. MYSQL 관리자 비밀번호 설정하기.

·        1. phpMyAdmin을 통해 MYSQL 관리자 비밀번호 설정하기.

·        2. MYSQL-front를 통해 MYSQL 관리자 비밀번호 설정하기.(윈도우 전용)

§  III. PHP 웹프로그램 사용하기.

·        1. 제로보드XE 사용하기. (v1.5.3.5 기준)

·        2. 그누보드 사용하기. (v4.36.11 기준)

·        3. OwnCloud 사용하기. (v4.5.4 기준)

·        4. Ajaxplorer 사용하기. (v4.3.0 기준)

·        5. wordpress 사용하기. (v3.5 기준)


I. MYSQL/Apache
설정하기.
1.
우선 서비스의 MYSQL/Apache 서비스를 '실행'으로 설정 합니다.
2. MYSQL
을 처음 실행할 경우 관리자의 비밀번호가 없는 초기화 상태이므로,
'
항목 II'를 참조하여 phpMyAdmin을 통해 비밀번호를 설정하고 DB를 생성합니다.
[처음으로]
II. MYSQL
관리자 비밀번호 설정하기.
1. phpMyAdmin
을 통해 MYSQL 관리자 비밀번호 설정하기.
1. phpMyAdmin
홈페이지(http://www.phpmyadmin.net/)에서 phpMyAdmin 파일을 다운로드 받습니다.
2.
다운로드 받은 파일을 'phpMyAdmin' 폴더에 다음과 같이 압축 해제 합니다.


3. 'phpMyAdmin\config.sample.inc.php'
파일을 'phpMyAdmin\config.inc.php'파일로 복사 합니다.
4. 'config.inc.php'
파일을 문서 편집기로 열어 다음 항목을 'true'로 수정 합니다.
    $cfg['Servers'][$i]['AllowNoPassword'] = false
의 'false'를 'true'로 변경합니다.

5. 'phpMyAdmin\libraries\config.default.php'
파일을 문서 편집기로 열어 다음 항목을 'false'로 수정 합니다.
    $cfg['CheckConfigurationPermissions'] = true
의 'true'를 'false'로 변경합니다.

6.
압축 해제한 'phpMyAdmin'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
7.
인터넷 브라우저를 열어 'http:// NAS의 IP : Apache Port /phpMyAdmin'로 접속합니다.
(
예 - http://192.168.0.2:8000/phpMyAdmin)
접속 시, URL의 'phpMyAdmin'과 같은 접근 경로명은 대소문자를 구분 하므로 업로드 하신 폴더명과 동일하게 입력해야 합니다.
초기화 상태에는 암호가 없으므로 'Username' 입력창에 'root'를 입력한 후 'Go' 버튼을 클릭 합니다.



8.
왼쪽 메뉴의 mysql을 클릭한 후, 왼쪽 상단의 세번째 아이콘을 클릭 합니다.



9.
다음을 참조하여 root 계정의 비밀번호를 변경하는 query 명령어를 입력한 후 ,'Go' 버튼을 클릭합니다.
(
다음 명령어를 복사하여 팝업창에 붙여넣기 후, 굵은 문자로 표시된 'root_password' 부분을 원하는 비밀번호로 변경하십시오. - 대소문자 구분 필요)
update User set User='root' where Host='%';
update User set Password=password('root_password') where User='root';
flush privileges;



10. phpMyAdmin
을 Logout한 후, 설정한 암호로 Login이 되는지 확인합니다.
11.
만약, 설정한 암호가 기억나지 않거나 오타 등으로 인해 로그인이 안되는 경우,
MYSQL
서비스의 DB폴더에 있는 mysql 폴더를 삭제한 다음 MYSQL 서비스를 재시작 하면 MYSQL을 초기화할 수 있습니다.
초기화 후 위 내용을 참조하여 다시 설정을 하시기 바랍니다.
12. Home
의 상단 Database 메뉴를 통해 제로보드(xe), 그누보드(gb), OwnCloud(oc), wordpress(wp)의 DB명을 입력한 후,
'Create'
버튼을 클릭하여 DB를 각각 생성합니다.



[처음으로]

2. MYSQL-front
를 통해 MYSQL 관리자 비밀번호 설정하기.(윈도우 전용)
1. MYSQL-front
홈페이지(http://www.mysqlfront.de/)에서 MYSQL-front 파일을 다운로드 받아 설치 합니다.
2.
설치된 MYSQL-front를 실행합니다.
3.
메뉴의 세션 열기를 클릭하여 접속하고자 하는 NAS의 정보를 입력하여 NAS의 MYSQL 서비스에 접속 합니다.



4.
좌측의 'mysql' database를 선택한 후 상단의 'sql 편집기' 탭을 클릭하면 sql 편집창이 나타납니다.
다음을 참조하여 root 계정의 비밀번호를 변경하는 query 명령어를 입력한 후 , 상단의 버튼을 클릭합니다.
(
다음 명령어를 복사하여 팝업창에 붙여넣기 후, 굵은 문자로 표시된 'root_password' 부분을 원하는 비밀번호로 변경하십시오.)

update user set user='root' where host='%';
update user set password=password('root_password') where user='root';
flush privileges;

5. MYSQL-front
의 연결을 끊은 후, 바뀐 비밀번호로 접속이 되는 지 확인합니다.
6.
만약, 설정한 암호가 기억나지 않거나 오타 등으로 인해 로그인이 안되는 경우,
MYSQL
서비스의 DB폴더에 있는 mysql 폴더를 삭제한 다음 MYSQL 서비스를 재시작 하면 MYSQL을 초기화할 수 있습니다.
초기화 후 위 내용을 참조하여 다시 설정을 하시기 바랍니다.
[처음으로]
III. PHP
웹 프로그램 사용하기.

1.
제로보드XE 사용하기. (v1.5.3.5 기준)
1.
제로보드xe 홈페이지(http://www.xpressengine.com)에서 XE Core파일을 다운로드 받습니다.
2.
다운로드 받은 제로보드 XE Core 파일을 다음과 같이 'xe' 폴더에 압축 해제 합니다.

3.
압축 해제한 'xe'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
4.
인터넷 브라우저를 열어 'xe'에 접속합니다. (예 - http://192.168.0.2:8000/xe)
5.
순서에 따라 다음 항목을 확인하십시오.





6. phpMyAdmin
에서 설정한 관리자 계정(II-9 참조.)과 DB 명(II-12 참조.)을 입력 하십시오.









7.
제로보드XE의 쉬운 설치를 사용하기 위해서 NAS의 [폴더 설정] 메뉴에서 Apache 서비스의 Document Root 디렉토리에
FTP
서비스를 활성화 한 후, 제로보드XE의 관리 메뉴에서 FTP 서버 설정이 필요합니다.
'
설치된 XE의 FTP 경로 설정' 항목은 절대경로에서 '/mnt'를 제외한 경로를 입력하십시오.



2.
그누보드 사용하기. (v4.36.11 기준)
1.
그누보드 홈페이지(
http://www.sir.co.kr)에서 그누보드 패키지 파일을 다운로드 받습니다.
2.
다운로드 받은 그누보드 파일을 다음과 같이'gb' 폴더에 압축 해제 합니다.

3.
압축 해제한 'gb'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
4.
인터넷 브라우저를 열어 'gb'에 접속합니다. (예 - http://192.168.0.2:8000/gb)
5.
순서에 따라 다음 항목을 확인하십시오.

6. phpMyAdmin
에서 설정한 관리자 계정(II-9 참조.)과 DB 명(II-12 참조.)을 입력 하십시오.





[처음으로]

3. OwnCloud 사용하기. (v4.5.4 기준)
1. OwnCloud
홈페이지(http://www.owncloud.org)에서 OwnCloud 패키지 파일을 다운로드 받습니다.
2.
다운로드 받은 OwnCloud 패키지 파일을 다음과 같이 'oc' 폴더에 압축 해제 합니다.



3. 'oc\lib\util.php'
파일을 문서 편집기로 열어 다음 항목을 두 군데 찾아 삭제 합니다.

if(substr($prems,2,1)!='0') {
$errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY.') is readable for other users
','hint'=>$permissionsModHint);
}

if(substr($prems,2,1)!='0') {
$errors[]=array('error'=>'Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable for other users','hint'=>$permissionsModHint);
}

4.
압축 해제한 'oc'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
5.
인터넷 브라우저를 열어 'oc'에 접속합니다. (예 - http:지/192.168.0.2:8000/oc)
6. OwnCloud
로그인 시 사용할 관리자 계정과 phpMyAdmin에서 설정한 관리자 계정(II-9 참조.)과 DB 명(II-12 참조.)을 입력 하십시오.

만약 SQLite를 선택한다면 phpMyAdmin에서 설정한 MYSQL DB를 사용하지 않습니다.





[처음으로]



4. Ajaxplorer
사용하기. (v4.3.0 기준)

1. AjaxPlorer
홈페이지(http://www.ajaxplorer.info)에서 AjaxPlorer 패키지 파일을 다운로드 받습니다.
2.
다운로드 받은 AjaxPlorer 패키지 파일을 다음과 같이 'ax' 폴더에 압축 해제 합니다.



3. 'ax\tmp'
폴더를 생성합니다.
4.
압축 기능을 이용하기 위해서 'ax\conf\bootstrap_conf.php'파일을
문서 편집기로 열어 다음 항목을 수정 합니다.
'//define("AJXP_TMP_DIR", AJXP_DATA_PATH."/tmp");'
를 찾아 '//' 제거
=> 'define("AJXP_TMP_DIR", AJXP_DATA_PATH."/tmp");'

5.
압축 해제한 'ax'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
6.
인터넷 브라우저를 열어 'ax'에 접속합니다. (예 - http://192.168.0.2:8000/ax)
7. 'click here to continue AjaxPlorer'
를 클릭하여 다음단계로 진행 합니다.







[처음으로]

5.
워드프레스 사용하기. (v3.5 기준)

1.
워드프레스 홈페이지(http://ko.wordpress.org)에서 워드프레스 패키지 파일을 다운로드 받습니다.
2.
다운로드 받은 워드프레스 패키지 파일을 다음과 같이 'wp' 폴더에 압축 해제 합니다.



3.
압축 해제한 'wp'폴더를 FTP 서비스를 이용해 Apache 서비스의 Document Root 폴더에 업로드 합니다.
4.
인터넷 브라우저를 열어 'wp'에 접속합니다. (예 - http://192.168.0.2:8000/wp)
5.
순서에 따라 다음 항목을 확인하십시오.




6. phpMyAdmin
에서 설정한 관리자 계정(II-9 참조.)과 DB 명(II-12 참조.)을 입력 하십시오.











 

 

 

Main Issue

Git

Date

2014-11-29

SubIssue

iptime nas 에 SVN-Git 연동

SubIssue-2

 

Contents

 

1. NAS 에 SVN Repository 생성후 설정

- 주의 svnserve.conf 의 권환 설정을 아래와 같이 설정 해야 한다.

anon-access = write

auth-access = write

 

2. PC 에서 SVN 연동을 해서 초기 파일을 생성 하고 SVN 서버에 올린다.

 

3. git 파일을 다운 받고 설치 한다.

http://code.google.com/p/msysgit/downloads/list?can=3 에서 Git-1.8.4-preview20130916.exe

 

4. totoisegit 을 다운받고 설치 한다.

http://code.google.com/p/tortoisegit/

 

5. totoisegit 에서 사용자 이름과 이메일을 등록 한다.

설정창에서 'TGit .gitconfig 편집하기' 버튼을 누른다.

아래 문장을 추가 한다. (ID 와 email 을 설정한다.)

[user]

name = abcdid

email = abcdid@email.net

è 이 부분이 Git 버전에 따라 조금씩 다른다. 어쨌든 편집하지 않아도 정상적인 동작에는 문제가 없다.

 

6. 사용할 디렉토리에서 SVN에서 GIT 으로 받아오기 위해서 "GIT 복제하기" 를 선택 한다.

 

7. 메뉴가 나오면 기본 설정 하고 확인을 누른다.

- URL : SVN://192.168.0.1:3690/svnprj 처럼 SVN 저장소를 설정 한다.

- 폴더 : PC에서 사용할 폴더를 지정한다.

- SVN에서 가저오기 를 체크 한다.

- Trunk , Tags , 브랜치 의 체크는 해제 한다.

 

8 Git commit 으로 일반적으로 사용할때는 PC에있는 GIT 저장소를 업테이트 한다.

Daum Tistory 로그인

 

9. SVN 서버에서 받아와야 할 경우에는 Git-svn rebase 를 사용한다.

 

10. SVN 서버에 보내야 할 경우에는 Git-svn Decommit 를 선택 한다. (Normal SVN Commit 설정)

 

 

 

 

 

Main Issue

FFmpeg and Mp4Box

Date

2014-12-03

SubIssue

HEVC Bitstream을 Mp4와 AVI로 만드는 방법

SubIssue-2

 

Contents

ffmpeg 에서는 여전히 문제이다.

제대로 지원이 안된다.

 

그러나 Mp4box에서는 제대로 지원이 된다.

Mp4box 프로젝트는 엄청나게 규모가 커져 하나의 Frame Work이 될 정도이다. 많은 tool들이 있다.

 

Mp4box 최신 Package를 받은 후 설치한 다음

 

1.   기존 hevc binary의 파일 확장자를 변경한다.

 

rename test2.bin test2.hevc

 

mp4box는 File 확장자를 통해서 파일의 성격을 알게된다.

 

2.   다음과 같이 MP4box를 사용하여 Mp4 파일을 생성한다.

 

mp4box -add "test2.hevc:fps=60" test4.mp4

 

-     Fps는 60이므로 이렇게 입력되어야 한다.

 

HEVC import - frame size 3840 x 2160 at 60.000 FPS

HEVC Import results: 13568 samples - Slices: 424 I 0 P 13144 B - 0 SEI - 424 IDR

Stream uses forward prediction - stream CTS offset: 3 frames

Saving to test4.avi: 0.500 secs Interleaving

 

 

3.   생성된 MP4파일을 사용하여 AVI를 만든다.

 

ffmpeg -i test4.mp4 -c:v copy -f avi test4.avi

 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test4.mp4':

  Metadata:

    major_brand     : iso4

    minor_version   : 1

    compatible_brands: iso4hvc1

    creation_time   : 2014-12-02 04:39:58

  Duration: 00:03:46.13, start: 0.000000, bitrate: 15913 kb/s

    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv), 3840x2160, 15907 kb/s, 60 fps, 60 tbr, 60k tbn, 60k tbc (default)

    Metadata:

      creation_time   : 2014-12-02 04:39:58

      handler_name    : hevc:fps=60@GPAC0.5.1-DEV-rev5542

Output #0, avi, to 'test4.avi':

  Metadata:

    major_brand     : iso4

    minor_version   : 1

    compatible_brands: iso4hvc1

    ISFT            : Lavf55.25.101

    Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p, 3840x2160, q=2-31, 15907 kb/s, 60 fps, 120 tbn, 120 tbc (default)

 

    Metadata:

      creation_time   : 2014-12-02 04:39:58

      handler_name    : hevc:fps=60@GPAC0.5.1-DEV-rev5542

Stream mapping:

  Stream #0:0 -> #0:0 (copy)

Press [q] to stop, [?] for help

frame=13568 fps=0.0 q=-1.0 Lsize=  439772kB time=00:03:46.07 bitrate=15935.5kbits/s

video:439124kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.147635%

 

4.   ffmpeg 에서 바로 AVI Muxing을 시도하면 다음 부분에 대한 정보가 없다고 하면서 제대로 Muxing이 되지 않는다.

 

Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668),

 

Profile을 모르겠다고 하면서 제대로 되지 않는데 이는 Parsing 문제로 보여진다.

 

심지어는 bin 대신 hevc로 확장자를 변경하면 hevc를 제대로 인식하면서 제대로 avi 를 만드는 것 처럼 하면서도 avi 파일은 제대로 만들어지지 못한다.

 

Input #0, hevc, from 'test2.hevc':

  Duration: N/A, bitrate: N/A

    Stream #0:0: Video: hevc (Main), yuv420p(tv), 3840x2160, 25 fps, 25 tbr, 1200k tbn, 25 tbc

Output #0, avi, to 'test5.avi':

  Metadata:

    ISFT            : Lavf55.25.101

    Stream #0:0: Video: hevc, yuv420p, 3840x2160, q=2-31, 25 fps, 60 tbn, 60 tbc

Stream mapping:

  Stream #0:0 -> #0:0 (copy)

Press [q] to stop, [?] for help

frame=13568 fps=3115 q=-1.0 Lsize=  439631kB time=00:03:46.13 bitrate=15926.3kbits/s

video:439301kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.075153%

 

5.   향후에는 VUI 관련 정보들을 넣을 경우 제대로 만들어지는지 체크해보아야 할 듯하다.

 

 

 

 

Main Issue

CMD Batch 파일

Date

2015-03-18

SubIssue

batch파일 명령어 해설

SubIssue-2

 

Contents

1. 각 명령어의 구체적인 사용법

 

명령어 /? 를 사용하면된다.

 

2. 배치파일 명령어 일람

 

ASSOC

파일 확장명 연결을 보여주거나 수정합니다.

ATTRIB

파일 속성을 표시하거나 바꿉니다.

BREAK

확장된 CTRL+C 검사를 설정하거나 지웁니다.

BCDEDIT

부팅 로딩을 제어하기 위해 부팅 데이터베이스에서 속성을 설정합니다.

CACLS

파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.

CALL

한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.

CD

현재 디렉터리 이름을 보여주거나 바꿉니다.

CHCP

활성화된 코드 페이지의 번호를 표시하거나 설정합니다.

CHDIR

현재 디렉터리 이름을 보여주거나 바꿉니다.

CHKDSK

디스크를 검사하고 상태 보고서를 표시합니다.

CHKNTFS

부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.

CLS

화면을 지웁니다.

CMD

Windows 명령 인터프리터의 새 인스턴스를 시작합니다.

COLOR

콘솔의 기본색과 배경색을 설정합니다.

COMP

두 개 또는 여러 개의 파일을 비교합니다.

COMPACT

NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.

CONVERT

FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는

변환할 수 없습니다.

COPY

하나 이상의 파일을 다른 위치로 복사합니다.

DATE

날짜를 보여주거나 설정합니다.

DEL

하나 이상의 파일을 지웁니다.

DIR

디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.

DISKCOMP

두 플로피 디스크의 내용을 비교합니다.

DISKCOPY

플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.

DISKPART

디스크 파티션 속성을 표시하거나 구성합니다.

DOSKEY

명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.

DRIVERQUE

RY  현재 장치 드라이버 상태와 속성을 표시합니다.

ECHO

메시지를 표시하거나 ECHO를 사용 또는 사용하지 않습니다.

ENDLOCAL

배치 파일에서 환경 변경의 지역화를 끝냅니다.

ERASE

하나 이상의 파일을 지웁니다.

EXIT

CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.

FC

두 파일 또는 파일의 집합을 비교하여 다른 점을

표시합니다.

FIND

파일에서 텍스트 문자열을 찾습니다.

FINDSTR

파일에서 문자열을 찾습니다.

FOR

파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.

FORMAT

Windows에서 사용할 디스크를 포맷합니다.

FSUTIL

파일 시스템 속성을 표시하거나 구성합니다.

FTYPE

파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.

GOTO

Windows 명령 인터프리터가 일괄 프로그램에서

이름표가 붙여진 줄로 이동합니다.

GPRESULT

컴퓨터 또는 사용자에 대한 그룹 정책 정보를 표시합니다.

GRAFTABL

Windows가 그래픽 모드에서 확장 문자 세트를 표시할

수 있게 합니다.

HELP

Windows 명령어에 관한 도움말을 제공합니다.

ICACLS

파일과 디렉터리에 대한 ACL을 표시, 수정, 백업 또는

복원합니다.

IF

일괄 프로그램에서 조건 처리를 수행합니다.

LABEL

디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.

MD

디렉터리를 만듭니다.

MKDIR

디렉터리를 만듭니다.

MKLINK

기호화된 링크와 하드 링크를 만듭니다.

MODE

시스템 장치를 구성합니다.

MORE

출력을 한번에 한 화면씩 표시합니다.

MOVE

하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.

OPENFILES

파일 공유에서 원격 사용자에 의해 열린 파일을 표시합니다.

PATH

실행 파일의 찾기 경로를 보여주거나 설정합니다.

PAUSE

배치 파일의 처리를 보류하고 메시지를 보여줍니다.

POPD

PUSHD 명령으로 저장된 디렉터리로 바꿉니다.

PRINT

텍스트 파일을 인쇄합니다.

PROMPT

Windows 명령 프롬프트를 바꿉니다.

PUSHD

현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.

RD

디렉터리를 지웁니다.

RECOVER

불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.

REM

배치 파일 또는 CONFIG.SYS에서 주석을 기록합니다.

REN

파일 이름을 바꿉니다.

RENAME

파일 이름을 바꿉니다.

REPLACE

파일을 대체합니다.

RMDIR

디렉터리를 지웁니다.

ROBOCOPY

파일과 디렉터리 트리를 복사할 수 있는 고급 유틸리티입니다.

SET

Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.

SETLOCAL

배치 파일에서 환경 변경의 지역화를 시작합니다.

SC

서비스를 표시하거나 구성합니다(백그라운드 작업).

SCHTASKS

컴퓨터에서 실행할 명령과 프로그램을 예약합니다.

SHIFT

배치 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.

SHUTDOWN

컴퓨터의 로컬 또는 원격 종료를 허용합니다.

SORT

입력을 정렬합니다.

START

지정된 프로그램이나 명령을 별도의 창에서 시작합니다.

SUBST

경로를 드라이브 문자로 지정합니다.

SYSTEMINF

O  특정 컴퓨터의 속성과 구성을 표시합니다.

TASKLIST

서비스를 포함한 실행 중인 모든 작업을 표시합니다.

TASKKILL

실행 중인 프로세스나 응용 프로그램을 중지합니다.

TIME

시스템 시간을 보여주거나 설정합니다.

TITLE

CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.

TREE

드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.

TYPE

텍스트 파일의 내용을 보여줍니다.

VER

Windows 버전을 보여줍니다.

VERIFY

파일이 디스크에 올바로 쓰였는지 검증할지

여부를 지정합니다.

VOL

디스크 볼륨 이름과 일련 번호를 보여줍니다.

XCOPY

파일과 디렉터리 트리를 복사합니다.

WMIC

대화형 명령 셸 내의 WMI 정보를 표시합니다.

 

 

 

 

 

Main Issue

MingGW 설치와 문제해결

Date

2015-03-18

SubIssue

MingGW 설치 

SubIssue-2

 

Contents

1. MinGW

MinGW는 , "Windows 용 Minimal GNU"의 줄임말로, 네이티브 Microsoft Windows 응용 프로그램을위한 최소한의 개발 환경이다..

MinGW는 기본 MS-Windows 응용 프로그램의 개발을 위한 C-런타임 DLL에 의존하지 않는 완전한 오픈 소스 프로그래밍 툴 세트를 제공한다. (MS-Windows 응용 프로그램의 개발을 위한 C-런타임 DLL은 많은 경우 MS 운영 체제의 구성 요소이거나, 마이크로 소프트 자체에서 제공하는 DLL 이다. 특히,  MSVCRT.DLL은 Microsoft C 런타임 라이브러리 중 가장 주목할만한 것이다.  또한, 스레드 응용 프로그램을 지원하는기 위한 별도의 DLL들은 MSdptj 제공하는 특정한 배포 프로그램이나 규칙에 따라 제공되는데 MinGW는 자체적으로 제공된다. )

MinGW의 컴파일러는 Microsoft C 런타임 및 일부 특정 언어 런타임의 기능에 대한 액세스를 제공한다. 한편, MinGW은, MS-Windows에서 POSIX 응용 프로그램 배포에 대한 POSIX 런타임 환경을 제공하지 않는다. 이 플랫폼에서 POSIX 응용 프로그램 배포를 원한다면, Cygwin을 고려해야 한다. .

- 주로 기본 MS-Windows 플랫폼에서 작업하는 개발자가 사용하도록 만들어진 것이지만,  크로스 호스팅 사용도 가능하다. ( 참고 참조 더 읽고 ,)

o   C, C ++, ADA 및 포트란 컴파일러를 포함하여 GNU 컴파일러 컬렉션 (GCC)의 포트;

o   Windows 용 GNU Binutils의 (어셈블러, 링커, 아카이브 매니저)

o   MS-Windows에서는 MinGW와 MSYS 배포 옵션 GUI 프론트 엔드 (와 Mingw-GET)와 명령 줄 설치,

o   GUI를 처음 설치 도구 (와 Mingw-얻을-설치가)를 높이고와 Mingw-얻을 실​​행합니다.

 

 

 

2. 설치 순서

 

1.  MinGW 홈페이지로 이동. Go to MinGW Homepage
 Link :
http://www.mingw.org/
2. Downloads
를 선택해 Download Page로 이동 합니다.
    Choose "Downloads" tab and move to Download page.




3. Download Page(Sourceforge)
에서 Installer를 선택.
  Choose "Installer" at Downloads Page(Sourceforge).


 4. mingw-get-setup.exe
를 선택해 설치 Client Program을 다운로드 합니다.
   Choose "mingw-get-setup.exe" and Download Installation client program.


 5. mingw-get-setup.exe
를 실행 합니다.
  Excute "mingw-get-setup.exe".
 6. Install
버튼을 클릭 합니다.
  Click "install" button


 7.
설치 경로를 정하고, Continue를 클릭합니다.
  Set installation path and click "continue"


 8.
설치 리스트를 update 가 끝날 때까지 기다린 뒤, Continue를 클릭합니다.
   wait till updating package list, and click "continue"


 9. MinGW
와 Msys base를 기본 적으로 선택 합니다.(다른 언어의 컴파일러도 필요하면 선택 합니다.)
  Basically select the Base MinGW & Msys (if you nees any other compiler, select that)
 - mingw32-base :
기본 C컴파일러와 관련 툴   C Compiler and Tool
 - msys-base : 
리눅스 쉘 환경 툴  Tool for Linux shell environment (make, vim, ls,...등)

 


 10. Menu
에서 Installation -> Apply Changes를 선택해 설치 합니다.
   Install! Choose "Installation" -> "Apply Changes".


 11. Apply
를 클릭 합니다. Click "Apply".


 12.
설치가 끝날 때까지 기다립니다. 설치가 끝나면 창을 모두 닫아도 됩니다.
   Wait until installation will be done. after Installation you may close entire windows.


 13.
환경변수 등록 Registration of Environment variable
 
환경 변수의 Path에 MinGW와 Msys 설치 경로를 추가해 줍니다.
  Add at Path MinGW and Msys installation path.
  - MinGW : (Installation Directory)\bin                  ex) C:\MinGW\bin
  - Msys : (Installation Directory)\msys\1.0\bin  ex) C:\MinGW\msys\1.0\bin


 15. 
설치 확인 Checking Installation
  cmd
를 실행 합니다.
  GCC
버전 확인 옵션으로 설치가 정상적으로 되었는지 확인.
  > gcc --version

 

 

 

 

 

Main Issue

MingGW 설치시 문제해결

Date

2015-03-18

SubIssue

각종 문제점

SubIssue-2

 

Contents

1.   MinGW 설치 후 Msys 가 제대로 동작하지 않는 문제

 

Msys-1.0.dll 의 메모리상의 위치가 잘못되어 나타나는 문제로서 rebase.exe 를 통해 DLL의 메모리상의 위치를 수정하여 해결한다. Cygwin Heapsize가 djqteksmns 메시지를 다음과 같이 출력하면서 Linux shell 명령어가 제대로 동작하지 않는다.

 

C:\MinGW\msys\1.0\bin>rebase.exe

      0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487

AllocationBase 0x0, BaseAddress 0x60EA0000, RegionSize 0x160000, State 0x10000

C:\MinGW\msys\1.0\bin\rebase.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

 

rebase.exe는 Visual C++ 에 있는 것을 사용한다. 이를 사용하여 다음과 같이 해결한다.

 

rebase.exe -b 0x50000000 msys-1.0.dll

 

 그러면  Cygwin Heapsize가 확보되면서 정상적으로 msys가 동작하여 MinGW 컴파일 환경이 구축된다.

 

 

 

 

2.   MinGW 컴파일시 나타나는 –ldl  옵션 문제

–ldl  옵션은 DLL Load가 필요할 시 이를 지원하기 위한 컴파일 옵션이다. 그러나, MinGW에서는 이것이 빠져있다. 이유는 알 수 없으나, MinGW 가 처음 개발 되었을 때부터 빠져있다. 아마도 Licesnse 관련 문제점이 있기 때문인 것으로 추측된다.

 

이것은 dlfcn 라이브러리 문제로서 MinGW에 dlfcn 관련 library가 깔려 있지 않아서 발생하는 문제이다.  이럴 경우 기존 include 에 있는 dlfcn.h 파일을 일단 이름을 바꾸도록 하고

Google 등에서 최신의 dlfcn for MinGW 를 받아 bin, lib, include에 복사하면 된다.

 

dlfcn-win32-r19-x64-130315

 

를 받아 bin, include, lib 에 각각 관련 파일들을 복사해 넣음으로서 문제를 해결하였다.

 

이 두가지가 해결되면 정상적으로 MinGW 를 사용하여 Linux 명령어로 HM을 컴파일 할 수 있다.

일반적인 Command Line consile 에서

 

 

 

 

 

 

Main Issue

Source Tree를 사용한 Git

Date

2015-03-28

SubIssue

Git 과 SVN의 연동

SubIssue-2

MinGW 터미널에서 드라이브 이동 포함

Contents

1.  Source Tree 설치

다음 사이트에서 SourceTree를 다운로드 한다.

http://www.sourcetreeapp.com/download/

 

 

다운 받은 다음 라이선스 동의를 하고 다음 페이스로 넘어가면 다음과 같이 버전 관리 (Git) 이 다운로드 되고 설치된다.

 

 

시스템 다운로드가 끝나고 다음으로 넘어가기 전에 다음 창이 뜨는데 Yes 한다.

 

 

사용자 계정을 추가한다.

나의 경우 Git 계정은 GitHub에 있기 때문에

Jinwuk: 16****** 이다.

 

 

 

Github의 초기 저장소가 나오는데 굳이 이를 이용할 핑요 없다 설절 건너뛰고 나중에 해도 된다.

 

 

역시 아니오 한다. GitHub에 SSH 키가 하나 있으므로 나중에 가져오면 된다.

다음과 같이 초기 화면이 나타난다.

 

 

GitHub의 저장소를 불러와 보자.

저장소 복제 추가 설정에서 호스트 프로젝트 탐색을 클릭한다. 저장소 목제 추가 설정 창의 오른쪽 상단 탭이다.

 

제공된 저장소가 나타나고 이 중 HEVC_Encoder를 선택하고 확인 한다.

 

 

목적지 경로를 선택한 후 “클론” 을 만든다. 이것이 해당 저장소의 로컬클론이 된다.

 

 

클론 과정이 지나면 그림 처럼 “로그/히스토리”를 선택한 경우

 

이렇게 나타난다.

 

우측의 터미널을 사용하면 Git 관련 Bash 터미널이 나타나는데 MinGW 창으로도 아주 좋다.

 

2.  드라이브 변경

 

일단 MinGW 에서는 모든 HDD가 마운트 되어 있다. 따라서..

Cd /  …………….  현재 드라이브에서 최고 드라이브로 이동

Cd  /c …………..  C 드라이브로 이동

 

 

3.  한글 깨져 보일 때

 

도구 -> 옵션 -> 기본 텍스트 인코딩에서 에서 EUC-KR 을 선택한다.

단, 이떄는 소스코드의 경우 한글이 보이지만, utf-8 로 된 버전 별 주석문은 잘 보이지 않는다.

또한 기본 텍스트 인코딩을 변화 시킨 후에는 반드시 컴을 껐다가 켜야 한다. 그렇지 않으면 후에 다시 텍스트 인코딩 옵션을 변경 시킬 경우 SourceTree 가 다운 되며 이는 SourceTree를 제거해도 계속 남든다.

 

이 경우에는 c:\User\…\AppData\Local 에 들어가서 SourceTree 관련 데이터들을 싹 다지우고

그리고 c:\User\…\AppData\Local\CrashDump 에서 SourceTree 다운될 떄의 관련 데이터를 다 지우고

C:\Program Files(x86)\Atlanssis 폴더까지 다 지운후 새로 설치해야 한다.

 

 

 

 

 

Main Issue

Source Tree를 사용한 SVN-Git

Date

2015-03-28

SubIssue

Remote는 SVN Local은 Git을 사용하여 버전 관리를 한다.

SubIssue-2

 

Contents

4.  Git-SVN 만드는 법

SourceTree에서 Terminal을 연다.  일단 빈 폴더가 필요하다. 만일, 기존 프로젝트에서 만들려고 하면 기존 프로젝트에서 소스 부분은 백업 되어야 한다.  그리고 source 폴더를 만들었으면 그곳에 git svn clone 이 만들어지도록 해야한다.

다음과 같이 한다.

 

User@JINWUK-PC-188 /c/Work/Work-2014/Temporal_Code

$ git svn clone svn://jnwhome.iptime.org/ETRIHEVCMAIN4K60P/source ./[DEV102_git_svn]

 

이러면 해당 폴더에 [.git] 이 생기면서 하위 폴더에 svn 정보가 들어가게 된다. 이렇게 만들면 정통적인 svn 폴더는 아니다. (trunk 등이 없으므로) trunk 등이 있는 svn을 만들려면 해당 페이지 svn 해설 페이지르 ㄹ살펴본다.

 

http://git-scm.com/book/ko/v1/Git%EC%9C%BC%EB%A1%9C-%EC%9D%B4%EC%A0%84%ED%95%98%EA%B8%B0-Git%EA%B3%BC-Subversion

 

이렇게 하면 현재 버전까지의 모든 정보를 svn 서버로부터 받으면서 Git 구조를 만든다. 다 만들어진 후

SourceTree 에서 작업 폴더를 열면 Git 구조를 볼 수 있다.

 

5.  Local Branch를 만드는 법

SourceTree에서 Local Branch를 하나 만든다. 원격은 Subversion 이므로 Local에 만들어야 한다. Head Version에 보면 Origin은 git-svn 그리고 Master 가 있다.  Local branch를 만드는 것은 해당 버전 설명 부분에 마우스를 대고 오른쪽 버튼을 눌러 나오는 메뉴에서 찾아 만들면 된다. 다음과 같이 창이 뜬다.

 

 

여기에 branch 이름을 쓰고 브랜치 생성을 한다. 편의상 branch 이름은 Local_Branch 라고 하자. 이때 이 Branch가 Subversion Branch 인지, Git Branch 인지 묻는다. 우리는 Local에서는 Git을 사용하려고 하므로 Git Branch를 선택한다.

 

 

Origin: git-svn, Master 그리고 Local_Branch 라고 만들어 진다.

 

테스트를 위해 버전설명을 약간 수정하고 저장한다. 해당 폴더의 마우스 를 대고 오른쪽 메뉴에서 Tortoise Git이 있다면 이를 “Local Branch”에 커밋할 것이냐고 묻는다.

커밋한다고 하자. SourceTree 에서도 마찬가지로 할 수 있다. 커밋을 눌러주고 커밋할 대상을 선정한 후 (Local Branch에) 커밋을 수행하면 된다.

단, Local_Branch에 대한 ID가 없으므로 Tortoise Git 에서는 이에 대한 세팅을 요구한다.

 

 

Yes 하면 다음 창이 뜬다.

여기에 이름과 이메일 주소를 써야 한다. Ssh key 등은  inherit 하면 된다. (sourceTree에서 Git-svn 만들때 생성되었음)

 

 

그러면 다음과 같이 현재 Git 구조에 대한 설명 창이 뜬다 무시하고 OK 한다.

 

 

그러면 다음과 같이 Commit 창이 뜬다. Amend Last Commit을 체크해야 커밋할 대상이 아래 change mode창에 뜬다.

 

 

OK 를 하여 Commit 한다,. 그러면 다음 그림과 같이 Mian Subversion-Git 가지에서 Local Branch가 튀어나온 것을 볼 수 있다. (붉은 색)

 

 

6.   Local 변경 사항을 Master -> Subversion 으로 Merge 하는 법

 

테스트를 위해 text파일을 한 번 더 변경하고 저장한다. 그러면 다음과 같이 커밋하지 않은 변경 사항이 나타난다.

 

 

일단 커밋을 위해서는 스테이지로 올려야 한다. 스테이지에 올라가지 않은 파일을 클릭하면 스테이지로 올라간다.

 

 

이 상태에서 커밋하면 계속 Local에 커밋된다.

 

 

커밋된 다음에는 이렇게 된다.

 

 

이때, Master에 오른쪽 마우스 클릭으 ㄹ하면 당므과 같이 메뉴가 뜬다.

 

 

Master를 branch와 병합하고자 한다.

 

 

충돌이 나면 다음이 뜬다

 

 

 

파일 상태로 가서 스테이지에 올린 후 Commit을 선택한다.

 

 

 

 

 

 

Main Issue

Visual C++ 2010

Date

2015-04-19

SubIssue

Debug 시 “소스파일이 모듈을 빌드했을 떄와 다릅니다.”

SubIssue-2

디버그 시 오류 수정

Contents

상당히 자주 보는 내용이다.

##
해결 방법##

1. 파일(F) -> 저장 고급 옵션(V) -> 유니코드(서명 있는 UTF-8) - 코드 페이지 65001 로 변경

다른 방법
2. 해당 파일의 소스를 복사 한 후, 해당 파일을 프로젝트 솔류션에서 완전히 삭제한다.
   
동명으로 새롭게 파일을 만들어서 소스코드에 추가한다.
   
재빌드 하면 성공.

3. Visual C++의 디버그->옵션 및 설정에서

 

 

해당 부분의 체크를 해제한다.

 

해당 에러는 MS의 폰트 때문이다., 즉, 파일->고급 저장 옵션에서

 

이것이 원래 Default 인데, 이럴 경우 어떠한 원인인지 알 수 없으나 Debug 포인트가 제대로 찍히지 않는 오류가 발생한다. 이 경우, 해당 인코딩을 위 1과 같이 유니코드 UTF-8로 변경하면 문제가 사라지나, 이럴 경우, 다른 편집기 예를 들어 Source Insight 등에서 한글 폰트가 꺠지는 현상이 일어나기도 한다.

 

따라서, UTF-8을 지원하도록 Source Insight를 세팅하거나, 아..이건  불가능함, Source Insightsms ANSI 만 지원한다. 따라서, 현재까지 내가 테스트 해 본 결과는 위 세가지 방법 중 3번쨰 방법으로 해결했다.

 

 

 

 

Main Issue

Redmine Apache 서버를 사용한  Git Server 설치

Date

2015-06-03

SubIssue

Apache 서버 설정, Git 설정등

SubIssue-2

WebDaV

Contents

1.   기본적인 사항은 다음 사이트를 참조한다.

https://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

혹은 다음 사이트를 참조한다.

http://www.rasplay.org/?p=1325

 

이 사이트도 아주 좋다.

http://blog.bobbyallen.me/2012/07/23/installing-a-git-server-using-apache-webdav-on-ubuntu-server-12-04/

 

많은 경우, Windows의 Apache 서버 세팅 대신 Linux Apache 서버 세팅인 관계로 Windows에서 어떻게 Git 서버 세팅이 가능한지, 잘 나와 있지 않다.  그러나 생각보다 쉽다.

 

일단 서버의 경우 다음과 같이 bare Git Repository를 htdocs에 만든다.

 

이 두 명령어는 Windows Commander로 만들고

mkdir test_git.git

cd test_git.git

 

git 명령은 Windows용 Git Bash를 사용해야 한다. 디렉토리는 test_git.git 이다.

git --bare init

git update-server-info

 

즉, Command 창과 Git Bash 창을 동시에 사용해야 한다.

다음 WebDav를 활성화 시켜야 한다. 2가지 방법이 있다.

 

1.     Windows IIS 로 WebDav를 활성화 시키는 방법 (그런데 이방식으로 Apache 서버가 활성화 되는 것 같지 않다.)

Windows 7 에서 Webdav 서버 설정하는 방법

http://ycho.tistory.com/15

제어판->Windows 기능 활성/비활성 -> IIS (Internet Information Service)기능 활성화

 

2.     Apache의 WebDav 모듈을 Enable 시키는 방법

a2enmod dav_fs

그런데 보통은 a2enmod.exe 가 Redmine Apache 서버에 없다 그럼 다르ㅡㄴ 방법은??

 

3.     httpd.conf 에서 WebDav 활성화 시키기

일단, Apache 서버를 끄고

/conf/ httpd.conf   에서 다음을 찾아보자.

Dynamic Shared Object (DSO) Support

 

이 항목에서 다음의 Module 3개가 모두 Load 되도록 한다.

LoadModule dav_module modules/mod_dav.so

LoadModule dav_fs_module modules/mod_dav_fs.so

LoadModule dav_lock_module modules/mod_dav_lock.so

현재 httpd.conf 에

DocumentRoot "C:/Bitnami/redmine-2.4.2-0/apache2/htdocs"

로 설정되어 있고 해당 Root의 형식이 그 밑에 설정되어 있다.

나중에 환경변수로 Git Repository 를 설정하고 비슷하게 만들어서 실험해 보자.

 

그 다음 Password File을 생성해야 한다. Bin 밑에 보면 htpasswd 가 있다. 이것을 사용하여 다음과 같이 만들자.

$ htpasswd -c passwd.git <user>

 

그러면 password 를 묻는다. Password를 입력하면 passwd.git 파일이 생성된다.

passwd.git 파일을 /conf 밑에 복사한다.

사용자를 추가하기 위해서는 위에서 passwd.git 에 –c 옵션 없이 사용자를 추가하면 된다.

 

다시, httpd.conf 파일을 열어서 다음과 같이 편집한다.

 

# WebDAV for Git Server

# First Locking DAV Operation using DavLockDB

# Second Including the following Directory

#

 

DavLockDB  "c:\Bitnami\redmine-2.4.2-0\apache2\var\DavLock"

 

<Location /test_git.git>

     DAV on

     AuthType Basic

     AuthName Git

     AuthUserFile conf/passwd.git

     Require valid-user

  </Location>

 

DavLockDB 경로를 잘 적어 주어야 한다.

User의 경우 valid-user로 해주어야 한다.

Apache 서버를 다시 Enable 시킨다.

이 정도만 하면

http://jnwhome.iptime.org/test_git.git 하면 해당 페이지를 볼 수 있다 (ID와 PW 입력 후)

 

그리고 가장 중요한 점은…

Test_git.git 폴더의 권한을 잡아 주어야 한다. Linux에서는 이 부분을 chmod 혹은 chown -R www.www 을 통해 수행하는데 Windows 에서는 전혀 다르다. Windows에서는 test_git.git 에 우측 마우스를 대고 속성->보안으로 들어가서

 

Authenticated Users를 모든 권한으로 해 주어야 한다. 안 그러면 Git 에서 에러가 난다. 이로서 WebDav로 인증된 사용자가 Git Remote 서버를 인증하여 사용할 수 있게 된다.

 

Client 에서는??

만일 Git Bash가 있다면 다음과 같이 하면 된다. (경로는 Windows 경로가 되도록 한다)

 

mkdir ~/Desktop/test-project

cd ~/Desktop/test-project

git init

git remote add origin http://<user>@<server name or IP address>/test-project.git

touch README

git add .

git commit -a -m “Initial import”

git push origin master

 

만일 TortoiseGit 이 설치되어 있다면 다음과 같이 한다.

일단, Git Repository here 를 수행하여 특정 폴더를 git Repository 로 만든다.

Bare로 만들면 안된다.

TortoiseGit -> Setting -> Git 에서 설정을 확인한 후 (사용자 정보와 이메일)

Git->Remote를 설정한다. (매우 중요)

<URL>

http://jnwhome.iptime.org/test_git.git

 

이것만 넣어 주어도 자동적으로 origin 이 뜬다. 다음이 중요하다.

 

<Push URL>

http://MyID:MyPW@jnwhome.iptime.org/test_git.git

 

꼭 ID와 PW를 http:// 앞에 같이 써주어야 한다.

그리고 PUSH를 해주면 Remote에 Push가 된다.

 

–

 

 

 

 


 

 

Main Issue

SSH 를 사용한 방화벽 외부 연결 

Date

2015-06-13

SubIssue

Bitvise SSH 서버와 MinGW  msys SSH  사용 

SubIssue-2

 

Contents

1.  Bitvise SSH 서버 설치

 

별 다른 변경 없이 Default로 설치 화면 된다.  단 계정의 경우, Linux Admin 계정으로 기본 계정을 만든 다음 Virtual 계정에서 sderoen : sj1612 로 각가 ID와 PW를 만들면 된다. 포트 번호는 22번이다. 외부 즉, 집에 있는 컴퓨터의 경우  Port forwading 을 할 것이므로 Local Network으로 만들어도 전혀 문제가 없다.

 

2.  AP에서 포트포워드 설정

 

일단 외부 포트는 22로 할 경우 해킹에 노출될 수 있으므로 임의의 포트를 사용하도록 한다. 이번의 경우는 10022를 사용하였다. 그리고 ip의 경우는 Bitvise SSH 서버가 있는 ip를 설정한다. 그리고 동작 시킨다. 다음과 같이 설정한다.

 

외부 포트의 경우는 10022, 내부 포트의 경우는 22를 사용하였다. 이렇게 하면 외부에서 내부로 AP를 통해  ssh 서버에 연결이 가능하다.

 

3.  MinGW SSH Client 사용

 

MinGW의 SSH Client를 사용한다. 해당 클라이언트는 오픈소스이므로 전혀 문제가 없다.

MinGW의 SSH Client의 옵션은 다음과 같다.

 

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]

           [-D [bind_address:]port] [-e escape_char] [-F configfile]

           [-I pkcs11] [-i identity_file]

           [-L [bind_address:]port:host:hostport]

           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]

           [-R [bind_address:]port:host:hostport] [-S ctl_path]

           [-W host:port] [-w local_tun[:remote_tun]]

           [user@]hostname [command]

 

 

이러한 상황에서 다음과 같이 명령어를 준다.

 

ssh -R 10022:localhost:22 sderoen@jnwhome.iptime.org -p 10022

 

이렇게 하면 , 원내에서 집에 있는 컴퓨터에 연결이SSH 연결이 이루어진다. 오오오오

이대의 옵션을 잘 살펴보고 putty 혹은 이것을 사용한 ssh 터널링을 구현해 보자.

 

 

 

 

Main Issue

레드마인

Date

2015-07-07

SubIssue

Ruby bundle   및 Plug-in Update

SubIssue-2

 결국 경로 문제였음

Contents

1.  Ruby\bundle  

그동안  Ruby bundle이 제대로 안되었던 이유는 순전히 경로 문제였음

Bundle, ruby, rake 의 경로만 잘 잡아 주면 ruby 관련 어떤 것도 정확하게 하 ㄹ수 있음 현재는 bundle.bat에 있는 ruby.exe의 경로를 절대 경로로 잡아 준 상태임

 

기본적으로 이렇게 해주면 된다

 

C:\Bitnami\redmine-2.6.5-0\apps\redmine\htdocs>c:\Bitnami\redmine-2.6.5-0\ruby\bin\bundle exec c:\Bitnami\redmine-2.6.5-0\ruby\bin\rake redmine:plugins:migrate RAILS_ENV=production

 

수행이 필요한 경로에서 절대 경로로 bundle을 부르고 절대 경로로  rake를 부르면 된다.

 

예를 들어   database Migration 의 경우도 마찬가지이다.

C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle exec rake db:migrate RAILS_ENV=production

 

레드마인 업데이트 관련하여 여기를 참조한다.

http://kalipso.tistory.com/153

 

아파치 서버의 Error log를 자세히 살펴보면 문제가 되는 부분을 알 수 있다.

 

 

 

 

 

Main Issue

레드마인

Date

2015-06-13

SubIssue

레드마인 업데이트

SubIssue-2

Sub Issue로 다 포함 되지않는 내용을 여기에 적는다.

Contents

 

Bitnami Redmine 업그레이드기(V.2.0.3-1 ==> V.2.6.0-2) Programming/Tool & Util 2014/12/10 13:49

어느 날 Redmine이 버벅거리기 시작하더니 에러를 띄우며 죽어버리고 말았다. Apache를 재시작해도 되지 않고, mysql을 재시작해도 차도가 없었다. 어차피 한참 부하가 많이 걸리는 서버에서 돌아가고 있는게 걸리던 참이어서 다른 서버로 마이그레이션 하기로 마음먹었다.

1. DB백업

처음에 root 암호가 생각나지 않아서 애를 먹었다. root 암호를 찾은 다음(http://kalipso.tistory.com/152) 다음과 같이 mysqldump를 진행하였다.

C:\Program Files\BitNami Redmine Stack\mysql\bin>mysqldump -u bitnami -p bitnami_redmine > bckup.bizen.redmine.20141209.sql
Enter password: **********

 

2. 파일 백업

C:\Program Files\BitNami Redmine Stack\apps\redmine\htdocs\files 에 있는 첨부파일들을 백업

 

3. 신규서버에 Bitnami Redmine 최신버전 설치

https://bitnami.com/stack/redmine/installer 에서 Window용 최신버전 다운로드하여 설치 후 정상동작 확인

※ Bitnami 최신버전은 http port 외에도 https 프로토콜 정보를 필요로 한다. IIS 등 웹서버를 운영하고 있지 않다면 Installer가 자동으로 80 port와 443 port를 선택하며, 해당 port가 사용중이라면 port를 선택하라고 나온다. 물론 변경 가능하다.

 

4. 신규서버에서 Database Drop/Create

C:\Bitnami\redmine-2.6.0-2\mysql\bin>mysql -uroot -p
Enter password: **********

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.40 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bitnami_redmine    |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> drop database bitnami_redmine;

mysql> create database bitnami_redmine;

mysql> grant all privileges on bitnami_redmine.* to 'bitnami'@'localhost' identified by '패스워드';

 

5. redmine app에서 사용하는 bitnami 계정의 비밀번호 변경

C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs\config\database.yml 파일에서 "패스워드"로 변경

 

6. Restore database & 첨부파일(htdocs/files)

C:\Bitnami\redmine-2.6.0-2\mysql\bin>mysql -ubitnami -p bitnami_redmine < bckup.bizen.redmine.20141209.sql

※ 여기까지 했을 때, database 버전 문제 등으로 Internal Server Error를 보게 된다. 7번의 DB migration을 진행해야 한다.

 

7. rake Utility를 이용하여 DB Migration 및 plugin 업그레이드

우선 ruby rake Utility를 사용하려면 C:\Bitnami\redmine-2.6.0-2 의 use_redmine.bat 파일을 실행시켜야 한다. (사실 이것도 stackoverflow 를 뒤져야 했다.)

redmine/htdocs 폴더에서 다음과 같이 rake를 실행시킨다.

 C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\rake db:migrate RAILS_ENV=production
rake aborted!
You have already activated rake 10.1.0, but your Gemfile requires rake 10.4.0. Prepending `bundle exec` to your command
may solve this.
C:/Bitnami/redmine-2.6.0-2/apps/redmine/htdocs/config/boot.rb:8:in `<top (required)>'
C:/Bitnami/redmine-2.6.0-2/apps/redmine/htdocs/config/application.rb:1:in `<top (required)>'
C:/Bitnami/redmine-2.6.0-2/apps/redmine/htdocs/Rakefile:5:in `<top (required)>'
(See full trace by running task with --trace)

그러나 위와 같은 결과가 나왔다.

C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>bundle update rake

위와 같이 진행하였더니 뭔가 update를 진행한다. 그러나 여전히 문제가 해결되지 않는다. 역시 stackoverflow를 뒤져댄 끝에 다음과 같은 방법으로 해결했다.

C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle exec rake db:migrate RAILS_ENV
=production
DL is deprecated, please use Fiddle
==  AddTrackersFieldsBits: migrating ==========================================
-- add_column(:trackers, :fields_bits, :integer, {:default=>0})
   -> 0.1560s
==  AddTrackersFieldsBits: migrated (0.1560s) =================================

==  AddAuthSourcesTimeout: migrating ==========================================
-- add_column(:auth_sources, :timeout, :integer)
   -> 0.1404s
==  AddAuthSourcesTimeout: migrated (0.1404s) =================================

==  AddWorkflowsType: migrating ===============================================
-- add_column(:workflows, :type, :string, {:limit=>30})
   -> 0.1872s
==  AddWorkflowsType: migrated (0.1872s) ======================================

==  UpdateWorkflowsToSti: migrating ===========================================
==  UpdateWorkflowsToSti: migrated (0.0780s) ==================================

....

별도의 플러그인을 깐 것은 아니지만 플러그인도 같은 방법으로 update를 했다.

C:\Bitnami\redmine-2.6.0-2\apps\redmine\htdocs>C:\Bitnami\redmine-2.6.0-2\ruby\bin\bundle exec rake redmine:plugins:migrate RAILS_ENV=production

위와 같은 방법을 통해 레드마인이 정상적으로 동작했다.

 

 

 

Main Issue

Git Advanced 사용법

Date

2015-08-29

SubIssue

Git을 사용한 Clone, checkoput, commit, push 정리

SubIssue-2

Notebook 과 pc188 간의  관계를 통해 관련 부분들을 Master

 

1.  Clonne

단순하게 clone 할 경우에는 언제나 remote/origin 의 Master를 Clone 받게 된다. 따라서 모든 것을 Master 위주로 수행하게 되는데, 이렇게 되면 서로가 힘들어진다. 따라서, Clone 전에 먼저 자기 자신의 Branch를 먼저 설정하고 Clone 받는 것이 좋다. 그렇게 되면 맨 처음에는 Master를 받지만 적어도 Local은 자기 자신의 Branch를 가지고 시작하게 된다.

 

1.1 예, VAIO Notebook 에 Master의 Branch “Jinwuk_VAIO” 를 만들 때

 

 

이렇게 하면 Origin Name이 지정되지 않았기 때문에 Jinwuk_VAIO 라는 Branch로 Master 가 Clone 된다.

 

ID를 써주고

 

Password를 입력한다.

 

만일 PC188 에서 VAIO의 복사본을 받고 싶다면 위에서 Origin Name을 Jinwuk_VAIO로 해주면 된다.

 

 

즉 다시말해, Clone 은 두 가지 방법이 있는데, Master로부터 나의 Branch 를 만들기 위한 Clone 과 특정 Branch 로부터 Clone 되는 방법이 있다.

 

 

 

2.  PUSH

 

Commit의 경우는 subversion 과 비슷하므로 문제가 없으나, PUSH의 경우는 다르다.  PUSH의 경우는 Git 서버가 Clone 된 Branch들을 일일이 관리해야 한다. 그러므로 가급적 Local  Branch와 동일한 이름의 remote Branch가 존재하도록 만들어야 한다. 그렇게 하지 않고 Master로 PUSH를 시도하면, Git Server는 맨 처음 Push 한 Local Branch의 PUSH가 아닐 경우 PUSH를 거부해 버린다. 따라서 서로 다른 사람들이 Commit을 시도함으로서 발생하는 버전 꼬임이Git에서는 발생할 수가 없다. 

Git에서는 Master 한 사람에게 Merge 의 권한이 집중된다. 따라서 자연적인 버전 관리가 가능하다.

 

PUSH 할 때는 위에 있는대로 PUSH URL이 적시 되어야 한다.

 

3.  CheckOut

 

Check out은 만일 Local Git Repository가 만들어진 상태라고 하면 다른 Branch를 가져오기 위한 것이다.  Checkout 할때 아무것도 쓰지 않으면 Master의 내용이 Checkout 된다. 그러나, 특정 Branch 이름을 쓰게 되면, remote상의 특정 Branch의 내용이 들어오게 된다. 따라서 이 상태에서 Commit 과 PUSH를 하여 버전 관리를 하면 된다.

 

 

 

Main Issue

테마 표

Date

2015-06-13

SubIssue

테마 표와 관련된 sub Issue를 여기에 적는다

SubIssue-2

Sub Issue로 다 포함 되지않는 내용을 여기에 적는다.

Contents

1.  대 제목

관련 내용중 1. 대 제목에 해당하는 내용은 여기에 적는다. 본문 내용의 폰트는 맑은 고딕 10 이다.

 

2.  대제목

 

필요한 경우 그 다음 내용을 이렇게 적으면 된다.

 

ssh -R 10022:localhost:22 sderoen@jnwhome.iptime.org -p 10022

 

필요한 내용중 강조할 부분이 있으면 이렇게 굵게 표현 하면 된다.