コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2017年11月18日 >>> 2017年11月9日
link もっと後

2017年11月13日

テレビの栄枯盛衰

一応、テレビ向けのSoCを作るお仕事をしていますので、たまに電器屋さんにテレビを見に行ってますが、どこに行ってもテレビのコーナーは年々狭くなっています。

土曜日に梅田ヨドバシに行きましたが、一時期は3Fをテレビが支配していたのに、今や1/3位です。ホームシアターを除いて純粋にテレビだけでカウントしたら、もっと狭いかもしれません。テレビを家電の1つと見れば、フロアの1/3を占めているのは破格の待遇と言えますが、つい過去の栄光と比べてしまいます。

同じ階にはオーディオコーナーと、キャンプ用品コーナーがありました。テレビはオーディオコーナーと同じか、やや負けてるくらいの広さでしょうか?この先、テレビの面積が復活することは無いでしょうから、そのうちオーディオと合併して、オーディオ・ビジュアルコーナーになるんでしょう、たぶん。

レコーダーはどこ?

レコーダーは悲惨で棚2つしかありませんでした。BD-RとかDVD-Rみたいなメディアそのものを売っている棚の方が多いように見えますけど、バランスおかしくないです??

番組を録画する文化は日本特有らしく、もともとレコーダーは日本でしか流行っていません。海外でも販売していますが、プレーヤーの方が好まれるようです。頼みの日本がこの状態だと、そのうちレコーダーという製品は無くなるかもしれません。

プレーヤーは細々と続くと思います。とはいえ、黒物家電メーカーは全員ボロボロで、次世代の光ディスク規格を作るほどの元気は無いでしょう。BDを8K規格まで延命して、ネットにバトンタッチして終わりか、下手したら4Kで燃え尽きて終わりかもね……。

編集者:すずき(2017/11/19 21:16)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2017年11月12日

Kindle Fireの変なフォントが直っていた

目次: Kindle

いつのまにかKindleがアップデートされており、フォントが変になる問題(2017年10月13日の日記参照)が直っていました。あとストアアプリのメニューがダブって表示される問題(2017年10月12日の日記参照)も直っていました。

直してくれてありがとう。やっぱりおかしいってわかってたんだね……。

編集者:すずき(2021/12/08 04:01)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2017年11月11日

ポケモンGO

ポケモンGOのアプリはいつまで経ってもバグだらけです。新しく実装された機能(ジムバトル)は当然バグバグで、通信周りが弱くハングしまくります。

  • ジムで木の実投げるときにジムから離れると操作不能
  • 木の実を投げたときに対象のポケモンが別のプレーヤに倒されると操作不能
  • ジムバトルの開始時にハング、勝利時にもハング
  • ログイン画面でWiFiから3G/4Gに切り換えるとログイン不能
  • ポケモン捕獲時にハングする
  • キャラクターが真っ黒になる
  • 地図が一面海になる

操作不能になったり、ハングされたりするとアプリを再起動するしかないですが、ハイエンド機じゃないせいか起動も動作も遅くてイライラします。

1日15分もやってないのにこの有様なので、もっと長時間遊んでいる人はイライラで憤死するんじゃなかろうか?

折角面白いのにアプリが残念すぎる……。

編集者:すずき(2017/11/19 20:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2017年11月9日

Androidメディア処理

昨日(2017年11月8日の日記参照)の続きです。

本来見たかった道をざっくりまとめておくと、

  • デコード終わり
  • コールバックOMXNodeInstance::OnFillBufferDone()
  • instance->owner()->OnFillBufferDone() → OMX::OnFillBufferDone()
  • OMX::CallbackDispatcher::post()

これが 2017年11月6日の日記の前半で分かった部分。

  • OMX::CallbackDispatcher::loop()
  • OMX::CallbackDispatcher::dispatch()
  • mOwner->onMessages() → OMXNodeInstance::onMessages()
  • mObserver->onMessages() → ?

これが 2017年11月6日の日記の後半で分かった部分。

  • mObserver->onMessages() → CodecObserver::onMessages()

これが 2017年11月7日の日記で分かった部分。

  • mObserver->onMessages() → CodecObserver::onMessages()
  • notify->post() → AMessage::post()
  • looper->post() → ?

これが 2017年11月8日の日記で分かった部分です。そのあとはlooperとは何ぞや?という点を追いかけていましたが、まだわからない状態です。

  • looper->post() → ?
  • looper = AMessage::mLooper
  • mLooper = handler->getLooper()
  • handlerはAMessage() の2番目の引数
  • notify = mNotify = AMessage(kWhatOMXMessageList, mCodec) だから、handler = ACodec::BaseState::mCodec
  • looper->post() → mCodec->getLooper()->post() のはず

再開

肝心のACodec::BaseState::mCodecに何が入っているのか?についてはUninitializedStateを手掛かりに見ていきます。

mCodec

//android/frameworks/av/media/libstagefright/ACodec.cpp

struct ACodec::BaseState : public AState {
    BaseState(ACodec *codec, const sp<AState> &parentState = NULL);

...

    ACodec *mCodec; //★★これが知りたい★★


//★★UninitializedStateを手掛かりに見てみる★★

struct ACodec::UninitializedState : public ACodec::BaseState {

...

ACodec::UninitializedState::UninitializedState(ACodec *codec)
    : BaseState(codec) { //★★BaseStateに丸投げ★★
}


//★★BaseStateを見てみる★★

struct ACodec::BaseState : public AState {
    BaseState(ACodec *codec, const sp<AState> &parentState = NULL);

...

ACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState)
    : AState(parentState),
      mCodec(codec) { //★★引数をそのまま設定しているだけ★★
}


//★★UninitializedStateの生成個所を探す★★

ACodec::ACodec()
    : mQuirks(0),
...
      mDescribeHDRStaticInfoIndex((OMX_INDEXTYPE)0) {
    mUninitializedState = new UninitializedState(this); //★★thisが指すものはACodec★★
    mLoadedState = new LoadedState(this);

つまりACodec::BaseState::mCodecは、UninitializeStateを生成したACodecです。もう一つの謎getLooper() が何を返すのか?も見てみます。

getLooper

//android/frameworks/av/include/media/stagefright/foundation/AHandler.h

struct AHandler : public RefBase {

...

    wp<ALooper> getLooper() const {
        return mLooper; //★★mLooperを返すだけ★★
    }

...

    inline void setID(ALooper::handler_id id, wp<ALooper> looper) {
        mID = id;
        mLooper = looper; //★★mLooperはsetIDの引数そのまま★★
    }


//android/frameworks/av/include/media/libstagefright/foundation/ALooperRoster.cpp

ALooper::handler_id ALooperRoster::registerHandler(
        const sp<ALooper> looper, const sp<AHandler> &handler) {
    Mutex::Autolock autoLock(mLock);

    if (handler->id() != 0) {
        CHECK(!"A handler must only be registered once.");
        return INVALID_OPERATION;
    }

    HandlerInfo info;
    info.mLooper = looper;
    info.mHandler = handler;
    ALooper::handler_id handlerID = mNextHandlerID++;
    mHandlers.add(handlerID, info);

    handler->setID(handlerID, looper); //★★setIDを呼んでいる個所はここだけ★★

    return handlerID;
}


//media/libstagefright/foundation/ALooper.cpp

ALooperRoster gLooperRoster;

...

ALooper::handler_id ALooper::registerHandler(const sp<AHandler> &handler) {
    return gLooperRoster.registerHandler(this, handler);
}

ALooper::registerHandlerはALooperをAHandlerに登録する仕組み、AHandler::getLooper() はAHandlerに登録されたALooperを返す仕組みのようです。取得 / 設定が一致しないのでややこしいです。設計を失敗したのかなあ?

例えばAHandler *hogeとALooper *fugaがあってfuga->registerHandler(hoge) としたならば、hoge->getLooper() は先ほど登録したfugaを返します。

  • looper->post() → ?
  • looper = AMessage::mLooper
  • mLooper = handler->getLooper()
  • handlerはAMessage() の2番目の引数
  • notify = mNotify = AMessage(kWhatOMXMessageList, mCodec) だから、handler = ACodec::BaseState::mCodec
  • looper->post() → mCodec->getLooper()->post() のはず
  • ACodec::BaseState::mCodecは、UninitializeStateを生成したACodecだから
  • looper->post() → ACodec::getLooper()->post() のはず

ちなみにACodecはAHandlerを継承しているのでgetLooper() 関数を持っています。

ここまで分かればALooper::registerHandler() を呼んでいる個所を見て、引数がACodecオブジェクトであろう場所を見つければ、looperが指しているのが、どのALooperなのか?がやっと判明します。

しかしregisterHandler() の呼び出し箇所は非常に多くて、追いきれません。うーん、別のアプローチが必要でしょうか……?

編集者:すずき(2017/11/24 00:38)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2017年11月18日 >>> 2017年11月9日
link もっと後

管理用メニュー

link 記事を新規作成

<2017>
<<<11>>>
---1234
567891011
12131415161718
19202122232425
2627282930--

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20