Androidカメラアーキテクチャの分析



Analysis Android Camera Architecture



1.カメライメージングの原理の紹介

カメラの作業フローチャート



画像

カメラのイメージング原理は次のように要約できます。



シーン(SCENE)がレンズ(LENS)を介して生成した光学画像は、イメージセンサー(Sensor)の表面に投影され、電気信号に変換され、A / D(アナログ-デジタル)によって変換されます。変換)。それはデジタル画像信号になり、処理のためにデジタル信号処理チップ(DSP)に送られ、次に処理のためにIOインターフェースを介してCPUに送信され、画像はDISPLAYを通して見ることができます。

電荷結合デバイス(CCD) または 相補型金属酸化膜半導体(CMOS) 受信光学レンズで透過した画像は、アナログ/デジタルコンバーター(A / D)でデジタル信号に変換され、エンコードされて保存されます。

プロセスは次のとおりです。
1. CCD / CMOSは、被写体の光信号を電気信号、つまり電子画像(アナログ信号)に変換します。
2.アナログ-デジタルコンバーター(ADC)チップによってアナログ信号をデジタル信号に変換します
3.デジタル信号が形成された後、信号はDSPまたはコードライブラリによって圧縮され、保存用に特定の画像ファイル形式に変換されます。



デジタルカメラの光学レンズは従来のカメラと同じであり、画像は感光性デバイス、つまり(写真)電荷結合デバイス(CCD)に焦点を合わせます。 CCDは、従来のカメラの写真フィルムの位置を置き換えるものであり、その機能は、テレビカメラと同じように、光信号を電気信号に変換することです。

CCDはデジタルカメラの中核となる半導体デバイスです。デバイス内のデバイスの数によって、デジタルカメラの画質が決まります。ピクセル数が多いほど、ピクセル数が多くなり、画質が向上します。より良いことに、ピクセルレベルは通常、デジタルカメラのグレードと技術仕様を表します。

2、Androidカメラフレームワーク

Androidのカメラサブシステムは、写真を撮ったりビデオを録画したりするためのフレームワークを提供します。

Cameraの上位アプリケーションをApplicationFrameworkおよびユーザーライブラリに接続し、Cameraのハードウェアレイヤーと通信してカメラハードウェアを操作するのはこのユーザーライブラリです。

画像

3、Androidカメラのコード構造

Androidのカメラコードは主に次のディレクトリにあります。
カメラのJAVA部分
パッケージ/アプリ/カメラ/。その中で、Camera.javaが主要な実装ファイルです。ターゲットにコンパイルされたコンテンツのこの部分はCamera.apkです
com.android.cameraこのパッケージ、いくつかの主要なクラスファイルは次のとおりです。
PhotoViewer:GalleryPicker.java(すべてのコレクション)---> ImageGallery.java(フォルダーの下の画像のリスト)---> ViewImage.java(特定の画像を参照)
VideoPlayer:GalleryPicker.java(すべてのビデオセット)---> MovieView.java(ビデオを参照)
カメラ:Camera.java(カメラのフレーミングと写真の撮影)
VideoCamera:VideoCamera.java(VideoCameraフレーミングとビデオ)

アプリケーション呼び出しの上部のカメラのフレームワーク

base / core / java / android / hardware / Camera.java

目標のこの部分はframework.jarです

カメラのJNI部分
フレームワーク/ベース/コア/jni/android_hardware_Camera.cpp
コンテンツのこの部分は、libandroid_runtime.soになるようにコンパイルされています。

カメラUIライブラリセクション
フレームワーク/ base / libs / ui / camera
このセクションの内容は、ライブラリlibcamera_client.soにコンパイルされます。

カメラサービスセクション
フレームワーク/ベース/カメラ/ libcameraservice /
この部分は、ライブラリlibcameraservice.soにコンパイルされます。

カメラHALレイヤー部分
ハードウェア/ msm7k / libcamera
または
ベンダー/ qcom / android-open / libcamera2
特定のカメラを実装するには、HALレイヤーにハードウェア関連のカメラライブラリが必要です(たとえば、LinuxドライバーおよびJpegエンコーディングプログラムのビデオを呼び出すか、さまざまなチップベンダーを直接使用します)。 Qualcommによって実装されるlibcamera.soやlibqcamera.soなどのプライベートライブラリが実装されます。これは、CameraHardwareInterfaceで指定されたインターフェイスを実装し、関連するライブラリを呼び出し、関連するドライバーを駆動し、カメラハードウェアの操作を実装します。このライブラリは、Cameraのサービスライブラリlibcameraservice.soによって呼び出されます。

保留されています

次の記事では、CameraHALの実装を2つの方法で紹介します。V4l2仕様のQualcommCameraアーキテクチャ(QualcommCameraHardwareおよびmm-camera / mm-Still)に従ってCameraHardwareInterfaceを実装します。もちろん、クアルコムの私立図書館の部分では、不必要なトラブルを避けるために、私が持っていきます。私を許してください!



fslのカメラhalレイヤーは、上位レイヤーから下位レイヤーにパラメーターを設定するためのインターフェースを実装していないため、自分で実装する必要があります。幸い、アプリケーションからhalレイヤーまでのパラメーターは修正されています。そうでない場合、ワークロードはさらに大きくなります。
halレイヤーで関数を呼び出すために設定されたパラメーターはstatus_tCameraHal :: setParameters(const CameraParameters&params)です。この関数の各パラメーターの設定を実装します。パラメータ設定は、主にCameraParametersクラスを介して実装されます。このクラスを観察することにより、各パラメーターを個別に取得できるget()関数があります。といった
const char * white_balance = params.get(CameraParameters :: KEY_WHITE_BALANCE)これは、現在のホワイトバランスパラメーターの戻り値です。次に、次のような戻り値に基づいて、どちらが当てはまるかを判断します。
if(strcmp(white_balance、CameraParameters :: WHITE_BALANCE_AUTO)== 0){//自動ホワイトバランスと判断されただけ
LOGV( 'white_balance to ioctl is auto!/ n')
ctl.id = V4L2_CID_AUTO_WHITE_BALANCE //自動ホワイトバランスコマンド、ctlはv4l2_control構造体であり、この構造体は非常に便利です
ctl.value = 1
if(ioctl(camera_device、VIDIOC_S_CTRL、&ctl)<0){ // Pass the ctl structure through VIDIOC_S_CTRL
LOGE( '制御の設定に失敗しました/ n')
//-1を返します
}
} else if(strcmp(white_balance、CameraParameters :: WHITE_BALANCE_INCANDESCENT)== 0){//白熱モード
LOGV( 'white_balance to ioctl is incandescent!/ n')
ctl.id = V4L2_CID_DO_WHITE_BALANCE //他のホワイトバランスの状況ではこのコマンドを使用します
ctl.value = 2 //ユーザーが定義したホワイトバランスモードの数に応じて配置します
if(ioctl(camera_device、VIDIOC_S_CTRL、&ctl)<0){ // Also pass the ctl structure through VIDIOC_S_CTRL, and then discuss it according to the value value.
LOGE( '制御の設定に失敗しました/ n')
//-1を返します
}
}

ドライバーのmxc_v4l2_capture.cファイルのmxc_v4l_ioctlに渡されます。 mxc_v4l_ioctlはmxc_v4l_do_ioctlを呼び出し、mxc_v4l_do_ioctlはコマンドを次のように解釈します
/ *!
* V4l2 VIDIOC_S_CTRL ioctl
* /
ケースVIDIOC_S_CTRL:{
pr_debug( 'case VIDIOC_S_CTRL / n')
retval = mxc_v4l2_s_ctrl(cam、arg)
ブレーク
}
これは、mxc_v4l2_s_ctrlに到達する場所です。 mxc_v4l2_s_ctrlでctl.idを呼び出す
スイッチ(c-> id){
……。
ケースV4L2_CID_AUTO_WHITE_BALANCE:
ipu_csi_enable_mclk_if(CSI_MCLK_I2C、cam-> csi、true、true)
ret = vidioc_int_s_ctrl(cam-> sensor、c)//この関数はov7670ドライバーのs_ctlに対応するv4l2です
ipu_csi_enable_mclk_if(CSI_MCLK_I2C、cam-> csi、false、false)
ブレーク
ケースV4L2_CID_DO_WHITE_BALANCE:
ipu_csi_enable_mclk_if(CSI_MCLK_I2C、cam-> csi、true、true)
ret = vidioc_int_s_ctrl(cam-> sensor、c)
ipu_csi_enable_mclk_if(CSI_MCLK_I2C、cam-> csi、false、false)
ブレーク
……。
ここで、vidioc_int_s_ctrl()は、ov7670ドライバーに対応するv4l2のioctl_s_ctrlです。スペース上の都合により、特定のコードへの対応方法は掲載しておりません。
ctl構造体のIDに従って実装できます。
スイッチ(vc-> id){
....。
ケースV4L2_CID_AUTO_WHITE_BALANCE:
retval = ov7670_autowhitebalance(vc-> value)
ブレーク
ケースV4L2_CID_DO_WHITE_BALANCE:
retval = ov7670_dowhitebalance(vc-> value)
ブレーク
……。
ホワイトバランス関数の実装は次のとおりです
static int ov7670_autowhitebalance(int value)
= COM8_AWB //自動ホワイトバランス

msleep(10)/ * FIXME * /
ret + = ov7670_write(ov7670_data.i2c_client、0x01、0x56)
ret + = ov7670_write(ov7670_data.i2c_client、0x02、0x44)
ret + = ov7670_write(ov7670_data.i2c_client、REG_COM8、v)

右に戻る


static int ov7670_dowhitebalance(int value)
{{
unsigned char v = 0
int ret
printk( '0v7670_dowhitebalance called value:%d / n'、value)
ret = ov7670_read(ov7670_data.i2c_client、REG_COM8、&v)
if(値)
v&= 〜COM8_AWB //自動ホワイトバランスをオフにします

msleep(10)/ * FIXME * /
ret + = ov7670_write(ov7670_data.i2c_client、REG_COM8、v)
if(value == 2)// INCANDESCENCE //この値はctlの値です
{{
ret + = ov7670_write(ov7670_data.i2c_client、0x01、0x8c)
ret + = ov7670_write(ov7670_data.i2c_client、0x02、0x59)
} else if(value == 3)// FLUORESCENT
{{
ret + = ov7670_write(ov7670_data.i2c_client、0x01、0x7e)
ret + = ov7670_write(ov7670_data.i2c_client、0x02、0x49)
} else if(value == 4)// DAYLIGHT
{{
ret + = ov7670_write(ov7670_data.i2c_client、0x01、0x52)
ret + = ov7670_write(ov7670_data.i2c_client、0x02、0x66)
}

右に戻る
}
ここで、ox01と0x02は、青赤チャネルのゲインのレジスタです。

上記は、hal層の最終層からセンサーまでのホワイトバランスのパラメーター設定プロセスです。カラー効果、フレーミングモードなどの他のものも同じプロセスです。
フレーミングモードは、ナイトモードなどの特定の条件に応じて設定できます。
色の効果は、主にuvの値を設定することによって実現されます。


転送元:http://blog.csdn.net/linphusen/article/details/6385236