bool VideoOutputNullVDPAU::InitBuffers(void)
{
    QMutexLocker locker(&m_lock);
    if (!m_render || !codec_is_vdpau_hw(video_codec_id))
        return false;

    uint buffer_size = m_decoder_buffer_size + MIN_PROCESS_BUFFER;
    const QSize video_dim = window.GetActualVideoDim();
    vbuffers.Init(buffer_size, false, 2, 1, 4, 1);
    bool ok = CreateVideoSurfaces(buffer_size);
    if (ok)
    {
        for (int i = 0; i < m_video_surfaces.size(); i++)
            ok &= vbuffers.CreateBuffer(video_dim.width(),
                                video_dim.height(), i,
                                m_render->GetRender(m_video_surfaces[i]),
                                FMT_VDPAU);
    }

    if (!ok)
    {
        DeleteBuffers();
        LOG(VB_GENERAL, LOG_ERR, LOC + "Unable to create VDPAU buffers");
        return false;
    }

    LOG(VB_PLAYBACK, LOG_INFO, LOC + "Created VDPAU buffers");
    return ok;
}
Exemple #2
0
bool VideoOutputVDPAU::InitBuffers(void)
{
    QMutexLocker locker(&m_lock);
    if (!m_render)
        return false;

    uint buffer_size = m_decoder_buffer_size + m_process_buffer_size;
    const QSize video_dim = codec_is_std(video_codec_id) ?
                            window.GetVideoDim() : window.GetActualVideoDim();

    vbuffers.Init(buffer_size, false, 2, 1, 4, 1);

    bool ok = false;
    if (codec_is_vdpau(video_codec_id))
    {
        ok = CreateVideoSurfaces(buffer_size);
        if (ok)
        {
            for (int i = 0; i < m_video_surfaces.size(); i++)
                ok &= vbuffers.CreateBuffer(video_dim.width(),
                                    video_dim.height(), i,
                                    m_render->GetRender(m_video_surfaces[i]),
                                    FMT_VDPAU);
        }
    }
    else if (codec_is_std(video_codec_id))
    {
        ok = CreateVideoSurfaces(NUM_REFERENCE_FRAMES);
        if (ok)
            ok = vbuffers.CreateBuffers(FMT_YV12,
                                        video_dim.width(), video_dim.height());
    }

    if (!ok)
    {
        LOG(VB_GENERAL, LOG_ERR, LOC + "Unable to create VDPAU buffers");
    }
    else
    {
        m_video_mixer = m_render->CreateVideoMixer(video_dim, 2,
                                                   m_mixer_features);
        ok = m_video_mixer;
        m_pause_surface = m_video_surfaces[0];

        if (ok && (m_mixer_features & kVDPFeatSharpness))
            m_render->SetMixerAttribute(m_video_mixer,
                                        kVDPAttribSharpness,
                                        m_sharpen);
        if (ok && (m_mixer_features & kVDPFeatDenoise))
            m_render->SetMixerAttribute(m_video_mixer,
                                        kVDPAttribNoiseReduction,
                                        m_denoise);
        if (ok && m_skip_chroma)
            m_render->SetMixerAttribute(m_video_mixer,
                                        kVDPAttribSkipChroma, 1);

        if (ok && (db_letterbox_colour == kLetterBoxColour_Gray25))
            m_render->SetMixerAttribute(m_video_mixer,
                                        kVDPAttribBackground, 0x7F7F7FFF);
    }

    if (!ok)
    {
        LOG(VB_GENERAL, LOG_ERR, LOC + "Unable to create VDPAU mixer");
        DeleteBuffers();
    }

    return ok;
}