LINUX.ORG.RU

История изменений

Исправление deep-purple, (текущая версия) :

Продолжаем наблюдать, смотрим сорцы. В кденлайв монитор запилили на GLWidget. Ладно, допустим пусть теперь будет хорошим вариантом пилить на культях, благо есть где подглядеть реализацию..

Ну а кадры оно готовит для монитора так (оставлю ка я комментарии):

QImage Render::extractFrame(int frame_position, const QString &path, int width, int height)
{
    if (width == -1) {
        width = frameRenderWidth();
        height = renderHeight();
    } else if (width % 2 == 1) width++; // про высоту вообще молчок, если ширина равна 2 то сделать 3, чо за херь?
    if (!path.isEmpty()) {
        // созададим же продюсера ради одного кадра, после чего удалим его нахер
        Mlt::Producer *producer = new Mlt::Producer(*m_qmlView->profile(), path.toUtf8().constData());
        if (producer) {
            if (producer->is_valid()) {
                QImage img = KThumb::getFrame(producer, frame_position, width, height);
                delete producer;
                return img;
            }
            else delete producer;
        }
    }
    // тут какойто внешний продюсер, хз, зальем картинко черным цветом
    if (!m_mltProducer || !path.isEmpty()) {
        QImage pix(width, height, QImage::Format_RGB32);
        pix.fill(Qt::black);
        return pix;
    }
    Mlt::Frame *frame = NULL;
    if (KdenliveSettings::gpu_accel()) { // вот тут интересно, ускорение, ага
        QString service = m_mltProducer->get("mlt_service");
        //TODO: create duplicate prod from xml data
        // а не создать ли нам еще одного продюсера? чо мелочится
        Mlt::Producer *tmpProd = new Mlt::Producer(*m_qmlView->profile(), service.toUtf8().constData(), path.toUtf8().constData());
        // сеттим всякое гогно
        Mlt::Filter scaler(*m_qmlView->profile(), "swscale");
        Mlt::Filter converter(*m_qmlView->profile(), "avcolor_space");
        tmpProd->attach(scaler);
        tmpProd->attach(converter);
        // мотаем на нужный кадр, ёпт... рукалицо
        tmpProd->seek(m_mltProducer->position());
        frame = tmpProd->get_frame();
        delete tmpProd; // получили фрейм и удалили продюсера
    }
    else {
        frame = m_mltProducer->get_frame(); //  не, ускорения нет, давай возьмем из внешнего продюсера
    }
    QImage img = KThumb::getFrame(frame, width, height); // не ну а чо, фрейм прогоним еще и через тамблер
    delete frame;
    return img;
}
Посоны, это же на КАЖДЫЙ кадр происходит! Они чо, совсем долбанутые?

Исходная версия deep-purple, :

Продолжаем наблюдать, смотрим сорцы. В кденлайв монитор запилили на GLWidget. Ладно, допустим пусть теперь будет хорошим вариантом пилить на культях, благо есть где подглядеть реализацию..

Ну а кадры оно готовит для монитора так (оставлю ка я комментарии):

QImage Render::extractFrame(int frame_position, const QString &path, int width, int height)
{
    if (width == -1) {
        width = frameRenderWidth();
        height = renderHeight();
    } else if (width % 2 == 1) width++; // про высоту вообще молчок, если ширина равна 2 то сделать 3, чо за херь?
    if (!path.isEmpty()) {
        // созададим же продюсера ради одного кадра, после чего удалим его нахер
        Mlt::Producer *producer = new Mlt::Producer(*m_qmlView->profile(), path.toUtf8().constData());
        if (producer) {
            if (producer->is_valid()) {
                QImage img = KThumb::getFrame(producer, frame_position, width, height);
                delete producer;
                return img;
            }
            else delete producer;
        }
    }
    // тут какойто внешний продюсер, хз, зальем картинко черным цветом
    if (!m_mltProducer || !path.isEmpty()) {
        QImage pix(width, height, QImage::Format_RGB32);
        pix.fill(Qt::black);
        return pix;
    }
    Mlt::Frame *frame = NULL;
    if (KdenliveSettings::gpu_accel()) { // вот тут интересно, ускорение, ага
        QString service = m_mltProducer->get("mlt_service");
        //TODO: create duplicate prod from xml data
        // а не создать ли нам еще одного продюсера? чо мелочится
        Mlt::Producer *tmpProd = new Mlt::Producer(*m_qmlView->profile(), service.toUtf8().constData(), path.toUtf8().constData());
        // сеттим всякое гогно
        Mlt::Filter scaler(*m_qmlView->profile(), "swscale");
        Mlt::Filter converter(*m_qmlView->profile(), "avcolor_space");
        tmpProd->attach(scaler);
        tmpProd->attach(converter);
        // мотаем на нужный кадр, ёпт... рукалицо
        tmpProd->seek(m_mltProducer->position());
        frame = tmpProd->get_frame();
        delete tmpProd; // получили фрейм и удалили продюсера
    }
    else {
        frame = m_mltProducer->get_frame(); //  не, ускорения нет, давай возьмем из внешнего продюсера
    }
    QImage img = KThumb::getFrame(frame, width, height); // не ну а чо, фрейм прогоним еще и через тамблер
    delete frame;
    return img;
}
Посоны, это же на КАЖДЫЙ кадр происходит! Они чо, совсем долбанутые?