OpenWnn解析メモ

Androidでrepo syncするともれなくOpenWnnのソースがゲットできるのですが、どのように実装されているか調べてみたいと思います。
調査するコードは27ab9d1b806f03554d2abb50de26abe7bf234336。

まず、通常のビルドではOpenWnnはコンパイルされないので、以下のコマンドで自分でビルドします。

$ . build/envsetup.sh
$ cd packages/inputmethods/OpenWnn
$ mm

で、 コード量を見てみます。 Javaのコードが16523行、Cのコードが166529行で合計183052行になります。
ただし、その内WnnEngDic.cとWnnJpnDic.cは辞書データなので、その分を省くと25187行になります。
コードの約86%が辞書データですね。(iWnnとかはもっと多いのかな?)

189 ./src/jp/co/omronsoft/openwnn/WnnEngine.java
1055 ./src/jp/co/omronsoft/openwnn/OpenWnnEN.java
66 ./src/jp/co/omronsoft/openwnn/InputViewManager.java
451 ./src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImplJni.java
49 ./src/jp/co/omronsoft/openwnn/LetterConverter.java
67 ./src/jp/co/omronsoft/openwnn/JAJP/ClearLearnDictionaryDialogPreferenceJAJP.java
654 ./src/jp/co/omronsoft/openwnn/JAJP/KanaConverter.java
67 ./src/jp/co/omronsoft/openwnn/JAJP/ClearUserDictionaryDialogPreferenceJAJP.java
71 ./src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsListJAJP.java
54 ./src/jp/co/omronsoft/openwnn/JAJP/KeyboardListPreferenceJAJP.java
212 ./src/jp/co/omronsoft/openwnn/JAJP/Romkan.java
610 ./src/jp/co/omronsoft/openwnn/JAJP/OpenWnnEngineJAJP.java
216 ./src/jp/co/omronsoft/openwnn/JAJP/RomkanFullKatakana.java
1222 ./src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
390 ./src/jp/co/omronsoft/openwnn/JAJP/TutorialJAJP.java
69 ./src/jp/co/omronsoft/openwnn/JAJP/UserDictionaryToolsEditJAJP.java
153 ./src/jp/co/omronsoft/openwnn/JAJP/RomkanHalfKatakana.java
542 ./src/jp/co/omronsoft/openwnn/JAJP/OpenWnnClauseConverterJAJP.java
775 ./src/jp/co/omronsoft/openwnn/DefaultSoftKeyboard.java
121 ./src/jp/co/omronsoft/openwnn/WnnWord.java
74 ./src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsListEN.java
69 ./src/jp/co/omronsoft/openwnn/EN/UserDictionaryToolsEditEN.java
67 ./src/jp/co/omronsoft/openwnn/EN/ClearUserDictionaryDialogPreferenceEN.java
378 ./src/jp/co/omronsoft/openwnn/EN/OpenWnnEngineEN.java
304 ./src/jp/co/omronsoft/openwnn/EN/TutorialEN.java
307 ./src/jp/co/omronsoft/openwnn/EN/DefaultSoftKeyboardEN.java
108 ./src/jp/co/omronsoft/openwnn/CandidatesViewManager.java
72 ./src/jp/co/omronsoft/openwnn/StrSegment.java
993 ./src/jp/co/omronsoft/openwnn/TextCandidatesViewManager.java
38 ./src/jp/co/omronsoft/openwnn/OpenWnnControlPanelJAJP.java
71 ./src/jp/co/omronsoft/openwnn/WnnClause.java
579 ./src/jp/co/omronsoft/openwnn/ComposingText.java
248 ./src/jp/co/omronsoft/openwnn/SymbolList.java
1088 ./src/jp/co/omronsoft/openwnn/OpenWnnDictionaryImpl.java
144 ./src/jp/co/omronsoft/openwnn/WnnSentence.java
58 ./src/jp/co/omronsoft/openwnn/UserDictionaryToolsListFocus.java
47 ./src/jp/co/omronsoft/openwnn/WnnPOS.java
65 ./src/jp/co/omronsoft/openwnn/CandidateViewButton.java
729 ./src/jp/co/omronsoft/openwnn/UserDictionaryToolsList.java
250 ./src/jp/co/omronsoft/openwnn/OpenWnn.java
2577 ./src/jp/co/omronsoft/openwnn/OpenWnnJAJP.java
55 ./src/jp/co/omronsoft/openwnn/CandidateFilter.java
360 ./src/jp/co/omronsoft/openwnn/WnnDictionary.java
39 ./src/jp/co/omronsoft/openwnn/StrSegmentClause.java
354 ./src/jp/co/omronsoft/openwnn/OpenWnnEvent.java
416 ./src/jp/co/omronsoft/openwnn/UserDictionaryToolsEdit.java
16523 total

1397 ./libs/libwnnDictionary/OpenWnnDictionaryImplJni.c
153 ./libs/libwnnDictionary/engine/nj_str.c
2428 ./libs/libwnnDictionary/engine/ndldic.c
70 ./libs/libwnnDictionary/engine/necode.c
2831 ./libs/libwnnDictionary/engine/ndbdic.c
80 ./libs/libwnnDictionary/engine/ndcommon.c
122 ./libs/libwnnDictionary/engine/ndrdic.c
467 ./libs/libwnnDictionary/engine/ndfdic.c
906 ./libs/libwnnDictionary/engine/ndapi.c
210 ./libs/libwnnDictionary/engine/neapi.c
74276 ./libs/libwnnEngDic/WnnEngDic.c
83589 ./libs/libwnnJpnDic/WnnJpnDic.c
166529 total

AndroidManifest.xmlを読むと
OpenWnnJAJPクラスがInput method serviceとして登録され

  1. OpenWnnControlPanelJAJP
  2. UserDictionaryToolsListJAJP
  3. UserDictionaryToolsEditJAJP
  4. UserDictionaryToolsListEN
  5. UserDictionaryToolsEditEN

のクラスがactivityだということがわかります。

上記のactivityに遷移する方法です。

OpenWnnControlPanelJAJP
Settings -> Language & keyboard -> Japanese IME settings

UserDictionaryToolsListJAJP
Settings -> Language & keyboard -> Japanese IME setting -> Japanese User Dictionary

UserDictionaryToolsEditJAJP
Settings -> Language & keyboard -> Japanese IME settings -> Japanese User Dictionary
Menuを表示しAddとかEdit

UserDictionaryToolsListEN
Settings -> Language & keyboard -> Japanese IME settings -> English User Dictionary

UserDictionaryToolsEditEN
Settings -> Language & keyboard -> Japanese IME settings -> English User Dictionary
Menuを表示しAddとかEdit

Ubuntu 10.04に日本のローカルライズレポジトリを追加

詳しくはUbuntuの日本語環境 | Ubuntu Japanese Teamを参照。

wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
sudo wget https://www.ubuntulinux.jp/sources.list.d/lucid.list -O /etc/apt/sources.list.d/ubuntu-ja.list
sudo apt-get update

これでadobereader-jpnが簡単に利用できます

Android on Beagle board

下記のページにパッチやら手順が書かれているので有難く拝借。
http://code.google.com/p/android-development-environment/wiki/EclaironBeagleBoard

で、Androidをmakeするとしばらくすると

hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp: In constructor 'AndroidSurfaceOutputOmap34xx::AndroidSurfaceOutputOmap34xx()':
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp:78: error: 'mNumberOfFramesToHold' was not declared in this scope
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp: In member function 'virtual void AndroidSurfaceOutputOmap34xx::setParametersSync(void*, PvmiKvp*, int, PvmiKvp*&)':
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp:289: error: 'class PVMFYuvFormatSpecificInfo0' has no member named 'width'
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp:293: error: 'class PVMFYuvFormatSpecificInfo0' has no member named 'height'
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp:297: error: 'class PVMFYuvFormatSpecificInfo0' has no member named 'display_height'
hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp:302: error: 'class PVMFYuvFormatSpecificInfo0' has no member named 'display_width'
make: *** [out/target/product/beagle/obj/SHARED_LIBRARIES/libopencorehw_intermediates/android_surface_output_omap34xx.o] Error 1
make: *** Waiting for unfinished jobs....

というコンパイルエラーが発生した。。

どうやら、AndroidSurfaceOutputOmap34xxクラスで存在しないmNumberOfFramesToHoldメンバにアクセスしているのとこれまた、PVMFYuvFormatSpecificInfo0クラスの存在していないwidth、height、display_width、display_heightにアクセスしている。

mNumberOfFramesToHoldの方はhttp://github.com/cyanogen/android_external_opencore/commit/0bb93756e59a04933d4ab896ce593f994bf5267dでmNumberOfFramesToHoldをAndroidSurfaceOutputクラスを追加するパッチを見つけ、githubではコンストラクタで2を設定しているがパッチマージ前のAndroidSurfaceOutputクラスは1をセットしていたので1に変更した。

続いてPVMFYuvFormatSpecificInfo0クラスはソースを読むとpvmi_media_io_fileoutput.cppを基にしているよ的なコメントがあるので、チェックすると

iVideoWidthはbuffer_width
iVideoHeightはbuffer_height
iVideoDisplayWidthtはviewable_width
iVideoDisplayHeightはviewable_height

を設定すればいいことがわかった。

以下、修正パッチ

diff --git a/android/android_surface_output.h b/android/android_surface_output.h
index eac0a96..4044c96 100644

@@ -316,6 +316,18 @@ class AndroidSurfaceOutput : public OsclTimerObject
//This bool is set true when all necassary parameters have been received.
bool iIsMIOConfigured;

  1. /*
  2. * The value of mNumberOfFramesToHold is hardware/platform specific.
  3. * 1. On non-overlay based platforms, its value it set to 2
  4. * so as to avoid potential tearings oberved during video playback.
  5. * 2. On overlay-based platforms, its value should be overwritten.
  6. * We have observed video decoder starvation when a value other than 1.
  7. *
  8. * We set the default value to 2 in this class. Please change its value
  9. * accordingly in the derived class.
  10. */
  11. int mNumberOfFramesToHold;

+
#ifdef PERFORMANCE_MEASUREMENTS_ENABLED
PVProfile PVOmapVideoProfile;
#endif
diff --git a/android/android_surface_output.cpp b/android/android_surface_output.cpp
index 9cf9ab2..965bcac 100755

@@ -48,6 +48,7 @@ OSCL_EXPORT_REF AndroidSurfaceOutput::AndroidSurfaceOutput() :
mPvPlayer = NULL;
mEmulation = false;
iEosReceived = false;

  1. mNumberOfFramesToHold = 1;

}

status_t AndroidSurfaceOutput::set(PVPlayer* pvPlayer, const sp& surface, bool emulation)
@@ -950,7 +951,7 @@ void AndroidSurfaceOutput::Run()
}
else
{

  • processWriteResponseQueue(1);
  1. processWriteResponseQueue(mNumberOfFramesToHold);

}
}

hardware/ti/omap3/libopencorehw/android_surface_output_omap34xx.cpp
289 iVideoWidth = (int32)yuvInfo->buffer_width;
290 iVideoParameterFlags |= VIDEO_WIDTH_VALID;
291 LOGV("AndroidSurfaceOutputOmap34xx::setParametersSync() Video Width, Value %d", iVideoWidth);
292
293 iVideoHeight = (int32)yuvInfo->buffer_height;
294 iVideoParameterFlags |= VIDEO_HEIGHT_VALID;
295 LOGV("AndroidSurfaceOutputOmap34xx::setParametersSync() Video Height, Value %d", iVideoHeight);
296
297 iVideoDisplayHeight = (int32)yuvInfo->viewable_height;
298 iVideoParameterFlags |= DISPLAY_HEIGHT_VALID;
299 LOGV("AndroidSurfaceOutputOmap34xx::setParametersSync() Video Display Height, Value %d", iVideoDisplayHeight);
300
301
302 iVideoDisplayWidth = (int32)yuvInfo->viewable_width;

また、エラーがでた。

java.util.zip.ZipException: duplicate entry: hyts_Foo.c
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:175)
at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
at sun.tools.jar.Main.addFile(Main.java:713)
at sun.tools.jar.Main.update(Main.java:567)
at sun.tools.jar.Main.run(Main.java:202)
at sun.tools.jar.Main.main(Main.java:1149)
make: *** [out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/javalib.jar] Error 1
make: *** Deleting file `out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/javalib.jar'
make: *** Waiting for unfinished jobs....

これは既にGoogle Code Archive - Long-term storage for Google Code Project Hosting.にバグ登録されていて重複したファイルがあるのがダメみたい。対処方法はhttp://gitorious.org/0xdroid/dalvik/commit/bf0e336a6eb9be3698a15ab93e8e3cb90e616590?diffmode=sidebysideにあって以下のファイルを消せばよい。

libcore/support/src/test/resources/hyts_Foo.c
libcore/xml/src/test/resources/hc_staff.xml
libcore/xml/src/test/resources/staff.dtd
libcore/xml/src/test/resources/staff.xml
libcore/xml/src/test/resources/staff2.dtd
libcore/xml/src/test/resources/staff2.xml
libcore/xml/src/test/resources/staffNS.dtd
libcore/xml/src/test/resources/staffNS.xml
libcore/xml/src/test/resources/xhtml1-strict.dtd

Android emulator上のSDカードにファイルをコピーするには

$ mksdcard 128M sdcard.img # SDカードイメージ作成
$ android list avd # 適当なAndroid Virtual Deviceを探す
$ emulator -sdcard sdcard.img -avd [Android Virtual Device名] # エミュ起動
$ adb push hoge /sdcard # ファイル転送

スクラムサスペンド

JapanTechnicalJamboree7でNECの方が、私がまさしくやろうと思っていたこと"suspend2 + ページフォールトハンドラ"を発表していた。で、結果はTFTPブートからAshが起動するまでの時間で、ノーマルで3.86s、suspend2で6.7s、suspend2改良版で6.24sだったらしい。なので、このまま作業を続けても同じ結果に陥りそうなので
アイディアを練り直すことにした。

やっぱMOAP(L)でNECの人たちは結構がんばってらっしゃるねぇ。。感服です。
http://www.celinuxforum.org/CelfPubWiki/JapanTechnicalJamboree7
http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=CELF/JapanTechnicalJamboree7

デイリースクラム6

ubuntuでhibernation起動の流れを調べた

qemugdbでkernelをデバッグできようにする

  • 作業を進める上での障害

とくになし