SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
横浜 Android プラットフォーム部
                  第13回勉強会

   Stagefright 入門
~ Android Multimedia~


                  2011/9/19
                     @l_b__
Stagefright とは?
➲   Gingerbread から採用された動画・音声再生を行う
    ためのメディアプレーヤーフレームワーク
➲   ソース自体は Eclair から入っていたが、正式採用は
    Gingerbread
➲   意味は「舞台負け」「気後れ」「舞台あがり」(研究
    社新英和中辞典より)
MediaPlayer のおさらい
➲   基本的な MediaPlayer の使い方(音楽再生)
    Uri myUri = ....; // initialize Uri here

    MediaPlayer mediaPlayer = new MediaPlayer();

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
    ;

    mediaPlayer.setDataSource(getApplicationContext(), myUri);

    mediaPlayer.prepare();

    mediaPlayer.start();
MediaPlayer のソースを見る
➲ frameworks/base/me

 dia 以下がマルチメディ
 ア関連のソース。
➲ コアである

 MediaPlayer.java の実
 行ステップ数450行!
MediaPlayer のソース
➲ イベント処理を行っているだけでほ

 とんどの機能で Native を呼んでい
 る。
➲ で、 JNI を通した呼び先が
 Stagefright。
Android のマルチメディア史
➲ 元々はメディアエンジンとして

 ffmpeg (http://ffmpeg.org/) を採
 用する予定だったらしい。
➲ しかし
    ffmpeg はライセンスに GPL
 を採用。
➲ しかも...
Hall of Shame
Android のマルチメディア史
➲   ライセンス違反ソフトの晒し上げページを作るほど
    強硬派。
➲   で、 ffmpeg はあきらめ、他のエンジンを探したら
    しい。
➲   そして採用されたのが PacketVideo 社の CORE を
    オープンソース化した OpenCore。
➲   以後、 Froyo まで/ external/opencore の下に存
    在。
OpenCore
➲   OpenCore はプレーヤー部分である pvPlayer
    と各 Codec から構成。
➲   開発向けガイドなどのドキュメント類
    が/ external/opencore/doc 配下にある。
➲   OpenCore には一つ面白い特徴が。
OpenMAX
➲   OpenCore は OpenMAX をサポート。
➲   OpenMAX(http://www.khronos.org/open
    max/) とは
     ●   Khronos グループが策定しているポータビリ
          ティを重視したクロスプラットフォーム向け
         のメディア API
余談: Khronos って?
➲   様々なオープンスタンダード API を策定して
    いるコンソーシアム。
➲   OpenGL,OpenCL,OpenVG,OpenSL,OpenK
    ODE,WebGL,EGL,WebCL,OpenWF etc etc.
➲   OpenAL が Khronos 策定で無いのをさっき知ったのはここだけの話で
    す。
OpenCore と OpenMAX
➲   OpenCore がサポートしているのは
    OpenMAX IL(Integration Layer)
➲   OpenMAX には DL(Development
    Layer)、IL、AL(Application Layer) があ
    り、 IL はコーデックを叩きやすくする API
    が定義されている。
OpenMAX IL




http://pc.watch.impress.co.jp/docs/2004/0729/kaigai104.htm  から
ここは想像
➲   OpenCore にスタンダードなエンコード/デ
    コードの API が用意されていたので、 Java
    側の AndroidMediaFramework に合わせて
    作り直したのが Stagefright じゃないかな
    と。
➲   Stagefright が公開されたのは Eclair から。
動画再生の基礎
➲   動画はおおざっぱに言うと、パラパラ漫画の
    絵(フレーム)を1枚ずつどう圧縮し(符号化)、
    どういう形でファイル/ストリームに格納する
    か(コンテナ)。
➲   動画再生はファイル/ストリームからコンテナ
    形式に従ってフレームを取り出し、デコード
    して取り出した画像を画面表示すること。
動画再生の図




➲   取り出したフレームには
     ●   それだけで復号できる I フレーム
     ●   前の I フレーム/ P フレームを参照して復号する P フレーム
     ●   前後のフレームを参照して復号する B フレーム
➲   デコーダには I フレームを含む形でフレームを渡す必要がある
音声再生の基礎
➲   基本は PCM(Pulse Code Modulation) フォー
    マット。
➲   サンプリング周波数単位で、音圧を変換した
    量子化ビットを記録したもの。
➲   サンプリング周波数は音声をどの頻度でデー
    タ化するかを Hz で表したもの。
➲   量子化ビット(ビット深度)はどの程度の精度
    で音圧を記録するか。
音声再生の基礎
➲   CD の場合、サンプリング周波数は
    44.1 KHz、 量子化ビット数は16 bit、 ステ
    レオで2 ch。
➲   データサイズは1秒辺り
    44100 x2byte(=16bit)x2(ch)=176400byt
    e
➲   このデータをコーデックでエンコード・デ
    コードする。
で、 Stagefright の話
➲   Stagefright の機能を簡単に
     ●   アプリから渡された uri を元にファイル/スト
          リームを取得
     ●   ファイル/ストリームがどのコンテナ形式かを
          チェックし、対応する
          DataSource/MediaSource に格納
Stagefright の処理(承前)
●   コンテナからフレームを取り出し
     ( Parser)、OpenMAX IL でデコード
●   デコードしたフレームを Surface/AudioTrack
     に設定して SurfaceFlinger/AudioFlinger に
     渡して再生する( Rendrer)
StageFright を簡単な図で




http://events.linuxfoundation.org/events/embedded-
linux-conference/garcia の資料
http://elinux.org/images/5/52/Elc2011_garcia.pdf から
Parser 処理
➲   ファイル/ストリームデータを格納する
    MediaSource クラス及びコンテナタイプ毎の
    サブクラスから MediaExtractor のコンテナ
    タイプ毎のサブクラスを呼び出して処理。
     ●   MPEG4 の場合、 MPEG4Source と
          MPEG4Extractor
➲
Parse 処理
➲   内部では泥臭くバイナリデータをパース。
➲   フレームのデータを取得しておく。
     ●   画面サイズ、フレームレート、 RGB フォー
          マット、サンプリングレート、ビット深度等
          デコード、レンダリングに必要な情報
デコード処理
➲   OpenMAX IL の API を使ってデコードする。
➲   OpenMAX IL の使い方は Bellagio(
    http://omxil.sourceforge.net/)が詳しく、サンプ
    ルソースがある。
➲   /external/opencore/doc にある開発ガイドにも説
    明あり。
➲   以下 openmax_call_sequences.pdf から抜粋
OMX Core 初期化
      ➲   OMX_Init で初期化
          し、使用可能な
          Codec をコンポーネ
          ント名として取得す
          る。
      ➲   コンポーネント名か
          ら機能(何の Codec
          か)を取得。
OMX コンポーネント設定
       ➲   OMXGetHandle で
           コンポーネントハン
           ドルを取得する。
       ➲   コンポーネントのパ
           ラメータ取得
OMX 入出力バッファ設定
       ➲   フレームを入力し、
           デコードされたデー
           タを出力するバッ
           ファを設定する。
       ➲   この後、コンポーネ
           ントの状態を
           Loaded→Idle→Exe
           cuting にする。
OMX のポート




➲   コンポーネントの入出力ポートを介してデ
    コード前/後のデータをやり取りする。
OMX デコード処理




➲   バッファにデータを設定した後、 EmptyThisBuffer でデ
    コード開始、 FillThisBuffer でデコードされたデータを取り
    出し。
Renderer 処理
➲   OMX コンポーネントから取得したデータを出
    力する。
➲   画像データは必要ならスケーリング、画像
    フォーマット( YUV→RGB) 変換を行
    い、 Surface を使って SurfaceFlinger で描
    画。
➲   音声データは AudioTrack を使って
    AudioFlinger で再生。
Stagefright の構成図




http://freepine.blogspot.com/2010/01/overview-of-
stagefrighter-player.html
Stagefright の構成
➲   緑が DataSource、MediaSource と
    MediaExtractor。 ファイル/ストリームから
    フレーム(やメタデータ)をパースする処理部
    分。
➲   オレンジが OpenMAX IL の実装部分。
➲   水色がレンダリング処理部分。
➲   赤が全体を制御する機能部分。
まとめ
➲   Android のマルチメディア処理はほとんど
    Native の Stagefright で行われます。
➲   Stagefright には OpenMAX DL というオー
    プンスタンダードが使われています。
最後に
➲   OpenMAX Dl の API は共有ライブラリとし
    て公開されているので、実は普通に JNI を
    使った Android アプリから叩けます。
➲   なので、 Android 標準で対応していない
    フォーマットの動画・音声も頑張れば HW デ
    コードをサポートした形で自作アプリから再
    生できます。
                        以上です。

Weitere ähnliche Inhalte

Was ist angesagt?

ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメントヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメントhistoria_Inc
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたuchan_nos
 
Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。IndieusGames
 
アニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdfアニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdfinfinite_loop
 
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法pulse Inc.
 
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例Tatsuhiro Tanaka
 
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~Unity Technologies Japan K.K.
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!Unity Technologies Japan K.K.
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話Tokoroten Nakayama
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 

Was ist angesagt? (20)

ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメントヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 
Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。
 
UE4とUnrealC++について
UE4とUnrealC++についてUE4とUnrealC++について
UE4とUnrealC++について
 
Fbx解説 (1 構文編) (1)
Fbx解説 (1  構文編) (1)Fbx解説 (1  構文編) (1)
Fbx解説 (1 構文編) (1)
 
UE4の色について v1.1
 UE4の色について v1.1 UE4の色について v1.1
UE4の色について v1.1
 
アニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdfアニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdf
 
UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -
 
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法
バーチャルライブプラットフォーム 「INSPIX」を支える技術とその活用法
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例
Unreal Engineを使用した商用タイトルで のノンフォトリアルレンダリング(NPR)事例
 
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
 
猫でも分かるUE4.22から入ったSubsystem
猫でも分かるUE4.22から入ったSubsystem 猫でも分かるUE4.22から入ったSubsystem
猫でも分かるUE4.22から入ったSubsystem
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
UE4における大規模背景制作事例(データメンテナンス・大技設定編 )
UE4における大規模背景制作事例(データメンテナンス・大技設定編 )UE4における大規模背景制作事例(データメンテナンス・大技設定編 )
UE4における大規模背景制作事例(データメンテナンス・大技設定編 )
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話
 
デジタル水遊び (UE4 VFX Art Dive)
デジタル水遊び (UE4 VFX Art Dive)デジタル水遊び (UE4 VFX Art Dive)
デジタル水遊び (UE4 VFX Art Dive)
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 

Andere mochten auch

日本Androidの会発表スライド androidのメディア機能の話
日本Androidの会発表スライド androidのメディア機能の話日本Androidの会発表スライド androidのメディア機能の話
日本Androidの会発表スライド androidのメディア機能の話Tatsuya Matsumoto
 
OpenMAX Overview
OpenMAX OverviewOpenMAX Overview
OpenMAX OverviewYoss Cohen
 
20分で理解するdisplaysystem
20分で理解するdisplaysystem20分で理解するdisplaysystem
20分で理解するdisplaysystemmagoroku Yamamoto
 
A slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightA slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightAlexy Joseph
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overviewJerrin George
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia FrameworkPicker Weng
 
Android最速のフォトグラファーに、俺はなる!
Android最速のフォトグラファーに、俺はなる!Android最速のフォトグラファーに、俺はなる!
Android最速のフォトグラファーに、俺はなる!Kazutoshi Kashimoto
 
さらば、Stagefright 脆弱性
さらば、Stagefright 脆弱性さらば、Stagefright 脆弱性
さらば、Stagefright 脆弱性Tsukasa Oi
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門l_b__
 
Open binder
Open binderOpen binder
Open binderl_b__
 
Eclipseを使ったandroid nativeデバッグ
Eclipseを使ったandroid nativeデバッグEclipseを使ったandroid nativeデバッグ
Eclipseを使ったandroid nativeデバッグl_b__
 
Yapf2013
Yapf2013Yapf2013
Yapf2013l_b__
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 
ABS2015 のセッション紹介
ABS2015 のセッション紹介ABS2015 のセッション紹介
ABS2015 のセッション紹介l_b__
 
PF開発に使えるAOSPのツール達
PF開発に使えるAOSPのツール達PF開発に使えるAOSPのツール達
PF開発に使えるAOSPのツール達l_b__
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステムl_b__
 
Intentの概要
Intentの概要Intentの概要
Intentの概要l_b__
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタl_b__
 

Andere mochten auch (20)

日本Androidの会発表スライド androidのメディア機能の話
日本Androidの会発表スライド androidのメディア機能の話日本Androidの会発表スライド androidのメディア機能の話
日本Androidの会発表スライド androidのメディア機能の話
 
OpenMAX Overview
OpenMAX OverviewOpenMAX Overview
OpenMAX Overview
 
20分で理解するdisplaysystem
20分で理解するdisplaysystem20分で理解するdisplaysystem
20分で理解するdisplaysystem
 
Understanding open max il
Understanding open max ilUnderstanding open max il
Understanding open max il
 
A slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightA slightly deeper dive into Stagefright
A slightly deeper dive into Stagefright
 
IOMX in Android
IOMX in AndroidIOMX in Android
IOMX in Android
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overview
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia Framework
 
Android最速のフォトグラファーに、俺はなる!
Android最速のフォトグラファーに、俺はなる!Android最速のフォトグラファーに、俺はなる!
Android最速のフォトグラファーに、俺はなる!
 
さらば、Stagefright 脆弱性
さらば、Stagefright 脆弱性さらば、Stagefright 脆弱性
さらば、Stagefright 脆弱性
 
Stagefright入門
Stagefright入門Stagefright入門
Stagefright入門
 
Open binder
Open binderOpen binder
Open binder
 
Eclipseを使ったandroid nativeデバッグ
Eclipseを使ったandroid nativeデバッグEclipseを使ったandroid nativeデバッグ
Eclipseを使ったandroid nativeデバッグ
 
Yapf2013
Yapf2013Yapf2013
Yapf2013
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
ABS2015 のセッション紹介
ABS2015 のセッション紹介ABS2015 のセッション紹介
ABS2015 のセッション紹介
 
PF開発に使えるAOSPのツール達
PF開発に使えるAOSPのツール達PF開発に使えるAOSPのツール達
PF開発に使えるAOSPのツール達
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
 
Intentの概要
Intentの概要Intentの概要
Intentの概要
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 

Ähnlich wie Stagefright入門

Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めYou&I
 
KEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来るKEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来るandroid sola
 
About kitakat
About kitakatAbout kitakat
About kitakathidenorly
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語GoYoshifumi Yamaguchi
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworkstripodworks
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス5mingame2
 
20140830 firefox os-sampler
20140830 firefox os-sampler20140830 firefox os-sampler
20140830 firefox os-samplerNoritada Shimizu
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門cch-robo
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Norito Agetsuma
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!leverages_event
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
Chrome Developer Toolsを使いこなそう!
Chrome Developer Toolsを使いこなそう!Chrome Developer Toolsを使いこなそう!
Chrome Developer Toolsを使いこなそう!yoshikawa_t
 
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2Computational Materials Science Initiative
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルTomonori Ohba
 
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?Masamitsu Maehara
 

Ähnlich wie Stagefright入門 (20)

Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
KEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来るKEONとPEAKが無くてもFirefox OS開発出来る
KEONとPEAKが無くてもFirefox OS開発出来る
 
About kitakat
About kitakatAbout kitakat
About kitakat
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
Mac Ports
Mac PortsMac Ports
Mac Ports
 
20140830 firefox os-sampler
20140830 firefox os-sampler20140830 firefox os-sampler
20140830 firefox os-sampler
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
Chrome Developer Toolsを使いこなそう!
Chrome Developer Toolsを使いこなそう!Chrome Developer Toolsを使いこなそう!
Chrome Developer Toolsを使いこなそう!
 
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2
CMSI計算科学技術特論B(15) インテル Xeon Phi コプロセッサー向け最適化、並列化概要 2
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/Macクロスコンパイル
 
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
 

Kürzlich hochgeladen

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Kürzlich hochgeladen (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

Stagefright入門

  • 1. 横浜 Android プラットフォーム部 第13回勉強会 Stagefright 入門 ~ Android Multimedia~ 2011/9/19 @l_b__
  • 2. Stagefright とは? ➲ Gingerbread から採用された動画・音声再生を行う ためのメディアプレーヤーフレームワーク ➲ ソース自体は Eclair から入っていたが、正式採用は Gingerbread ➲ 意味は「舞台負け」「気後れ」「舞台あがり」(研究 社新英和中辞典より)
  • 3. MediaPlayer のおさらい ➲ 基本的な MediaPlayer の使い方(音楽再生) Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC) ; mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
  • 4. MediaPlayer のソースを見る ➲ frameworks/base/me dia 以下がマルチメディ ア関連のソース。 ➲ コアである MediaPlayer.java の実 行ステップ数450行!
  • 5. MediaPlayer のソース ➲ イベント処理を行っているだけでほ とんどの機能で Native を呼んでい る。 ➲ で、 JNI を通した呼び先が Stagefright。
  • 6. Android のマルチメディア史 ➲ 元々はメディアエンジンとして ffmpeg (http://ffmpeg.org/) を採 用する予定だったらしい。 ➲ しかし ffmpeg はライセンスに GPL を採用。 ➲ しかも...
  • 8. Android のマルチメディア史 ➲ ライセンス違反ソフトの晒し上げページを作るほど 強硬派。 ➲ で、 ffmpeg はあきらめ、他のエンジンを探したら しい。 ➲ そして採用されたのが PacketVideo 社の CORE を オープンソース化した OpenCore。 ➲ 以後、 Froyo まで/ external/opencore の下に存 在。
  • 9. OpenCore ➲ OpenCore はプレーヤー部分である pvPlayer と各 Codec から構成。 ➲ 開発向けガイドなどのドキュメント類 が/ external/opencore/doc 配下にある。 ➲ OpenCore には一つ面白い特徴が。
  • 10. OpenMAX ➲ OpenCore は OpenMAX をサポート。 ➲ OpenMAX(http://www.khronos.org/open max/) とは ● Khronos グループが策定しているポータビリ ティを重視したクロスプラットフォーム向け のメディア API
  • 11. 余談: Khronos って? ➲ 様々なオープンスタンダード API を策定して いるコンソーシアム。 ➲ OpenGL,OpenCL,OpenVG,OpenSL,OpenK ODE,WebGL,EGL,WebCL,OpenWF etc etc. ➲ OpenAL が Khronos 策定で無いのをさっき知ったのはここだけの話で す。
  • 12. OpenCore と OpenMAX ➲ OpenCore がサポートしているのは OpenMAX IL(Integration Layer) ➲ OpenMAX には DL(Development Layer)、IL、AL(Application Layer) があ り、 IL はコーデックを叩きやすくする API が定義されている。
  • 14. ここは想像 ➲ OpenCore にスタンダードなエンコード/デ コードの API が用意されていたので、 Java 側の AndroidMediaFramework に合わせて 作り直したのが Stagefright じゃないかな と。 ➲ Stagefright が公開されたのは Eclair から。
  • 15. 動画再生の基礎 ➲ 動画はおおざっぱに言うと、パラパラ漫画の 絵(フレーム)を1枚ずつどう圧縮し(符号化)、 どういう形でファイル/ストリームに格納する か(コンテナ)。 ➲ 動画再生はファイル/ストリームからコンテナ 形式に従ってフレームを取り出し、デコード して取り出した画像を画面表示すること。
  • 16. 動画再生の図 ➲ 取り出したフレームには ● それだけで復号できる I フレーム ● 前の I フレーム/ P フレームを参照して復号する P フレーム ● 前後のフレームを参照して復号する B フレーム ➲ デコーダには I フレームを含む形でフレームを渡す必要がある
  • 17. 音声再生の基礎 ➲ 基本は PCM(Pulse Code Modulation) フォー マット。 ➲ サンプリング周波数単位で、音圧を変換した 量子化ビットを記録したもの。 ➲ サンプリング周波数は音声をどの頻度でデー タ化するかを Hz で表したもの。 ➲ 量子化ビット(ビット深度)はどの程度の精度 で音圧を記録するか。
  • 18. 音声再生の基礎 ➲ CD の場合、サンプリング周波数は 44.1 KHz、 量子化ビット数は16 bit、 ステ レオで2 ch。 ➲ データサイズは1秒辺り 44100 x2byte(=16bit)x2(ch)=176400byt e ➲ このデータをコーデックでエンコード・デ コードする。
  • 19. で、 Stagefright の話 ➲ Stagefright の機能を簡単に ● アプリから渡された uri を元にファイル/スト リームを取得 ● ファイル/ストリームがどのコンテナ形式かを チェックし、対応する DataSource/MediaSource に格納
  • 20. Stagefright の処理(承前) ● コンテナからフレームを取り出し ( Parser)、OpenMAX IL でデコード ● デコードしたフレームを Surface/AudioTrack に設定して SurfaceFlinger/AudioFlinger に 渡して再生する( Rendrer)
  • 22. Parser 処理 ➲ ファイル/ストリームデータを格納する MediaSource クラス及びコンテナタイプ毎の サブクラスから MediaExtractor のコンテナ タイプ毎のサブクラスを呼び出して処理。 ● MPEG4 の場合、 MPEG4Source と MPEG4Extractor ➲
  • 23. Parse 処理 ➲ 内部では泥臭くバイナリデータをパース。 ➲ フレームのデータを取得しておく。 ● 画面サイズ、フレームレート、 RGB フォー マット、サンプリングレート、ビット深度等 デコード、レンダリングに必要な情報
  • 24. デコード処理 ➲ OpenMAX IL の API を使ってデコードする。 ➲ OpenMAX IL の使い方は Bellagio( http://omxil.sourceforge.net/)が詳しく、サンプ ルソースがある。 ➲ /external/opencore/doc にある開発ガイドにも説 明あり。 ➲ 以下 openmax_call_sequences.pdf から抜粋
  • 25. OMX Core 初期化 ➲ OMX_Init で初期化 し、使用可能な Codec をコンポーネ ント名として取得す る。 ➲ コンポーネント名か ら機能(何の Codec か)を取得。
  • 26. OMX コンポーネント設定 ➲ OMXGetHandle で コンポーネントハン ドルを取得する。 ➲ コンポーネントのパ ラメータ取得
  • 27. OMX 入出力バッファ設定 ➲ フレームを入力し、 デコードされたデー タを出力するバッ ファを設定する。 ➲ この後、コンポーネ ントの状態を Loaded→Idle→Exe cuting にする。
  • 28. OMX のポート ➲ コンポーネントの入出力ポートを介してデ コード前/後のデータをやり取りする。
  • 29. OMX デコード処理 ➲ バッファにデータを設定した後、 EmptyThisBuffer でデ コード開始、 FillThisBuffer でデコードされたデータを取り 出し。
  • 30. Renderer 処理 ➲ OMX コンポーネントから取得したデータを出 力する。 ➲ 画像データは必要ならスケーリング、画像 フォーマット( YUV→RGB) 変換を行 い、 Surface を使って SurfaceFlinger で描 画。 ➲ 音声データは AudioTrack を使って AudioFlinger で再生。
  • 32. Stagefright の構成 ➲ 緑が DataSource、MediaSource と MediaExtractor。 ファイル/ストリームから フレーム(やメタデータ)をパースする処理部 分。 ➲ オレンジが OpenMAX IL の実装部分。 ➲ 水色がレンダリング処理部分。 ➲ 赤が全体を制御する機能部分。
  • 33. まとめ ➲ Android のマルチメディア処理はほとんど Native の Stagefright で行われます。 ➲ Stagefright には OpenMAX DL というオー プンスタンダードが使われています。
  • 34. 最後に ➲ OpenMAX Dl の API は共有ライブラリとし て公開されているので、実は普通に JNI を 使った Android アプリから叩けます。 ➲ なので、 Android 標準で対応していない フォーマットの動画・音声も頑張れば HW デ コードをサポートした形で自作アプリから再 生できます。 以上です。