AVPixelFormat VideoDecoderFFmpegHWPrivate::getFormat(struct AVCodecContext *p_context, const AVPixelFormat *pi_fmt) { bool can_hwaccel = false; for (size_t i = 0; pi_fmt[i] != QTAV_PIX_FMT_C(NONE); i++) { const AVPixFmtDescriptor *dsc = av_pix_fmt_desc_get(pi_fmt[i]); if (dsc == NULL) continue; bool hwaccel = (dsc->flags & AV_PIX_FMT_FLAG_HWACCEL) != 0; qDebug("available %sware decoder output format %d (%s)", hwaccel ? "hard" : "soft", pi_fmt[i], dsc->name); if (hwaccel) can_hwaccel = true; } if (!can_hwaccel) goto end; for (size_t i = 0; pi_fmt[i] != QTAV_PIX_FMT_C(NONE); i++) { if (vaPixelFormat() != pi_fmt[i]) continue; /* We try to call setup when possible to detect errors when possible (later is too late) */ if (p_context->width > 0 && p_context->height > 0 && !setup(p_context)) { qWarning("acceleration setup failure"); break; } qDebug("Using %s for hardware decoding.", qPrintable(description)); p_context->draw_horiz_band = NULL; //?? return pi_fmt[i]; } close(); end: qWarning("hardware acceleration is not available" ); /* Fallback to default behaviour */ return avcodec_default_get_format(p_context, pi_fmt); }
AVPixelFormat VideoDecoderFFmpegHWPrivate::getFormat(struct AVCodecContext *p_context, const AVPixelFormat *pi_fmt) { bool can_hwaccel = false; for (size_t i = 0; pi_fmt[i] != QTAV_PIX_FMT_C(NONE); i++) { const AVPixFmtDescriptor *dsc = av_pix_fmt_desc_get(pi_fmt[i]); if (dsc == NULL) continue; bool hwaccel = (dsc->flags & AV_PIX_FMT_FLAG_HWACCEL) != 0; qDebug("available %sware decoder output format %d (%s)", hwaccel ? "hard" : "soft", pi_fmt[i], dsc->name); if (hwaccel) can_hwaccel = true; } if (!can_hwaccel) goto end; /* Profile and level information is needed now. * TODO: avoid code duplication with avcodec.c */ #if 0 if (p_context->profile != FF_PROFILE_UNKNOWN) p_dec->fmt_in.i_profile = p_context->profile; if (p_context->level != FF_LEVEL_UNKNOWN) p_dec->fmt_in.i_level = p_context->level; #endif for (size_t i = 0; pi_fmt[i] != PIX_FMT_NONE; i++) { if (vaPixelFormat() != pi_fmt[i]) continue; /* We try to call vlc_va_Setup when possible to detect errors when * possible (later is too late) */ if (p_context->width > 0 && p_context->height > 0 && !setup(p_context)) { qWarning("acceleration setup failure"); break; } qDebug("Using %s for hardware decoding.", qPrintable(description)); /* FIXME this will disable direct rendering * even if a new pixel format is renegotiated */ //p_sys->b_direct_rendering = false; p_context->draw_horiz_band = NULL; return pi_fmt[i]; } close(); //vlc_va_Delete(p_va); end: qWarning("acceleration not available" ); /* Fallback to default behaviour */ return avcodec_default_get_format(p_context, pi_fmt); }