qt/LedOK/player/elevideo - vlc.cpp

62 lines
2.3 KiB
C++
Raw Permalink Normal View History

2023-04-18 14:14:46 +08:00
#include "elevideo.h"
#include "tools.h"
#include <QPainter>
#include <QMessageBox>
#include <QMutex>
static void *lock(void *opaque, void **planes) {
auto that = (EleVideo *) opaque;
that->imgRaw = QImage(that->mWidth, that->mHeight, QImage::Format_RGB32);
*planes = that->imgRaw.bits(); /*tell VLC to put decoded data to this buffer*/
return 0; /* picture identifier, not needed here */
}
static void unlock(void *opaque, void *picture, void *const *planes) {
}
static void display(void *opaque, void *picture) {
auto that = (EleVideo *) opaque;
that->emDisplay(that->imgRaw);
}
EleVideo::EleVideo(QString path, QWidget *parent) : QWidget{parent} {
vlc = libvlc_new(0, NULL);
auto pathChars = path.replace("/","\\").toUtf8();
auto media = libvlc_media_new_path(vlc, pathChars.data());
qDebug()<<"media"<<media;
libvlc_media_parse(media);
//libvlc_media_add_option(media, ":avcodec-hw=none");
player = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
libvlc_video_get_size(player, 0, &mWidth, &mHeight);
qDebug()<<" size"<<mWidth<<mHeight;
libvlc_video_set_callbacks(player, lock, unlock, display, this);
libvlc_video_set_format(player, "RV32", mWidth, mHeight, mWidth * 4);
libvlc_video_set_adjust_int(player, libvlc_adjust_Enable, 1);
libvlc_video_set_adjust_float(player, libvlc_adjust_Brightness, 1.1); //Value ranges from 0.0 to 2.0
libvlc_video_set_adjust_float(player, libvlc_adjust_Contrast, 1.5);
libvlc_video_set_adjust_float(player, libvlc_adjust_Saturation, 3);
connect(this, &EleVideo::emDisplay, this, [this](QImage aimg){
img = aimg;
update();
});
}
//void EleVideo::mouseDoubleClickEvent(QMouseEvent *) {
// qDebug()<<"img"<<img;
// qDebug()<<"img"<<player->img;
// qDebug()<<"viCurTime"<<player->viCurTime;
// qDebug()<<"viSize"<<player->viSize;
//}
void EleVideo::showEvent(QShowEvent *) {
if(player!=nullptr) libvlc_media_player_play(player);
}
void EleVideo::hideEvent(QHideEvent *) {
if(player!=nullptr) libvlc_media_player_stop(player);
}
void EleVideo::paintEvent(QPaintEvent *e) {
QWidget::paintEvent(e);
QPainter painter(this);
painter.drawImage(QRectF(0, 0, width(), height()), img);
}