link もっと前
   2017年 11月 5日 -
      2017年 11月 5日  
link もっと後

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

日々

link permalink

Android のメディア再生処理

たまには Android の話でも。Android のメディア再生のデコード完了から出画までを見てみました。

Media | Android Open Source Project 辺りにあるように、Android は libstagefright にメディアの処理を任せています。

図からはちょっと読み取りづらいですが、libstagefright は動画、音声のデコードに OpenMAX という API を用います。図だと OMX Core と書かれている部分です。

OpenMAX ざっくり紹介

OpenMAX の各種デコーダ(※)は「コンポーネント」と呼ばれる部品になっています。

OpenMAX ではデータの入力は EmptyThisBuffer と呼びます。データの入力は非同期に行うことができます。コンポーネントは入力を処理し終えたら完了通知をコールバック(EmptyBufferDone)する仕組みになっています。

データの出力は FillThisBuffer と呼びます。出力も非同期に行うことができます。コンポーネントはデータ出力の完了通知(FillBufferDone)をする仕組みになっています。

libstagefright は OpenMAX のコンポーネントに対して、下記の処理を行います。他にも設定、フラッシュ、などややこしい処理がありますが、省略。

入力側はこんな感じです。

  • 圧縮データが入ったバッファを EmptyThisBuffer でコンポーネントに渡す
  • (コンポーネント内でバッファのデータが処理される)
  • 空になったバッファが EmptyBufferDone で返ってくる

出力側もほぼ同じです。

  • 空のバッファを FillThisBuffer でコンポーネントに渡す
  • (コンポーネント内でバッファにデコード済みデータが詰め込まれる)
  • デコード済みデータが入ったバッファが FillBufferDone で返ってくる

バッファが 2 つある場合も基本的には同じです。OpenMAX の特徴はバッファ 1 とバッファ 2 がお互いを気にしなくて良いことです。バッファ 2 が返ってきていようが返ってきていまいが、バッファ 1 はコンポーネントに渡して構いません。

例えばバッファ 2 にすごく時間が掛かって、こんな順になっても構いません(コロンの右側はコンポーネントに渡したが返ってきていないバッファの一覧)。

  • start: なし
  • FillThisBuffer 1: 1
  • FillThisBuffer 2: 1, 2
  • FillBufferDone 1: 2
  • FillThisBuffer 1: 1, 2
  • FillBufferDone 1: 2
  • FillThisBuffer 1: 1, 2
  • FillBufferDone 2: 1
  • FillBufferDone 1: なし

特にデコーダの場合は、この例のように渡した順番と返ってくる順番が違う場合がほとんどです。

(※)OpenMAX の規格が定義するコンポーネントの機能は、デコーダだけではありません。しかし Android はデコーダコンポーネントしか使いません

[編集者: すずき]
[更新: 2017年 11月 23日 19:45]
link 編集する

コメント一覧

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



link もっと前
   2017年 11月 5日 -
      2017年 11月 5日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

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

最終更新: 1/20 00:16

カレンダー

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

最近のコメント 5件

  • link 18年12月11日
    すずき 「確認いただいてありがとうございます。直っ...」
    (更新:12/27 00:22)
  • link 18年12月11日
    T4 「再現しませんね\n\n確かに、過去にそう...」
    (更新:12/25 12:45)
  • link 18年12月11日
    すずき 「失礼しました。Rock64 の方は、\n...」
    (更新:12/22 02:10)
  • link 18年12月11日
    T4 「私は、Tinker Board を持って...」
    (更新:12/21 10:14)
  • link 18年12月11日
    すずき 「> 但し、これもう一年以上前の話で...」
    (更新:12/19 11:54)

最近の記事 3件

link もっとみる
  • link 19年01月18日
    すずき 「[Cocos2d-x 再び] 以前 Cocos2d-x をビルドし...」
    (更新:01/20 00:16)
  • link 19年01月14日
    すずき 「[家の PC 性能表、更新] 昔(2017年 5月 2日の日記参照...」
    (更新:01/14 02:08)
  • link 19年01月13日
    すずき 「[ROCK64 と Tinker Board の U-Boot] ...」
    (更新:01/13 21:44)

こんてんつ

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

その他の情報

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