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

分享

【轉(zhuǎn)】 Android通過(guò)軟解碼播放視頻

 techres 2010-11-20

Android通過(guò)軟解碼播放視頻

     一般情況下Android的平臺(tái)都是硬解碼視頻的,尤其是在Arm平臺(tái)這種成熟的硬件平臺(tái)上面(硬解碼代碼由芯片廠商提供)。但是Android移植到 MIPS平臺(tái)時(shí)間還不長(zhǎng),還不成熟,還需要自己實(shí)現(xiàn)硬件解碼的工作。為了早日讓Android在MIPS平臺(tái)運(yùn)行起來(lái),我選擇了先用軟解碼播放視頻。

     我的Android代碼是從Android on MIPS社區(qū)獲得的代碼。發(fā)現(xiàn)軟解碼視頻播放過(guò)程中會(huì)發(fā)生崩潰。經(jīng)過(guò)分析好像是內(nèi)存分配的問(wèn)題。

     經(jīng)過(guò)研究OpenCore庫(kù)(Android框架是通過(guò)OpenCore來(lái)播放視頻的,網(wǎng)上有很多關(guān)于OpenCore的介紹,這里就不多說(shuō)了),并參考Android平臺(tái)——Surfaceflinger機(jī)制。發(fā)現(xiàn)問(wèn)題出在源文件:

frameworks/base/libs/surfaceflinger/LayerBuffer.cpp

的LayerBuffer::BufferSource::postBuffer方法中:

............
buffer = new LayerBuffer::Buffer(buffers, offset);
............

類(lèi)LayerBuffer::Buffer的構(gòu)造函數(shù)代碼如下:

LayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset)
: mBufferHeap(buffers)
{
NativeBuffer& src(mNativeBuffer);
src.img.handle = 0;
gralloc_module_t const * module = LayerBuffer::getGrallocModule();
if (module && module->perform) {
int err = module->perform(module,
GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER,
buffers.heap->heapID(), buffers.heap->getSize(),
offset, buffers.heap->base(),
&src.img.handle);
if (err == NO_ERROR) {
src.crop.l = 0;
src.crop.t = 0;
src.crop.r = buffers.w;
src.crop.b = buffers.h;
src.img.w       = buffers.hor_stride ?: buffers.w;
src.img.h       = buffers.ver_stride ?: buffers.h;
src.img.format  = buffers.format;
src.img.base    = (void*)(intptr_t(buffers.heap->base()) + offset);
}
}
}

LayerBuffer::getGrallocModule方法的調(diào)用到的Gralloc為:

hardware/libhardware/modules/gralloc/gralloc.cpp

因?yàn)榈臎](méi)有實(shí)現(xiàn)在自己的硬件只能用通用的Gralloc,經(jīng)過(guò)分析發(fā)現(xiàn)通用的Gralloc沒(méi)有實(shí)現(xiàn) module->perform函數(shù)指針,module->perform為NULL,所以不會(huì)對(duì)Buffer進(jìn)行必要的初始化(我覺(jué)得應(yīng)該 是一個(gè)疏忽,只是不知道是谷歌的疏忽,還是MIPS移植人員的疏忽,最起碼應(yīng)該能夠讓通用硬件能跑起來(lái))。參考其他的硬件實(shí)現(xiàn)一個(gè)perform函數(shù)指針 到通用Gralloc中。

     在源文件:

hardware/libhardware/modules/gralloc/mapper.cpp

增加如下的函數(shù)定義:

int gralloc_perform(struct gralloc_module_t const* module,
int operation, ... )
{
int res = -EINVAL;
va_list args;
va_start(args, operation);
switch (operation) {
case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: {
int fd = va_arg(args, int);
size_t size = va_arg(args, size_t);
size_t offset = va_arg(args, size_t);
void* base = va_arg(args, void*);
native_handle_t** handle = va_arg(args, native_handle_t**);
private_handle_t* hnd = (private_handle_t*)native_handle_create(
private_handle_t::sNumFds, private_handle_t::sNumInts);
hnd->magic = private_handle_t::sMagic;
hnd->fd = fd;
hnd->flags = private_handle_t::PRIV_FLAGS_USES_PMEM;
hnd->size = size;
hnd->offset = offset;
hnd->base = intptr_t(base) + offset;
hnd->lockState = private_handle_t::LOCK_STATE_MAPPED;
*handle = (native_handle_t *)hnd;
res = 0;
break;
}
}
va_end(args);
return res;
}

然后在gralloc.cpp中增加,gralloc_perform的聲明:

extern int gralloc_perform(struct gralloc_module_t const* module,
int operation, ... );

并修改HAL_MODULE_INFO_SYM的定義,增加perform字段的定義:

struct private_module_t HAL_MODULE_INFO_SYM = {
base: {
.......
perform: gralloc_perform,
},
......
};

     重新編譯gralloc模塊,再次用Gallary應(yīng)用程序通過(guò)軟解碼播放視頻,就可以流暢的播放了,軟解碼的效率挺高的,沒(méi)有卡的感覺(jué)!贊一個(gè)。

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    亚洲天堂精品一区二区| 高跟丝袜av在线一区二区三区| 欧美日韩综合在线第一页| 国产又大又硬又粗又黄| 久久精品福利在线观看| 久久精品国产第一区二区三区| 中文精品人妻一区二区| 成人精品视频一区二区在线观看| 日韩人妻免费视频一专区| 中文字幕乱子论一区二区三区| 老司机精品在线你懂的| 久久国产精品亚州精品毛片| 亚洲一区二区三区精选| 国产精品欧美一区两区| 亚洲av成人一区二区三区在线| 久久综合九色综合欧美| 久久青青草原中文字幕| 五月婷婷六月丁香亚洲| 福利一区二区视频在线| 亚洲一区二区精品免费视频| 国产欧美精品对白性色| 日韩不卡一区二区视频| 国产精品久久香蕉国产线| 久久精品伊人一区二区| 草草视频精品在线观看| 天海翼高清二区三区在线| 日本少妇中文字幕不卡视频| 久久热在线视频免费观看| 免费在线成人午夜视频| 日本加勒比中文在线观看| 国产精品午夜小视频观看| 国产中文字幕久久黄色片| 丰满少妇被粗大猛烈进出视频| 欧美精品久久99九九| 国产亚州欧美一区二区| 精品少妇人妻av免费看| 日韩专区欧美中文字幕| 国产爆操白丝美女在线观看| 欧美精品久久男人的天堂| 亚洲国产av一二三区| 91日韩欧美中文字幕|