今日の作業

5:19

gas/config/tc-arm.c の解読。

結論から言うと、WLDR/WSTRではレジスタ(Rm)によるプリ/ポストインデックスは使えない。

static void
encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
{
  encode_arm_addr_mode_common (i, is_t);

  if (inst.operands[i].immisreg)
    {
      inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
      inst.instruction |= inst.operands[i].imm;

LDR r0, [r1], r2 のように書いた場合、inst.operands[i].immisreg=1、inst.operands[i].imm=2(r2)になる。んで、immisreg=1の場合、INST_IMMEDIATEをORしていて

#define INST_IMMEDIATE	0x02000000

それはこんなふうに定義されてる。しかし、WSTRのエンコーディングはこう。

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Cond 1 1 0 P U N W 0 Rn wRm 0 0 0 M offset_8

ビット25が0固定になってる。よって、オフセットには8ビットの即値しか使えない、と。

betaplayerのコードも眺めてみたけど、この結論であってるみたい。

7:08

  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
 23.94    106.24   106.24                             mcount_internal
  7.39    139.03    32.79 22177272     0.00     0.00  mpeg4_decode_block

とまぁ、gprofの関数を除くと処理時間トップに君臨するmpeg4_decode_block。とりあえず一箇所ほど最適化出来そうな場所を発見した。どんなプロセッサでもクソ遅い除算を乗算に変える方法で、既にx86用のコードはある。ARMまたはiWMMXtで似たことが出来ないか模索中。

7:12

そういえば、SL-C3100ですか? ぶっちゃけ微妙すぎ。

仮に微妙じゃない新機種が出たとしても、現在のSL-C3000でかなり満足しているから買わないだろうな。

11:33

いつのまにかRL_XQが音声ありで完璧に再生出来るようになってた。でも、-framedropを追加すると重いシーンでガビガビになる。んで、最近知った -autosync 100 も追加したら、フレームドロップ無しと同じぐらい滑らかに再生出来るようになった。これはZPlayerのデフォルトオプションに追加しとこう。

Playing /mnt/card/RL_XQ_640x480_1500_128.avi.
AVI file format detected.
VIDEO:  [XVID]  640x480  24bpp  24.000 fps  1478.8 kbps (180.5 kbyte/s)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)

BENCHMARKs: VC: 106.917s VO:   0.423s A:  10.066s Sys:  33.071s =  150.477s
BENCHMARK%: VC: 71.0522% VO:  0.2810% A:  6.6892% Sys: 21.9776% = 100.0000%
BENCHMARKn: disp: 3609 (23.98 fps)  drop: 12 (0%)  total: 3621 (24.06 fps)

もう十分なんじゃないかって気がしてきた。:)

11:43

さすがにXviDのQuauntizer based=2.00でエンコードした動画は、動きの激しいシーンで瞬間的にビットレートが無茶苦茶高くなるので無理。ザウルス用には固定ビットレートエンコードしないと。