yoshida_eth0の日記 このページをアンテナに追加 RSSフィード

2012-01-27

FFMpegでID3タグが文字化けるのを直すパッチを作った

forked-daapdで文字化けしてるから、それを直したい。

とりあえず文字化けの原因は潰したから今度試す。

 

パッチの前にちょっと解説。

 

なぜ文字化けるのか

ID3v2が対応している文字コードは、

ID3v2.2〜ID3v2.3の場合、ISO-8859-1とUTF-16だけ。

ID3v2.4の場合、ISO-8859-1とUTF-16とUTF-8だけ。

 

どのバージョンを使ってもShiftJISは対応していない。

それなのに日本語をISO-8859-1としてShiftJISを突っ込んでしまっているらしい。

システムでShiftJISを使っているWindowsでは特に問題にはならないけど、UTF-8を使うLinuxとかだと化ける、という事らしい。

 

改善策

本来ならMP3ファイルのID3タグをUTF-16ないしUTF-8へ変換するべき。

でもID3タグを変換するのは面倒だから、FFMpeg側で対応する。

ISO-8859-1だった場合にShiftJISからUTF-8への変換をするようにした。

(FFMpegに非はないのに…。)

 

FFMpegのShiftJIS対応パッチ

元のソース / バージョンは以下の通り

git: git://source.ffmpeg.org/ffmpeg.git

commit: ee0cab7721cc31e5d8027ec7df6c3ebd60ea50b5

--- libavformat/id3v2.c.org	2012-01-27 02:42:00.787551422 +0900
+++ libavformat/id3v2.c	2012-01-27 05:36:12.833550837 +0900
@@ -38,6 +38,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/dict.h"
 #include "avio_internal.h"
+#include <iconv.h>
 
 const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
     { "TALB", "album"},
@@ -167,6 +168,12 @@
     unsigned int (*get)(AVIOContext*) = avio_rb16;
     AVIOContext *dynbuf;
 
+    iconv_t ic;
+    char *sjis, *p_sjis;
+    size_t sjis_size;
+    char *utf8, *p_utf8;
+    size_t utf8_size;
+
     if ((ret = avio_open_dyn_buf(&dynbuf)) < 0) {
         av_log(s, AV_LOG_ERROR, "Error opening memory stream\n");
         return ret;
@@ -175,11 +182,39 @@
     switch (encoding) {
 
     case ID3v2_ENCODING_ISO8859:
+/*
         while (left && ch) {
             ch = avio_r8(pb);
             PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);)
             left--;
         }
+*/
+
+        // iconv in
+        sjis_size = left;
+        sjis = p_sjis = av_malloc(sjis_size);
+        avio_read(pb, sjis, sjis_size);
+
+        // iconv out
+        utf8_size = sjis_size * 3;
+        utf8 = p_utf8 = av_malloc(utf8_size);
+
+        // iconv
+        ic = iconv_open("UTF-8", "SJIS");
+        iconv(ic, &p_sjis, &sjis_size, &p_utf8, &utf8_size);
+        if (utf8==p_utf8 || *(p_utf8-1)) {
+            *(p_utf8++) = 0;
+        }
+        //av_log(s, AV_LOG_INFO, "iconv convert: %s\n", utf8);
+
+        // copy
+        avio_write(dynbuf, utf8, p_utf8-utf8);
+
+        // iconv release
+        av_free(sjis);
+        av_free(utf8);
+        iconv_close(ic);
+        ch = 0;
         break;
 
     case ID3v2_ENCODING_UTF16BOM:

 

msysでコンパイル

iconvがリンクされてない場合はconfigureで以下パラメータをつける。

--extra-libs=-liconv

 

参考URL

ID3 - Wikipedia, the free encyclopedia

http://en.wikipedia.org/wiki/ID3#ID3v2

2011-06-03

C言語でCRC32を計算してみた

バイナリデータから、4バイトのハッシュを生成する。

MD5SHA1に比べてアルゴリズムが単純で速い。

 

データベースに文字列を入れる時に、その文字列のCRC32ハッシュをindexにすると検索が速い!

って記事を見ていつかやってみようと思ってるけど、まだ実践投入した事ない。

MySQLにはcrc32関数が用意されてるから今回のは使わないけど。

 

PHPのext/standard/crc32.cのほぼコピー。

 

#include <stdio.h>
#include <stdlib.h>

static const unsigned int crc32tab[256] = { 
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};


unsigned int crc32(char *p, int len)
{
	unsigned int crcinit = 0;
	unsigned int crc = 0;

	crc = crcinit ^ 0xFFFFFFFF;
	for (; len--; p++) {
		crc = ((crc >> 8) & 0x00FFFFFF) ^ crc32tab[(crc ^ (*p)) & 0xFF];
	}
	return crc ^ 0xFFFFFFFF;
}

int main(void)
{
	printf("crc32: %x\n", crc32("aaa", 3));

	return 0;
}

2011-03-11

C言語で可変長配列を作った

JavaのArrayListを参考にしつつ、2種類作った。

 

mallocしたメモリの先頭アドレスの配列を保持するパターン

voidポインタの配列。

配列の個数+1回mallocする。

charとか小さいものだと無駄がありそう。(特に64bitOSの場合)

配列の数が足らなくなったら、voidポインタの配列のサイズをreallocする。

 

vararr.h
#ifndef VARARR_H
#define VARARR_H

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef void (*VARARR_DELETE_FUNC)(void*);

typedef struct {
	void **values;
	unsigned int size;
	unsigned int allocsize;
	VARARR_DELETE_FUNC delete_func;
} VARARR;

extern VARARR* vararr_new(unsigned int size);
extern void vararr_delete(VARARR* arr);

#define vararr_push(arr, item) \
	if (arr->allocsize <= arr->size) { \
		if (arr->allocsize==0) { \
			arr->allocsize = 32; \
		} else { \
			arr->allocsize <<= 1; \
		} \
		/* printf("vararr_push realloc: %p %u\n", arr, arr->allocsize); */ \
		arr->values = (void**)realloc(arr->values, arr->allocsize * sizeof(void*)); \
	} \
	arr->values[arr->size] = item; \
	arr->size++;

#define vararr_push_int(arr, item) \
	int *value = (int*)malloc(sizeof(int)); \
	*value = (item); \
	vararr_push(hash_arr, value);

#define vararr_remove(arr, i, do_delete) \
	if (arr) { \
		if (0<=i && i<arr->size && arr->values[i]) { \
			if (arr->delete_func && do_delete) { \
				arr->delete_func(arr->values[i]); \
			} \
			arr->size--; \
			if (i < arr->size) { \
				arr->values[i] = arr->values[arr->size]; \
				/* memmove(&arr->values[i], &arr->values[i+1], (arr->size-i)*sizeof(void*)); */ \
			} \
			arr->values[arr->size] = NULL; \
		} \
	}

#endif

 

vararr.c
#include "vararr.h"


// 生成
VARARR* vararr_new(unsigned int size)
{
	VARARR *arr;
	arr = (VARARR*)malloc(sizeof(VARARR));
	if (0<size) {
		arr->allocsize = size;
	} else {
		arr->allocsize = 1;
	}
	arr->values = (void**)malloc(arr->allocsize * sizeof(void*));
	arr->size = 0;
	arr->delete_func = (VARARR_DELETE_FUNC)free;
	return arr;
}

// 開放
void vararr_delete(VARARR* arr)
{
	unsigned int i;
	if (arr) {
		if (arr->delete_func) {
			for (i=0; i<arr->size; i++) {
				arr->delete_func(arr->values[i]);
			}
		}
		free(arr->values);
		free(arr);
	}
}

 

配列の個数分の長さをmallocしたメモリの先頭アドレスを保持するパターン

mallocは1回だけ。

奇妙なキャストをしてバイト数で無理やりアクセス。

配列の数が足らなくなったら、voidポインタの指す先をまるごとreallocする。

大きな構造体の配列とかだと無駄がありそう。

 

vararr.h
#ifndef VARARR_H
#define VARARR_H

#include <stdlib.h>
#include <stdio.h>
#include <string.h>



/* VARARR */

typedef void (*VARARR_DELETE_FUNC)(void*);

typedef struct {
	void *values;
	unsigned int size;
	unsigned int allocsize;
	unsigned int onesize;
	VARARR_DELETE_FUNC delete_func;
} VARARR;


extern VARARR* vararr_new(unsigned int allocsize, unsigned int onesize);
extern void vararr_delete(VARARR *arr);


#define vararr_getp(arr, i) \
	/* ((i)<arr->allocsize ? (void*)&((char(*)[arr->onesize])arr->values)[i] : NULL) */ \
	((i)<arr->allocsize ? (void*)(((char*)arr->values) + (i) * arr->onesize) : NULL)

#define vararr_get(arr, i, type) \
	((i)<arr->allocsize ? ((type*)arr->values)[i] : 0)

#define vararr_realloc(arr, i) \
	if (arr->allocsize<=(i)) { \
		while (arr->allocsize<=(i)) { \
			arr->allocsize <<= 1; \
		} \
		printf("vararr_realloc: %p %u\n", arr, arr->allocsize); \
		arr->values = realloc(arr->values, arr->allocsize * arr->onesize); \
	}

#define vararr_put(arr, i, value, type) \
	if ((i)<arr->allocsize) { \
		((type*)arr->values)[i] = value; \
	}

#define vararr_push(arr, value, type) \
	vararr_realloc(arr, arr->size); \
	vararr_put(arr, arr->size, value, type); \
	arr->size++;

#define vararr_remove(arr, i, type) \
	if ((i)<arr->size) { \
		if (arr->delete_func) { \
			arr->delete_func(vararr_getp(arr, i)); \
		} \
		arr->size--; \
		if ((i)<arr->size) { \
			((type*)arr->values)[i] = ((type*)arr->values)[arr->size]; \
		} \
	}



/* CHARS */

#define chars_new(allocsize, onesize) \
	vararr_new(allocsize, onesize)

#define chars_get(arr, i) \
	((char*)vararr_getp(arr, i))

#define chars_put(arr, i, str) \
	if ((i)<arr->size) { \
		strcpy(&((char*)arr->values)[(i) * arr->onesize], str); \
	}

#define chars_push(arr, str) \
	vararr_realloc(arr, arr->size); \
	chars_put(arr, arr->size, str); \
	arr->size++;

#define chars_delete(arr) \
	vararr_delete(arr)



/* UINTS */

#define uints_new(allocsize) \
	vararr_new(allocsize, sizeof(unsigned int))

#define uints_get(arr, i) \
	vararr_get(arr, i, unsigned int)

#define uints_put(arr, i, value) \
	vararr_put(arr, i, value, unsigned int)

#define uints_push(arr, value) \
	vararr_push(arr, value, unsigned int)

#define uints_remove(arr, i) \
	vararr_remove(arr, i, unsigned int)

#endif

 

vararr.c
#include "vararr.h"

VARARR* vararr_new(unsigned int allocsize, unsigned int onesize)
{
	VARARR *arr;
	arr = (VARARR*)malloc(sizeof(VARARR));
	arr->values = (void*)malloc(allocsize * onesize);
	arr->size = 0;
	arr->allocsize = allocsize;
	arr->onesize = onesize;
	arr->delete_func = NULL;
	return arr;
}

void vararr_delete(VARARR *arr)
{
	unsigned int i;
	if (arr) {
		if (arr->delete_func) {
			for (i=0; i<arr->size; i++) {
				arr->delete_func(vararr_getp(arr, i));
			}
		}
		free(arr->values);
		free(arr);
	}
}

 

速度

構造体を扱う場合は、前者の方が1.25倍位速かった。

 

マルチバイト文字列を1文字ずつに分割する処理は、後者の方が1.65倍位速かった。

でもなぜかVARARRとは全く関係ない箇所が遅くなっていて、全体の速度は下がった。(なぜ?)

 

名前が被らないようにして2つを併用してみたら、どっこいどっこいか若干遅いか位。

当然だけど、実行ファイルのサイズが大きくなった。

 

後者だけを使った場合、なんとなく遅い。

 

よく解らないから、前者だけを使おうと思う。

2011-01-07

マルチバイト文字列を1文字ずつに分割する

調べ方が悪いのかそんな事やろうとする人がいないのか知らないけど、見つからなかったから自分で作った。

文字コードUTF-8限定。

 

mallocとreallocを使ってメモリを動的に確保した。

「文字列の配列」を作るのかと思ってたけど、動的に生成するなら「(文字列の1バイト目の)ポインタの配列」を作るっぽい。

で、関数の引数は「(文字列の1バイト目の)ポインタの配列のポインタ」か。

メモリの事はよく解らないけど、これでいいのかな。

文字列用にmallocしたメモリもfreeするべきなのかな。

 

ソース

#include <stdio.h>
#include <stdlib.h>

int str_split(const char *str, char*** dest)
{
	char **arr, **tmp;
	int i = 0;
	int size = 100;

	arr = (char**)malloc(size * sizeof(char*));

	while (*str != '\0') {
		int code = (unsigned char)*str;
		if (code < 0x80) {
			arr[i] = (char*)malloc(2 * sizeof(char));
			sprintf(arr[i], "%c", *str);
			i++;
			str += 1;
		} else if (code < 0xC0) {
			str += 1;
		} else if (code < 0xE0) {
			arr[i] = (char*)malloc(3 * sizeof(char));
			sprintf(arr[i], "%c%c", *str, *(str+1));
			i++;
			str += 2;
		} else if (code < 0xF0) {
			arr[i] = (char*)malloc(4 * sizeof(char));
			sprintf(arr[i], "%c%c%c", *str, *(str+1), *(str+2));
			i++;
			str += 3;
		} else {
			arr[i] = (char*)malloc(5 * sizeof(char));
			sprintf(arr[i], "%c%c%c%c", *str, *(str+1), *(str+2), *(str+3));
			i++;
			str += 4;
		}
		if (size <= i) {
			size += 100;
			if ((tmp = (char**)realloc(arr, size * sizeof(char*))) == NULL) {
				printf("realloc error!!\n");
				free(arr);
				exit(EXIT_FAILURE);
			} else {
				arr = tmp;
			}
		}
	}
	arr[i] = NULL;

	*dest = arr;
	return i;
}


int main(char *args)
{
	char** char_arr;
	int i, len;

	len = str_split("ポインタ(pointer)とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、その位置を表現する変数の事をいう。有名な例としてはC/C++でのメモリアドレスを表すポインタが挙げられる。類似の概念に参照(reference)があるが、ポインタが演算により無効な位置を作り出せるのに対し、参照では元々存在するオブジェクトを指し示す事しかできない。このため一般には参照の方がより安全な操作であるとされる。ただし、参照先のオブジェクトがいつまで有効な状態であるかはプログラムに依存するので、無効なものを指し得ないというわけではない。(参照透過性)", &char_arr);

	for (i=0; i<len; i++) {
		printf("%s\n", char_arr[i]);
	}
	free(char_arr);

	return 0;
}

 

参考URL

ポインタ配列にまつわる話

http://sometime.minidns.net/programming/c/pointer_array.html

2010-02-22

libjingleを使える環境を整えてみた

VC++2005で。

多分これでイケる。

C言語に関しても解らないけど、VisualStudioの使い方も解らない。

 

libjingleの使い方については、おいおい調べる。

P2PでNAT越えしたいんだよおおお。

Google先生に感謝。

 

朝だ…、もう1日位休みが欲しい気分。

 

Windows Platform SDKをインストール

この辺を参考に。

 

Visual C++ Express Editionを使ってみる(Windows Platform SDK編)

http://freepg.fc2web.com/cpp/topic_vce_001.html

 

Expatをインストール

今の所、2.0.1が最新らしいけど、ディレクトリ構成がなんか違うから2.0.0を使う。

 

ここからダウンロード。

 

Browse Expat XML Parser Files on SourceForge.net

http://sourceforge.net/projects/expat/files/expat_win32/

 

環境設定はlibjingle内に入ってるREADME.winを参考に。

4. Update the Visual C++ directories in the Projects and Solutions section in the Options dialog box
   Library files: C:\expat-VERSION\StaticLibs
   Include files: C:\expat-VERSION\Source\Lib
   where VERSION is the version of expat you've downoaded

 

オプション->プロジェクトおよびソリューション->VC++ディレクトリ->ライブラリファイル

C:\Expat 2.0.0\StaticLibs

 

オプション->プロジェクトおよびソリューション->VC++ディレクトリ->インクルードファイル

C:\Expat 2.0.0\Source\Lib

 

libjingle.libをコンパイル

libjingle-0.4.0.zipをダウンロード

ここからダウンロード。

 

libjingle - Project Hosting on Google Code

http://code.google.com/p/libjingle/

 

とりあえず、D:\mydocument2\libjingle-0.4.0に解凍しとく。

 

修正

VoiceEngine Liteを入れない場合。

多分、VoiceEngine Liteっていう奴は有料。

それともただ見つからないだけ?

探しまくって行き着いた先が中華サイトだったから、多分無料じゃない。

 

talk\libjingle.slnを開く。

ソリューションエクスプローラで、以下ディレクトリ削除。

libjingle->Header Files->session->phone
libjingle->Source Files->session->phone

 

コンパイル

ソリューションエクスプローラ->libjingle->右クリック->プロジェクトのみ->libjingleのみをビルド

 

付属のサンプルもコンパイルする場合は以下。

ソリューションエクスプローラ->pcp->右クリック->プロジェクトのみ->pcpのみをビルド

 

callはVoiceEngine Liteが必要だからコンパイルできない。

 

環境設定

自分で新たに作る時の為の環境設定。

以下を追加。

 

オプション->プロジェクトおよびソリューション->VC++ディレクトリ->ライブラリファイル

D:\mydocument2\libjingle-0.4.0\talk\Debug

 

オプション->プロジェクトおよびソリューション->VC++ディレクトリ->インクルードファイル

D:\mydocument2\libjingle-0.4.0

 

サンプルを新たにコンパイル

とりあえず、includeしてエラーが出ない所まで。

大半をpcpからコピーした。

 

プロジェクト作成

新しいアプリケーション->Visual C++->Win32->コンソールアプリケーション

プロジェクト名 = libjingle_test

空のプロジェクト = true

 

ソース追加

ソリューションエクスプローラ->libjingle_test->ソースファイル->右クリック->追加->新しい項目

Visual C++->コード->C++ファイル (.cpp)

ファイル名 = main.cpp

#include <iomanip>
#include <time.h>

#ifndef WIN32
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iomanip>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/wait.h>
#else
#include <direct.h>
//typedef _getcwd getcwd;
#include "talk/base/win32.h"
#endif

#include "talk/base/fileutils.h"
#include "talk/base/pathutils.h"
#include "talk/base/helpers.h"
#include "talk/base/httpclient.h"
#include "talk/base/logging.h"
#include "talk/base/physicalsocketserver.h"
#include "talk/base/ssladapter.h"
#include "talk/xmpp/xmppclientsettings.h"
#include "talk/examples/login/xmppthread.h"
#include "talk/examples/login/xmppauth.h"
#include "talk/p2p/client/httpportallocator.h"
#include "talk/p2p/client/sessionmanagertask.h"
#include "talk/session/fileshare/fileshare.h"
#include "talk/examples/login/presencepushtask.h"
#include "talk/examples/login/presenceouttask.h"
#include "talk/examples/login/jingleinfotask.h"

int main(int argc, char **argv) {
  talk_base::PhysicalSocketServer ss;

  printf("libjingle_test!!!\n");
  return 0;
}

 

プリプロセッサの定義

プロパティ->構成プロパティ->C++->プリプロセッサ->プリプロセッサの定義

WIN32
_DEBUG
_CONSOLE
_WINDOWS
UNICODE
_UNICODE
WINVER=0x0500
_WIN32_WINNT=0x500
PRODUCTION_BUILD
PRODUCTION
XML_STATIC
FEATURE_ENABLE_SSL
FEATURE_ENABLE_CHAT_ARCHIVING
FEATURE_ENABLE_VOICEMAIL

 

追加の依存ファイル

プロパティ->構成プロパティ->リンカ->入力->追加の依存ファイル

comsupp.lib
secur32.lib
ws2_32.lib
libexpatMT.lib
Iphlpapi.lib
crypt32.lib
libjingle.lib

 

ランタイムライブラリ

プロパティ->構成プロパティ->C/C++->コード生成->ランタイムライブラリ

マルチスレッド デバッグ (/MTd)

 

コンパイル

ソリューションエクスプローラ->libjingle_test->右クリック->ビルド