Analyse de l'architecture de la caméra Android

Analysis Android Camera Architecture



1. Introduction au principe d'imagerie par caméra

Organigramme de travail de la caméra



image



Le principe d'imagerie de Camera peut être résumé comme suit:



L'image optique générée par la scène (SCENE) à travers l'objectif (LENS) est projetée sur la surface du capteur d'image (Sensor), puis convertie en un signal électrique, qui est converti par A / N (analogique-numérique conversion). Il devient un signal d'image numérique, puis envoyé à la puce de traitement de signal numérique (DSP) pour traitement, puis transmis à l'unité centrale via l'interface IO pour traitement, et l'image peut être vue via DISPLAY.

Dispositif à couplage de charge (CCD) ou Semi-conducteur à oxyde métallique complémentaire (CMOS) L'image transmise par la lentille optique réceptrice est convertie en un signal numérique par un convertisseur analogique / numérique (A / N), et est codée et stockée.

Le processus est le suivant:
1. CCD / CMOS convertit le signal optique du sujet en un signal électrique - image électronique (signal analogique)
2. Convertissez le signal analogique en signal numérique par la puce de convertisseur analogique-numérique (ADC)
3. Une fois le signal numérique formé, le signal est compressé par le DSP ou la bibliothèque de codes et converti en un format de fichier image spécifique pour le stockage.



La lentille optique d'un appareil photo numérique est la même que celle d'un appareil photo classique et l'image est focalisée sur un dispositif photosensible, c'est-à-dire un dispositif à couplage de charge (photo) (CCD). Le CCD remplace la position du film photographique dans une caméra conventionnelle, et sa fonction est de convertir un signal optique en un signal électrique, qui est le même qu'une caméra de télévision.

Le CCD est un dispositif semi-conducteur, qui est le cœur des appareils photo numériques. Le nombre d'appareils dans l'appareil détermine la qualité d'image des appareils photo numériques. Plus il y a de pixels, plus le nombre de pixels est élevé, meilleure est la qualité de l'image. Le mieux, le niveau de pixel représente généralement la qualité et les spécifications techniques de l'appareil photo numérique.

2, cadre de caméra Android

Le sous-système Appareil photo d'Android fournit un cadre pour prendre des photos et enregistrer des vidéos.

Il connecte l'application supérieure de Camera avec Application Framework et la bibliothèque utilisateur, et c'est cette bibliothèque utilisateur qui communique avec la couche matérielle de Camera pour faire fonctionner le matériel de la caméra.

image

3, structure de code de la caméra Android

Le code de l'appareil photo d'Android se trouve principalement dans les répertoires suivants:
JAVA partie de la caméra
Paquets / applications / appareil photo /. Parmi eux, Camera.java est le principal fichier d'implémentation. Cette partie du contenu compilé dans une cible est Camera.apk
com.android.camera Ce package, plusieurs fichiers de classe principale sont les suivants:
PhotoViewer: GalleryPicker.java (toutes les collections) ---> ImageGallery.java (une liste d'images sous le dossier) ---> ViewImage.java (voir une image spécifique)
VideoPlayer: GalleryPicker.java (tous les ensembles vidéo) ---> MovieView.java (voir une vidéo)
Appareil photo: Camera.java (Cadrage de l'appareil photo et prise de photos)
VideoCamera: VideoCamera.java (cadrage et vidéo VideoCamera)

Cadre de la caméra pour la partie supérieure de l'appel d'application

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

Cette partie de l'objectif est framework.jar

JNI partie de la caméra
frameworks / base / core / jni / android_hardware_Camera.cpp
Cette partie du contenu est compilée pour être libandroid_runtime.so.

Section de la bibliothèque de l'interface utilisateur de l'appareil photo
frameworks / base / libs / ui / camera
Le contenu de cette section est compilé dans la bibliothèque libcamera_client.so.

Section de service de caméra
frameworks / base / camera / libcameraservice /
Cette partie est compilée dans la bibliothèque libcameraservice.so.

Partie de la couche HAL de la caméra
matériel / msm7k / libcamera
ou
fournisseur / qcom / android-open / libcamera2
Afin d'implémenter une caméra spécifique, une bibliothèque de caméras liée au matériel est nécessaire au niveau de la couche HAL (par exemple, en appelant la vidéo pour le pilote Linux et le programme d'encodage Jpeg ou directement en utilisant divers fournisseurs de puces). La bibliothèque privée est implémentée, telle que libcamera.so et libqcamera.so implémentée par Qualcomm, qui implémente l'interface spécifiée par CameraHardwareInterface, appelle la bibliothèque appropriée, pilote le pilote approprié et implémente le fonctionnement du matériel de la caméra. Cette bibliothèque sera appelée par la bibliothèque de services de Camera libcameraservice.so.

est en attente

Dans le prochain article, je présenterai l'implémentation de Camera HAL de deux manières: J'implémente CameraHardwareInterface selon la spécification V4l2 Architecture de la caméra Qualcomm (QualcommCameraHardware et mm-camera / mm-Still). Bien sûr, dans la partie bibliothèque privée Qualcomm, afin d'éviter des ennuis inutiles, je l'emporterai avec vous. S'il vous plaît, pardonnez-moi!



La couche caméra hal de fsl n'implémente pas l'interface pour définir les paramètres de la couche supérieure à la couche inférieure, vous devez donc l'implémenter vous-même. Heureusement, les paramètres de l'application à la couche hal ont été corrigés, sinon la charge de travail sera encore plus importante.
Le jeu de paramètres pour appeler la fonction dans la couche hal est status_t CameraHal :: setParameters (const CameraParameters & params). Implémentez les réglages pour chaque paramètre dans cette fonction. Les réglages des paramètres sont principalement implémentés via la classe CameraParameters. En observant cette classe, il existe une fonction get () qui peut obtenir chaque paramètre séparément. Tel que
const char * white_balance = params.get (CameraParameters :: KEY_WHITE_BALANCE) Il s'agit de la valeur de retour du paramètre de balance des blancs actuel. Ensuite, jugez quel est le cas en fonction de la valeur de retour, telle que
if (strcmp (white_balance, CameraParameters :: WHITE_BALANCE_AUTO) == 0) {// Juste considéré comme la balance des blancs automatique
LOGV ('white_balance to ioctl is auto! / N')
ctl.id = V4L2_CID_AUTO_WHITE_BALANCE // Commande de balance des blancs automatique, ctl est la structure v4l2_control, cette structure est très utile
ctl.value = 1
if (ioctl (appareil_appareil photo, VIDIOC_S_CTRL, & ctl)<0){ // Pass the ctl structure through VIDIOC_S_CTRL
LOGE ('set control failed / n')
// retourne -1
}
} else if (strcmp (white_balance, CameraParameters :: WHITE_BALANCE_INCANDESCENT) == 0) {// mode incandescent
LOGV ('white_balance to ioctl is incandescent! / N')
ctl.id = V4L2_CID_DO_WHITE_BALANCE // D'autres situations de balance des blancs utilisent cette commande
ctl.value = 2 // Organiser en fonction du nombre de modes de balance des blancs définis par l'utilisateur
if (ioctl (appareil_appareil photo, VIDIOC_S_CTRL, & ctl)<0){ // Also pass the ctl structure through VIDIOC_S_CTRL, and then discuss it according to the value value.
LOGE ('set control failed / n')
// retourne -1
}
}

est passé au mxc_v4l_ioctl du fichier mxc_v4l2_capture.c du pilote. mxc_v4l_ioctl appelle mxc_v4l_do_ioctl, mxc_v4l_do_ioctl interprète la commande comme suit
/ *!
* V4l2 VIDIOC_S_CTRL ioctl
* /
case VIDIOC_S_CTRL: {
pr_debug ('cas VIDIOC_S_CTRL / n')
retval = mxc_v4l2_s_ctrl (came, arg)
Pause
}
C'est là que mxc_v4l2_s_ctrl est atteint. Dans mxc_v4l2_s_ctrl en appelant ctl.id
commutateur (c-> id) {
......
case V4L2_CID_AUTO_WHITE_BALANCE:
ipu_csi_enable_mclk_if (CSI_MCLK_I2C, cam-> csi, vrai, vrai)
ret = vidioc_int_s_ctrl (cam-> sensor, c) // Cette fonction est v4l2 correspondant à s_ctl dans le pilote ov7670
ipu_csi_enable_mclk_if (CSI_MCLK_I2C, cam-> csi, faux, faux)
Pause
cas V4L2_CID_DO_WHITE_BALANCE:
ipu_csi_enable_mclk_if (CSI_MCLK_I2C, cam-> csi, vrai, vrai)
ret = vidioc_int_s_ctrl (cam-> capteur, c)
ipu_csi_enable_mclk_if (CSI_MCLK_I2C, cam-> csi, faux, faux)
Pause
......
où vidioc_int_s_ctrl () est le ioctl_s_ctrl dans la v4l2 correspondant au pilote ov7670. La correspondance avec le code spécifique n'est pas affichée pour des raisons d'espace.
peut être implémenté selon l'id de la structure ctl.
commutateur (vc-> id) {
.....
case V4L2_CID_AUTO_WHITE_BALANCE:
retval = ov7670_autowhitebalance (vc-> valeur)
Pause
cas V4L2_CID_DO_WHITE_BALANCE:
retval = ov7670_dowhitebalance (vc-> valeur)
Pause
......
Voici la mise en œuvre de la fonction de balance des blancs
static int ov7670_autowhitebalance (valeur int)
= COM8_AWB // Balance des blancs automatique

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)

retour à droite


static int ov7670_dowhitebalance (valeur int)
{
caractère non signé v = 0
int ret
printk ('0v7670_dowhitebalance appelé valeur:% d / n', valeur)
ret = ov7670_read (ov7670_data.i2c_client, REG_COM8, & v)
if (valeur)
v & = ~ COM8_AWB // Désactiver la balance des blancs automatique

msleep (10) / * FIXME * /
ret + = ov7670_write (ov7670_data.i2c_client, REG_COM8, v)
if (value == 2) // INCANDESCENCE // Cette valeur est la valeur de ctl
{
ret + = ov7670_write (ov7670_data.i2c_client, 0x01, 0x8c)
ret + = ov7670_write (ov7670_data.i2c_client, 0x02, 0x59)
} else if (valeur == 3) // FLUORESCENT
{
ret + = ov7670_write (ov7670_data.i2c_client, 0x01, 0x7e)
ret + = ov7670_write (ov7670_data.i2c_client, 0x02, 0x49)
} else if (valeur == 4) // DAYLIGHT
{
ret + = ov7670_write (ov7670_data.i2c_client, 0x01, 0x52)
ret + = ov7670_write (ov7670_data.i2c_client, 0x02, 0x66)
}

retour à droite
}
où ox01 et 0x02 sont les registres du gain du canal bleu-rouge.

Ce qui précède est le processus de paramétrage de la balance des blancs de la couche finale de la couche hal vers le capteur. D'autres, tels que les effets de couleur, les modes de cadrage, etc. sont le même processus.
Le mode de cadrage peut être réglé en fonction de conditions spécifiques telles que le mode nuit.
L'effet de couleur est principalement obtenu en définissant la valeur des uv.


Transfert depuis: http://blog.csdn.net/linphusen/article/details/6385236