問題
從
vlc
源碼包里可以發(fā)現(xiàn)有個modules/codec/videotoolbox.m
,可以看出確實有videotoolbox
相關(guān)源碼踏揣,但是是否只支持Mac
版本還是iOS
版本也支持,是否硬編解碼都支持呢党窜?(懷疑來源1.官方只說了支持編碼程梦,懷疑來源2:ffmpeg也有videotoolbox相關(guān)源碼点把,但是不支持iOS硬解碼)。
所以需要調(diào)試跟蹤來驗證此問題
驗證
驗證1
- 其實從
CPU利用率
可以看出來屿附,播放同一個mp4視頻郎逃,查看CPU利用率
,會有明顯不同挺份。這個可以下載MobileVLCKit
較早版本褒翰,跟自己編譯出來的最新版本
(我的是258f1dd2
)對比,即可看出來新版確實使用了硬解碼匀泊。 -
VLC
官方論壇也說了2.7之后优训,默認(rèn)開啟硬解碼。
驗證2
對源碼調(diào)試
我們知道各聘,vlc
里解碼器
是作為一個module
存在的揣非,在modules.c
的vlc_module_load
里打上斷點,可以查看所有modules
加載躲因,當(dāng)capability
為decoder
時候早敬,就是要選擇解碼器了
modules_c.png
源碼有刪減
module_t *vlc_module_load(vlc_object_t *obj, const char *capability,
const char *name, bool strict,
vlc_activate_t probe, ...)
{
char *var = NULL;
if (name == NULL || name[0] == '\0')
name = "any";
/* Deal with variables */
if (name[0] == '$')
{
var = var_InheritString (obj, name + 1);
name = (var != NULL) ? var : "any";
}
/* Find matching modules */
module_t **mods;
ssize_t total = module_list_cap (&mods, capability);
msg_Dbg (obj, "looking for %s module matching \"%s\": %zd candidates",
capability, name, total);
if (total <= 0)
{
module_list_free (mods);
msg_Dbg (obj, "no %s modules", capability);
return NULL;
}
module_t *module = NULL;
const bool b_force_backup = obj->obj.force; /* FIXME: remove this */
va_list args;
va_start(args, probe);
...
done:
va_end (args);
obj->obj.force = b_force_backup;
module_list_free (mods);
free (var);
if (module != NULL)
{
msg_Dbg (obj, "using %s module \"%s\"", capability,
module_get_object (module));
vlc_object_set_name (obj, module_get_object (module));
}
else
msg_Dbg (obj, "no %s modules matched", capability);
return module;
}
在vlc_object_set_name
一行打斷點,單步跟進(jìn)大脉,可以看到解碼器名稱為VideoToolbox video decoder
modules_c1.png
打開modules/codec/videotoolbox.m
搞监,可以再77行看到,名稱一致也就是硬解碼被加載了
vlc_module_begin()
set_category(CAT_INPUT)
set_subcategory(SUBCAT_INPUT_VCODEC)
set_description(N_("VideoToolbox video decoder"))
set_capability("decoder",800)
set_callbacks(OpenDecoder, CloseDecoder)
調(diào)試驗證
參照iOS學(xué)習(xí)開源庫斷點方法,查找videotoolbox.m
的調(diào)用,突破口在decoder.c
的DecoderDecodeVideo
.
我用的方法是:
- 在
decoder.c
的DecoderThread
里打斷點镰矿,因為這是解碼線程死循環(huán) - 具體是
DecoderProcess
起作用腺逛,在這一行打斷點 - 取消斷點等界面出現(xiàn)畫面時候,把斷點點上衡怀。
- 找到了突破口
DecoderDecodeVideo
。
源碼如下:
static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
{
picture_t *p_pic;
block_t **pp_block = p_block ? &p_block : NULL;
unsigned i_lost = 0, i_decoded = 0;
while( (p_pic = p_dec->pf_decode_video( p_dec, pp_block ) ) )
{
i_decoded++;
DecoderPlayVideo( p_dec, p_pic, &i_lost );
}
DecoderUpdateStatVideo( p_dec, i_decoded, i_lost );
}
其中的p_dec
代表解碼器對象安疗,其實就是videotoolbox
對象抛杨,pf_decode_video
代表videotoolbox
的DecodeBlock
.