Uint32 overlay_format;
我们搜索代码发现有两处赋值的地方
inline static void ffp_reset_internal(FFPlayer *ffp){
ffp->overlay_format = SDL_FCC_RV32;
}
void ffp_set_overlay_format(FFPlayer *ffp, int chroma_fourcc)
{
switch (chroma_fourcc) {
case SDL_FCC__GLES2:
case SDL_FCC_I420:
case SDL_FCC_YV12:
case SDL_FCC_RV16:
case SDL_FCC_RV24:
case SDL_FCC_RV32:
ffp->overlay_format = chroma_fourcc;
break;
#ifdef __APPLE__
case SDL_FCC_I444P10LE:
ffp->overlay_format = chroma_fourcc;
break;
#endif
default:
av_log(ffp, AV_LOG_ERROR, "ffp_set_overlay_format: unknown chroma fourcc: %d\n", chroma_fourcc);
break;
}
}
而ffp_set_overlay_format有没有调用
所以overlay_format就是SDL_FCC_RV32
#define SDL_FCC_RV32 SDL_FOURCC('R', 'V', '3', '2') /**< bpp=32, RGBX8888 */
RGBX 一个像素四个字节
那么overlay_format又用在了什么地方呢?
static void alloc_picture(FFPlayer *ffp, int frame_format){
SDL_VoutSetOverlayFormat(ffp->vout, ffp->overlay_format);
}
解码成功,创建picture时,设置给
SDL_Vout的overlay_format。
那么SDL_Vout的overlay_format又用在那里呢?
static int func_display_overlay_l(SDL_Vout *vout, SDL_VoutOverlay *overlay)
{
SDL_Vout_Opaque *opaque = vout->opaque;
ANativeWindow *native_window = opaque->native_window;
if (!native_window) {
if (!opaque->null_native_window_warned) {
opaque->null_native_window_warned = 1;
ALOGW("func_display_overlay_l: NULL native_window");
}
return -1;
} else {
opaque->null_native_window_warned = 1;
}
if (!overlay) {
ALOGE("func_display_overlay_l: NULL overlay");
return -1;
}
if (overlay->w <= 0 || overlay->h <= 0) {
ALOGE("func_display_overlay_l: invalid overlay dimensions(%d, %d)", overlay->w, overlay->h);
return -1;
}
switch(overlay->format) {
case SDL_FCC__AMC: {
// only ANativeWindow support
IJK_EGL_terminate(opaque->egl);
return SDL_VoutOverlayAMediaCodec_releaseFrame_l(overlay, NULL, true);
}
case SDL_FCC_RV24:
case SDL_FCC_I420:
case SDL_FCC_I444P10LE: {
// only GLES support
if (opaque->egl)
return IJK_EGL_display(opaque->egl, native_window, overlay);
break;
}
case SDL_FCC_YV12:
case SDL_FCC_RV16:
case SDL_FCC_RV32: {
// both GLES & ANativeWindow support
if (vout->overlay_format == SDL_FCC__GLES2 && opaque->egl)
return IJK_EGL_display(opaque->egl, native_window, overlay);
break;
}
}
// fallback to ANativeWindow
IJK_EGL_terminate(opaque->egl);
return SDL_Android_NativeWindow_display_l(native_window, overlay);
}
这时我们又发现了一个overlay->format,它和overlay_format 不是一会事
overlay->format在那里赋值呢?
通过下面一个流程图大家可以看到硬解码赋值为了
SDL_FCC__AMC