一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android camera 默認(rèn)顯示黑白的問題

 mandrave 2011-11-24
在初次接觸android的時候就注意到通過模擬器,相機(jī)預(yù)覽的時候只能顯示黑白電影。這些天總算有點空閑時間了,決定研究下這個。 關(guān)于android camera的構(gòu)造不再說了,模擬器上使用用的是一個虛擬的Camera-----FakeCamera這個大家應(yīng)該都知道。
首先初略的了解一下camera preview圖像顯示的原理。Camera application 初始化的時候會創(chuàng)建一個surfaceview,從camera device 接收到的數(shù)據(jù)就可以通過它顯示在屏幕上。內(nèi)部處理的流程是很復(fù)雜的,下面我只給出一個從初始化到繪圖函數(shù)調(diào)用的流程。
Surface初始化:
Android_view_surface:: Surface_init-->SurfaceComposerClient::CreateSurface-->
SurfaceFlinger:: createSurface-->Android_view_surface:: setSurface
Camera數(shù)據(jù)緩沖區(qū)Heap初始化:
CameraHardwareStub::initHeapLocked-->new MemoryBase-->new FakeCamera
Heap緩沖區(qū)注冊到surface:
Android_hardware_camera:: android_hardware_Camera_setPreviewDisplay-->
Camera:: setPreviewDisplay-->CameraService::Client::setPreviewDisplay-->
CameraService::Client::registerPreviewBuffers-->LayerBuffer::registerBuffers
FakeCamera 原始數(shù)據(jù)的傳遞與繪圖:
CameraHardwareStub::previewThread-->CameraService::Client::previewCallback-->
CameraService::Client::postPreviewFrame-->ISurface:: postBuffer-->
LayerBuffer::postBuffer--> LayerBuffer::BufferSource::postBuffer-->
LayerBase::invalidate-->SurfaceFlinger::signalEvent-->SurfaceFlinger::threadLoop-->
SurfaceFlinger::handleRepaint-->LayerBase::draw-->
LayerBuffer::BufferSource::onDraw-->LayerBase::drawWithOpenGL
FakeCamera得到數(shù)據(jù)為Yuv422, 原以為是庫里某個地方繪圖的時候出問題,但LayerBuffer::OnDraw 往下走很復(fù)雜的:
                       t.format == GGL_PIXEL_FORMAT_YCbCr_420_SP) {
                // just show the Y plane of YUV buffers。 不明白為什么google這么做。。。。。
但要解決預(yù)覽為黑白電影的問題應(yīng)該就比較簡單了。只要我們將YUV數(shù)據(jù)轉(zhuǎn)換為RGB丟給cameraService就可以了。用以下的代碼替代ccrgb16toyuv_wo_colorkey。
int32_t ccrgb16toyuv_wo_colorkey(uint8_t *rgb16,uint8_t *yuv422,uint32_t *param,uint8_t *table[])
{
       int32_t width_dst = param[0];
    int32_t height_dst = param[1];
       memcpy(yuv422, rgb16, width_dst*height_dst*2);
}
CameraService中改動:
status_t CameraService::Client::registerPreviewBuffers()
{
   。。。。。。。。。。。。。。。。。。。。。。。
    ISurface::BufferHeap buffers(w, h, w, h,
                                PIXEL_FORMAT_RGB_565,
//PIXEL_FORMAT_YCbCr_420_SP,
                                 transform,
                                 0,
                                 mHardware->getPreviewHeap());
  status_t ret = mSurface->registerBuffers(buffers);
    if (ret != NO_ERROR) {
        LOGE("registerBuffers failed with status %d", ret);
    }
    return ret;
}
用PIXEL_FORMAT_RGB_565替換PIXEL_FORMAT_YCbCr_420_SP。這樣就可以了。不妨動手試一試吧,看看是不是預(yù)覽視頻變?yōu)椴噬牧恕?
對于實際的camera device出來的數(shù)據(jù)如果是yuv的話,也可以通過算法將yuv轉(zhuǎn)換為RGB,這樣做并不會導(dǎo)致轉(zhuǎn)換效率降低,因為即使將yuv得數(shù)據(jù)丟到surfaceflinger中,最終還是會轉(zhuǎn)換為BMp。
----AlbertChen

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲国产av国产av| 日韩人妻一区二区欧美| 亚洲a码一区二区三区| 国产在线小视频你懂的| 大尺度激情福利视频在线观看| 国产成人高清精品尤物| 精品久久av一二三区| 国产真人无遮挡免费视频一区| 亚洲免费观看一区二区三区| 欧美精品久久99九九| 午夜精品麻豆视频91| 日韩精品中文字幕亚洲| 亚洲精品中文字幕一二三| 国产午夜精品亚洲精品国产| 日韩一区二区三区观看| 国产激情一区二区三区不卡| 精品香蕉一区二区在线| 色婷婷国产精品视频一区二区保健| 亚洲综合日韩精品欧美综合区| 午夜福利视频六七十路熟女| 老司机精品视频在线免费| 男女激情视频在线免费观看| 国内女人精品一区二区三区| 男人大臿蕉香蕉大视频| 日韩一区二区三区久久| 欧美中文日韩一区久久| 日本女优一区二区三区免费| 色婷婷成人精品综合一区| 97人摸人人澡人人人超碰| 日本午夜免费观看视频| 日韩专区欧美中文字幕| 真实偷拍一区二区免费视频| 色偷偷亚洲女人天堂观看| 久久99精品国产麻豆婷婷洗澡| 亚洲中文字幕视频一区二区| 国产精品福利精品福利| 亚洲精品小视频在线观看| 亚洲欧美一二区日韩高清在线 | 日本女人亚洲国产性高潮视频| 欧美精品二区中文乱码字幕高清| 国产盗摄精品一区二区视频|