link もっと前
   2018年 7月 8日 -
      2018年 7月 8日  
link もっと後

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

日々

link permalink

Android と MPEG2-TS その 4

その 1その 2その 3その 4

もはや自分以外の誰得の内容なのか、わかりませんが、気にせず書きます。

その 3 にて「DescramblerImpl を生成するのは MediaCasService::createDescrambler() のみ?のように見えます。」と書きました。この関数に至る経路がわかると、デスクランブラがどの暗号系を選択するのか?いつ選択するのか?などがわかるようになります。

で、今回は createDescrambler() が呼ばれる経路を見つけたのでメモします。しかしながら Extractor の setMediaCas() を呼び出すのは誰なのか?まだ謎のままなので、いまいちスッキリしませんけども。

Extractor の setMediaCas()

//frameworks/av/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp

status_t MPEG2TSExtractor::setMediaCas(const HInterfaceToken &casToken) {
    HalToken halToken;
    halToken.setToExternal((uint8_t*)casToken.data(), casToken.size());
    sp<ICas> cas = ICas::castFrom(retrieveHalInterface(halToken));
    ALOGD("setMediaCas: %p", cas.get());

    status_t err = mParser->setMediaCas(cas); //★★★★ mParser
    if (err == OK) {
        ALOGI("All tracks now have descramblers");
        init();
    }
    return err;
}

ここで出てくる mParser の型は ATSParser でしたので、ATSParser の実装を見てみます。

ATSParser setMediaCas()

//frameworks/av/media/libstagefright/mpeg2ts/ATSParser.cpp

status_t ATSParser::setMediaCas(const sp<ICas> &cas) {
    status_t err = mCasManager->setMediaCas(cas); //★★★★ mCasManager
    if (err != OK) {
        return err;
    }
    for (size_t i = 0; i < mPrograms.size(); ++i) {
        mPrograms.editItemAt(i)->updateCasSessions();
    }
    return OK;
}

ここで出てくる mCasManager の型は ATSParser::CasManager でした。CasManager を見てみましょう。

CasManager setMediaCas()

//frameworks/av/media/libstagefright/mpeg2ts/CasManager.cpp

status_t ATSParser::CasManager::setMediaCas(const sp<ICas> &cas) {
    if (cas == NULL) {
        ALOGE("setMediaCas: received NULL object");
        return BAD_VALUE;
    }
    if (mICas != NULL) {
        ALOGW("setMediaCas: already set");
        return ALREADY_EXISTS;
    }
    for (size_t index = 0; index < mProgramCasMap.size(); index++) {
        status_t err;
        if ((err = mProgramCasMap.editValueAt(
                index)->setMediaCas(cas, mCAPidToSessionIdMap)) != OK) { //★★★★ mProgramCasMap
            return err;
        }
    }
    mICas = cas; //★★★★ mICas
    return OK;
}

Extractor から渡されてきた cas は、CasManager のメンバ変数 mICas に保存されるようです。ちなみにこの mICas はその 2 の CasManager::parsePID() にて、mICas->processEcm(mCAPidToSessionIdMap[index], ecm); の呼び出し時に出てきました。ここで保存されていたんですね。

話を戻して mProgramCasMap は unsigned がキー、ProgramCasManager のポインタが値の KeyedVector です。

ProgramCasManager setMediaCas()

status_t ATSParser::CasManager::ProgramCasManager::setMediaCas(
        const sp<ICas> &cas, PidToSessionMap &sessionMap) {
    if (mHasProgramCas) {
        return initSession(cas, sessionMap, &mProgramCas); //★★★★
    }
    // TODO: share session among streams that has identical CA_descriptors.
    // For now, we open one session for each stream that has CA_descriptor.
    for (size_t index = 0; index < mStreamPidToCasMap.size(); index++) {
        status_t err = initSession(
                cas, sessionMap, &mStreamPidToCasMap.editValueAt(index)); //★★★★
        if (err != OK) {
            return err;
        }
    }
    return OK;
}

status_t ATSParser::CasManager::ProgramCasManager::initSession(
         const sp<ICas>& cas,
         PidToSessionMap &sessionMap,
         CasSession *session) {
    sp<IMediaCasService> casService = IMediaCasService::getService("default"); //★★★★ IMediaCasService 型
    if (casService == NULL) {
        ALOGE("Cannot obtain IMediaCasService");
        return NO_INIT;
    }
//...
    returnDescrambler = casService->createDescrambler(descriptor.mSystemID); //★★★★ createDescrambler()
    if (!returnDescrambler.isOk()) {
        ALOGE("Failed to create descrambler: trans=%s",
                returnDescrambler.description().c_str());
        goto l_fail;
    }
    descramblerBase = (sp<IDescramblerBase>) returnDescrambler;
    if (descramblerBase == NULL) {
        ALOGE("Failed to create descrambler: null ptr");
        goto l_fail;
    }

やっと createDescrambler() が出てきました。casService は IMediaCasService 型ですが、このインタフェースを実装しているクラスは 1つしかなさそうです。

MediaCasService setMediaCas()

//hardware/interfaces/cas/1.0/default/MediaCasService.h

class MediaCasService : public IMediaCasService {
//...


//hardware/interfaces/cas/1.0/default/MediaCasService.cpp

Return<sp<IDescramblerBase>> MediaCasService::createDescrambler(int32_t CA_system_id) {

    ALOGV("%s: CA_system_id=%d", __FUNCTION__, CA_system_id);

    sp<IDescrambler> result;

    DescramblerFactory *factory;
    sp<SharedLibrary> library;
    if (mDescramblerLoader.findFactoryForScheme(
            CA_system_id, &library, &factory)) { //★★★★ DescramblerPlugin を探す処理はこの辺にありそう
        DescramblerPlugin *plugin = NULL;
        if (factory->createPlugin(CA_system_id, &plugin) == OK
                && plugin != NULL) {
            result = new DescramblerImpl(library, plugin); //★★★★ DescramblerImpl を生成している箇所があった
        }
    }

    return result;
}

ここでゴールのようです。まとめると Extractor の setMediaCas() を呼ぶと、

  • ATSParser::CasManager::parsePID() が呼び出している mICas->processEcm() の mICas が設定される。
    つまり ECM の処理方法が決まる
  • DescramblerImpl::mPluginHolder が設定される。
    つまりデスクランブルの処理方法が決まる
[編集者: すずき]
[更新: 2018年 7月 17日 22:44]
link 編集する

コメント一覧

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



link もっと前
   2018年 7月 8日 -
      2018年 7月 8日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/20 11:22

カレンダー

<2018>
<<<07>>>
1234567
891011121314
15161718192021
22232425262728
293031----

最近のコメント 5件

  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)
  • link 18年09月07日
    よしだあ 「おつかれさまでした!\nまた仕事できるの...」
    (更新:09/11 19:17)
  • link 18年08月15日
    すずき 「うーん、なんか暴走したり、動かなかったり...」
    (更新:08/15 10:52)
  • link 18年08月15日
    すずき 「実行できた。あと実行ファイルパスについて...」
    (更新:08/15 10:42)
  • link 18年08月15日
    すずき 「さすがに x86_64 と arm のク...」
    (更新:08/15 10:35)

最近の記事 20件

link もっとみる
  • link 18年09月15日
    すずき 「[TigerVNC のエラーメッセージ] TigerVNC Jav...」
    (更新:09/20 11:22)
  • link 18年09月16日
    すずき 「[音が出なくなったよ Windows 10] 昨日まで元気に動作し...」
    (更新:09/20 11:10)
  • link 18年09月13日
    すずき 「[府民から都民へ] 家が決まりました。今月末から東京都民です。さよ...」
    (更新:09/17 20:03)
  • link 18年09月11日
    すずき 「[エアコン浄化] 今年の 7月に(2018年 7月 17日の日記参...」
    (更新:09/17 19:38)
  • link 18年09月10日
    すずき 「[引っ越し準備] 引っ越し用の新品の段ボールが 50箱以上届き、家...」
    (更新:09/17 19:32)
  • link 18年09月07日
    すずき 「[最終勤務日] 今日は Socionext の最終勤務日でした。9...」
    (更新:09/09 01:21)
  • link 18年09月06日
    すずき 「[さくらのメールサーバーと git send-email] 自宅か...」
    (更新:09/07 01:24)
  • link 18年09月03日
    すずき 「[ROCK64 のカーネルだけ元に戻したい] ROCK64 のカー...」
    (更新:09/04 01:34)
  • link 18年08月27日
    すずき 「[DTI の配ってくる IP アドレス] 以前、高槻市での WAK...」
    (更新:08/31 01:40)
  • link 18年08月26日
    すずき 「[不思議なダメージ計算式] 宇宙戦艦物語 RPG というスマホのゲ...」
    (更新:08/31 01:27)
  • link 18年08月21日
    すずき 「[エアコンがまた臭くなった] 先日(2018年 7月 17日の日記...」
    (更新:08/23 19:25)
  • link 18年08月20日
    すずき 「[Rock64 の U-Boot スクリプトを読む] 先日(201...」
    (更新:08/22 00:04)
  • link 18年08月15日
    すずき 「[自分のマシンは何 GFLOPS か? その 3] その 1、その...」
    (更新:08/15 10:46)
  • link 18年08月14日
    すずき 「[自分のマシンは何 GFLOPS か? その 2] その 1、その...」
    (更新:08/15 10:08)
  • link 18年08月13日
    すずき 「[自分のマシンは何 GFLOPS か? その 1] その 1、その...」
    (更新:08/15 10:08)
  • link 18年08月12日
    すずき 「[ARM PC で開発できるか?] 最近の ARM 搭載 SoC ...」
    (更新:08/14 13:32)
  • link 18年08月10日
    すずき 「[エディタ] 誰しもお気に入りのエディタがあると思いますが、私は割...」
    (更新:08/12 21:55)
  • link 19年08月11日
    すずき 「[間違えた] 1年、間違えたので、消す。...」
    (更新:08/12 21:33)
  • link 18年08月11日
    すずき 「[地震保険] AIG 損害保険から「大阪北部地震で被害を受けた方は...」
    (更新:08/12 21:32)
  • link 18年08月08日
    すずき 「[久しぶりに自作 ARM エミュレータ] 久しぶりに自作 ARM ...」
    (更新:08/09 00:51)

こんてんつ

open/close wiki
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 過去日記について

その他の情報

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