Problem with callback function

This forum is about all development around libVLC.
bird12358
Blank Cone
Blank Cone
Posts: 10
Joined: 03 Feb 2013 14:42

Problem with callback function

Postby bird12358 » 02 Mar 2014 16:55

Hello,

I try to develop an application aroud libvlc to display webcam Stream. I use Qt to insert the Stream in a widget. I use callcack function to get the image pointor.

Here is my code:

Code: Select all

// IMPORT DES LIBRARIES Qt #include <QVBoxLayout> #include <QPushButton> #include <QSlider> #include <QTimer> #include <QFrame> #include <QDir> #include <QDate> #include <QAction> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsProxyWidget> #include <QLabel> #include <QTime> // IMPORT DES LIBRARIES Qwt // IMPORT DES LIBRARIES perso #include <player.h> #include <frame.h> // IMPORT de la LIBRAIRIE qextserial #include <iostream> #include <stdio.h> using namespace std; Player::Player(QWidget *Parent) : QWidget(Parent) { PlayerTime = 0; // Pointer dans le vide _videoWidget =new QWidget(this); _videoWidget->setStyleSheet("background-color:black;"); // view->setScene(scene); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(_videoWidget); // layout->addWidget(view); setLayout(layout); /* Load the VLC engine */ inst = libvlc_new(0, NULL); } //desctructor Player::~Player() { // delete _videoWidget; //cout << "Suppression Player" << endl; // libvlc_media_player_stop (mp); /* Free the media_player */ // libvlc_media_player_release (mp); // libvlc_release (inst); //cout << "Suppression Player fin" << endl; } ////////////////////////////////////////////////////// /* Nom: SetSetting Paremètres entrées: void Paremètres sorties: void Description : Application des options */ ////////////////////////////////////////////////////// void Player::SetSetting() { } void display(void *opaque, void *picture) { cout << "je passe la" << endl; } void *lock(void *data, void **p_pixels) { cout << "je passe li" << endl; // struct ctx *ctx = data; // SDL_LockMutex(ctx->mutex); // SDL_LockSurface(ctx->surf); // *p_pixels = ctx->surf->pixels; return NULL; /* picture identifier, not needed here */ } void unlock(void *data, void *id, void *const *p_pixels) { cout << "je passe lo" << endl; // struct ctx *ctx = data; // /* VLC just rendered the video, but we can also render stuff */ // uint16_t *pixels = *p_pixels; // int x, y; // for(y = 10; y < 40; y++) // for(x = 10; x < 40; x++) // if(x < 13 || y < 13 || x > 36 || y > 36) // pixels[y * VIDEOWIDTH + x] = 0xffff; // else // pixels[y * VIDEOWIDTH + x] = 0x0; // SDL_UnlockSurface(ctx->surf); // SDL_UnlockMutex(ctx->mutex); // assert(id == NULL); /* picture identifier, not needed here */ } void Player::playFile() { m = libvlc_media_new_path(inst, "dshow://"); libvlc_media_add_option(m,":dshow-vdev="); //USB2.0 Grabber libvlc_media_add_option(m,":dshow-adev=none"); //USB2.0 Grabber /* Create a media player playing environement */ mp = libvlc_media_player_new_from_media (m); libvlc_video_set_callbacks(mp, lock, unlock, display, (void *)this); libvlc_media_player_set_hwnd(mp,_videoWidget->winId()); // for vlc 1.0 // libvlc_media_player_set_xwindow(mp,(uint32_t)this->winId()); /* play the media_player */ libvlc_media_player_play(mp); // _videoWidget->move(-20,0); MyPlayerStat = Play; } void Player::updateInterface() { } void Player::AskRecord() { emit AskRecordSignal(); } void Player::libvlc_media_player_record_start(QString Path) { if(MyPlayerStat != Record) { libvlc_media_player_stop (mp); /* Free the media_player */ libvlc_media_player_release (mp); // libvlc_release (inst); m = libvlc_media_new_path(inst,"dshow://"); libvlc_media_add_option(m,":dshow-vdev="); //USB2.0 Grabber libvlc_media_add_option(m,":dshow-adev=none"); //USB2.0 Grabber QDate D = QDate::currentDate(); QTime time = QTime::currentTime(); QString timeString = time.toString(); QStringList Stmp = timeString.split(":"); QString Sout =""; for(int i=0 ; i<Stmp.size() ; i++) { Sout += Stmp[i]+"_"; } QString S; S = QString::number(D.day()) + "_" + QString::number(D.month())+ "_" + QString::number(D.year())+ "_" + Sout + "video.asf" ; QString Option = ":sout=#transcode{vcodec=WMV2,vb=800,scale=1,acodec=wma,ab=128,channels=2}:duplicate{dst=display,dst=std{access=file,mux=asf,dst="+Path+"\\"+S+"}}"; // QString Option = ":sout=#transcode{vcodec=WMV2,vb=800,scale=1,acodec=wma,ab=128,channels=2}:duplicate{dst=display,dst=std{access=file,mux=asf,dst=C:/Users/xavier/Desktop/tt44443.asf}}"; //cout << "options : " << Option.toStdString() << " et " << endl; libvlc_media_add_option(m, Option.toStdString().data()); /* Create a media player playing environement */ mp = libvlc_media_player_new_from_media (m); /* No need to keep the media now */ // libvlc_media_release (m); libvlc_media_player_set_hwnd(mp, _videoWidget->winId()); // for vlc 1.0 /* play the media_player */ libvlc_media_player_play(mp); inst = libvlc_new (0, NULL); //demarrage du timer IDTimer = startTimer(1000); MyPlayerStat = Record; if(PlayerTime == 0) PlayerTime = new QTime(); else { delete PlayerTime; PlayerTime = new QTime(); } PlayerTime->start(); } } ////////////////////////////////////////////////////// /* Nom: libvlc_media_player_record_stop Paremètres entrées: void Paremètres sorties: void Description : Arret de l'affichage du flux video */ ////////////////////////////////////////////////////// void Player::libvlc_media_player_record_stop() { // Arret du timer // Remise à zero de l'affichage emit ValueRecordTime(" "); if(MyPlayerStat != Play) { killTimer(IDTimer); libvlc_media_player_stop(mp); playFile(); } } ////////////////////////////////////////////////////// /* Nom: libvlc_media_player_record_play Paremètres entrées: void Paremètres sorties: void Description : Lancer l'affichage du flux video */ ////////////////////////////////////////////////////// void Player::libvlc_media_player_record_play() { if(MyPlayerStat != Record) libvlc_media_player_play(mp); } ////////////////////////////////////////////////////// /* Nom: ProcessFrame Paremètres entrées: Frame Paremètres sorties: void Description : Traitement de la trame du RS232 */ ////////////////////////////////////////////////////// void Player::ProcessFrame(Frame F) { } ////////////////////////////////////////////////////// /* Nom: timeConversion Paremètres entrées: int msecs Paremètres sorties: void Description : */ ////////////////////////////////////////////////////// QString Player::timeConversion(int msecs) { QString formattedTime; int hours = msecs/(1000*60*60); int minutes = (msecs-(hours*1000*60*60))/(1000*60); int seconds = (msecs-(minutes*1000*60)-(hours*1000*60*60))/1000; // int milliseconds = msecs-(seconds*1000)-(minutes*1000*60)-(hours*1000*60*60); formattedTime.append(QString("%1").arg(hours, 2, 10, QLatin1Char('0')) + ":" + QString( "%1" ).arg(minutes, 2, 10, QLatin1Char('0')) + ":" + QString( "%1" ).arg(seconds, 2, 10, QLatin1Char('0'))); return formattedTime; } ////////////////////////////////////////////////////// /* Nom: timerEvent Paremètres entrées: QTimerEvent* event Paremètres sorties: void Description : Timer permettant de gerer l'affichage dans le label d'enregsitrement. */ ////////////////////////////////////////////////////// void Player::timerEvent(QTimerEvent* event) { if(MyPlayerStat == Record) emit ValueRecordTime(" Rec: "+timeConversion(PlayerTime->elapsed())); }
I have a lock/unlock and display functions. When the first image comes, the program goes in the lock function and theprogram shutdown with an error.

Why this happens? The error happens when I had that line for the callback functions: libvlc_video_set_callbacks(mp, lock, unlock, display,(void *)this);

Thank you in advance.

Jean-Baptiste Kempf
Site Administrator
Site Administrator
Posts: 37523
Joined: 22 Jul 2005 15:29
VLC version: 4.0.0-git
Operating System: Linux, Windows, Mac
Location: Cone, France
Contact:

Re: Problem with callback function

Postby Jean-Baptiste Kempf » 22 Apr 2014 14:39

Use a debugger to know more about this.
Jean-Baptiste Kempf
http://www.jbkempf.com/ - http://www.jbkempf.com/blog/category/Videolan
VLC media player developer, VideoLAN President and Sites administrator
If you want an answer to your question, just be specific and precise. Don't use Private Messages.


Return to “Development around libVLC”

Who is online

Users browsing this forum: No registered users and 6 guests