64비트 Win7에서 VCi가 죽은 이유는…

VCi 이전버전, 정확히는 3.8c까지는 64비트 Win7에서 오류가 발생했다.
32비트에선 문제가 없고, 64비트에서만 문제가 발생해서 OS의 문제라고 쉽게 생각했다.
하지만…


1. 문제의 발단

VCi는 VC++ 6.0으로 개발되었는데, VC6에는 atof()의 wchar_t 버전이 없다.
(웃긴 건 atoi()의 wchar_t 버전은 있다는 거)
따라서, wchar_t에서 atof()를 사용하려면 char로 복사를 한 뒤에 atof()를 사용해야 한다.


2. 문제가 발생한 위치

VCi의 소스를 그대로 적은 건 아니지만, 대략 아래와 같은 소스에서 문제가 발생했다.

CString cs=_T("23.976");
int iLen = cs.GetLength();
char *ch = new char[iLen+1];
int i=iLen;
while (i-- >= 0) ch[i] = (char)(cs.GetAt(i));
double d = atof(ch);
delete ch;

오류가 발생한 곳은 6행의 atof().
물론, atof() 자체에 버그가 있는 건 아니고, 인자로 넘어간 *ch가 0으로 정상종료되는 문자열이 아니었던 것이다.

진짜 문제는 5행의 while()에 있었다.
while (i-- >= 0)에서 i를 하나 줄이는 시점은 ch[i]=… 를 실행하기 인데, 이걸 실행 라고 착각한 것이다.
즉, 문자열을 복사할 때 "23.976(0)"이 아닌 "(?)23.976"이 복사된 것이고, 이에 따라 atof()는 오류를 발생시킨 것이다.

32비트 OS들에서 문제가 없던 건 단지 운이 좋았던 것 뿐이다. OTL


3. 해결

거창한 해결이랄 것도 없이, (쓸데없이 복잡하게만 씌여진) 4, 5행을 아래와 같이 상식적으로 수정했다.

CString cs=_T("23.976");
int iLen = cs.GetLength();
char *ch = new char[iLen+1];
for (int i=0; i<=iLen; i++)
  ch[i] = (char)(cs.GetAt(i));
double d = atof(ch);
delete ch;

지금 코드를 들여다보고 느낀 건데, 왜 저렇게 희안한 구조를 썼는지 모르겠다.
상식적으로 for()를 쓰면 되는데…


Trackback 0 Comment 12
  1. Favicon of http://oneniner.net BlogIcon oneniner 2011.04.13 11:16 address edit & delete reply

    훔훔 내가 봐도 애매한 코드일세~
    모든것은 자네 탓일세~ ㅋㅋㅋㅋ
    그렇게 생각하게나~ ^^

  2. 최속불꽃 2011.04.13 15:52 address edit & delete reply

    감사합니다.
    이제 다시 VCi를 쓸 수 있게 되었군요

  3. totzz 2011.04.13 23:05 address edit & delete reply

    다시 vci를 쓸수있어서..정말감사한데..예전부터 이상하게 자막파일으 인코딩이 끝나도 입혀지지가안더군요..... 자막이 안보이내요. 계속;;

    • Favicon of http://oneniner.net BlogIcon oneniner 2011.04.14 10:56 address edit & delete

      VCi 의 자막은 입혀지는 형태가 아닐텐데요~
      아이폰에 가시면 자막이 내장된 mp4의 경우 플레이 콘트롤 옆에 키보드 모양의 아이콘이 형성이 됩니다.
      그걸 터치하시면 자막 선택이 뜰겁니다~ ^^

  4. totzz 2011.04.14 19:11 address edit & delete reply

    [2011.04.14 19:03:37.701] OS Info: Microsoft Windows XP Professional Service Pack 2 (build 2600)
    [2011.04.14 19:03:37.794] Mem Info: 2511 MBytes of free physical memory (out of Total 3582 MBytes of physical memory, 29% in use)
    [2011.04.14 19:03:37.872] File check completed: ffmpeg, neroAacEnc, MP4Box, mkvextract, OGMDemuxer, normalize, pcmdownmix, MediaInfo
    [2011.04.14 19:03:37.966] Option: smaller than 4GB = 0
    [2011.04.14 19:03:38.044] Option: Resolution check for iPhone = 5
    [2011.04.14 19:03:38.137] Option: Kindness of iPhone = 1
    [2011.04.14 19:03:38.137] Option: 30fps check = 0
    [2011.04.14 19:03:38.137] Option: Create VCi-DC = 0
    [2011.04.14 19:03:38.137] Option: Overwrite VCi-DC to DC = 0
    [2011.04.14 19:03:38.137] Option: Pixel Aspect Ratio mode = 2
    [2011.04.14 19:03:38.215] Option: Deinterlace = 0
    [2011.04.14 19:03:38.215] Option: reencode AAC = 0
    [2011.04.14 19:03:38.215] Option: designate Audio Language = 0
    [2011.04.14 19:03:38.215] Option: Audio Language = 0
    [2011.04.14 19:03:38.215] Option: Normalize Audio Volume = 0
    [2011.04.14 19:03:38.215] Option: Big Subtitle = 0
    [2011.04.14 19:03:38.215] Option: Temp Folder = C:\Users\Administrator\Desktop\VideoConverter4iPhone_v38e\temp\
    [2011.04.14 19:03:38.231] Option: use External Save Folder = 1
    [2011.04.14 19:03:38.231] Option: Save Folder = D:\아이튠\iTunes에 자동으로 추가\
    [2011.04.14 19:03:38.309] Preparing job: 1 / 1
    [2011.04.14 19:03:38.309] GetTickCount() result: 1207291
    [2011.04.14 19:03:38.309] Source filename: C:\Users\Administrator\Desktop\House.S07E18.The Dig.HDTV.XviD-LOL.avi
    [2011.04.14 19:03:40.493] containder format: AVI
    [2011.04.14 19:03:40.493] internal audio count: 1 / internal subtitle count: 0
    [2011.04.14 19:03:40.493] video format: MPEG4 Visual
    [2011.04.14 19:03:40.493] CString → char* → atof (current FPS): 23.976 → 23.976
    [2011.04.14 19:03:40.493] resolution: 624x352 / 23.976 fps / 958804 bps
    [2011.04.14 19:03:40.493] Source file size: 349 MByte
    [2011.04.14 19:03:40.493] external subtitle file: C:\Users\Administrator\Desktop\House.S07E18.The Dig.HDTV.XviD-LOL.smi
    [2011.04.14 19:03:40.493] iInternalAudio = 0
    [2011.04.14 19:03:40.493] Converting SAMI subtitle(s) to SRT
    [2011.04.14 19:03:40.509] File info: AVI / MPEG4(624x352, 23.976fps, 0.958Mbps) / MP3(int) / SAMI(ext)
    [2011.04.14 19:03:40.509] Extracting and Converting audio to PCM
    [2011.04.14 19:03:40.509] - C: drive free space: 108,219MB
    [2011.04.14 19:04:24.855] Audio extraction finished
    [2011.04.14 19:04:24.855] Audio file name: C:\Users\ADMINI~1\Desktop\VIDEOC~1\temp\extractedaudio.wav
    [2011.04.14 19:04:24.856] Downmixing PCM audio to 2.0
    [2011.04.14 19:04:24.856] - C: drive free space: 107,744MB
    [2011.04.14 19:04:27.220] Downmix audio failed
    [2011.04.14 19:04:27.220] Converting audio to AAC
    [2011.04.14 19:04:27.221] - C: drive free space: 107,744MB
    [2011.04.14 19:05:27.250] Audio conversion finished
    [2011.04.14 19:05:27.250] AAC Filename: C:\Users\ADMINI~1\Desktop\VIDEOC~1\temp\temp.aac
    [2011.04.14 19:05:27.800] MP4Box video option: -add "C:\Users\ADMINI~1\Desktop\HOUSES~1.AVI"#video
    [2011.04.14 19:05:27.800] source Pixel Aspect Ratio: 1 (1:1)
    [2011.04.14 19:05:27.801] target Pixel Aspect Ratio: 1 (1:1)
    [2011.04.14 19:05:27.801] MP4Box option: -ipod -add "C:\Users\ADMINI~1\Desktop\HOUSES~1.AVI"#video:delay=0 -par 1=1:1 -add "C:\Users\ADMINI~1\Desktop\VIDEOC~1\temp\temp.aac":delay=0 "D:\아이튠\ITUNES~1\progressing.mp4"
    [2011.04.14 19:05:27.802] Muxing final MP4 file
    [2011.04.14 19:05:27.802] - D: drive free space: 55,279MB
    [2011.04.14 19:05:37.441] Mux finished
    [2011.04.14 19:05:38.371] GetTickCount() result: 1327350
    [2011.04.14 19:05:38.371] removing temporary files
    [2011.04.14 19:05:38.470] job fnished



    약 12회정도 인코딩 반복했지만.. 아이폰내에 플레이콘트롤옆에 키보드모양도없고.. 컴퓨터에서도 자막도 안보이고..자막이란거 자체가 안보이내요..ㄷ뭐가문제일까요

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2011.04.14 21:33 address edit & delete

      자막 파일을 메일로 보내면 확인해보겠습니다.
      자막 파일 자체를 의심해야 될 것 같네요.

  5. totzz 2011.04.15 00:29 address edit & delete reply

    모든동영상이 저러더라구여...자막들어간거다;;

  6. totzz 2011.04.15 00:55 address edit & delete reply

    혹시나해서 다른자막으로 실험해봤는데 안되내요..일단 저 로그에 사용됬던 자막파일은
    http://blog.daum.net/realgasl/1
    여기서 받은거에요..매일주소를몰라서;;

    참 운영체제는 윈7 32비트입니다.

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2011.04.15 09:20 address edit & delete

      확장자는 smi인데, 자막은 srt군요.
      확장자를 바꾸세요.

  7. totzz 2011.04.15 10:02 address edit & delete reply

    마찬가지내요..ㄷㄷ;

    • Favicon of http://zockr.tistory.com BlogIcon BLUEnLIVE 2011.04.15 10:09 address edit & delete

      1. 프로그램은 이상 없습니다. 확장자와 파일명을 다시 확인하세요

      2. 관련글에 댓글로 달아주기 바랍니다.

  8. 김우승 2011.06.05 20:36 address edit & delete reply

    저는 저런 변환이 필요하면 그냥...
    CStringW orig;
    CStringA copy_str(orig);
    atof(copy_str);
    합니다.