История изменений
Исправление 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;
}