179 lines
4.1 KiB
C++
179 lines
4.1 KiB
C++
#include "playvideo.h"
|
|
#include <QDebug>
|
|
|
|
PlayVideo::PlayVideo(QObject *parent,
|
|
QQueue<MediaPacket *> *videoQueue,
|
|
QMutex *sendMutex,
|
|
void *channel,
|
|
int stream_id) :
|
|
QObject(parent)
|
|
{
|
|
this->videoQueue = videoQueue;
|
|
this->channel = channel;
|
|
this->sendMutex = sendMutex;
|
|
this->stream_id = stream_id;
|
|
elapsedTime = 0;
|
|
pausedTime = 0;
|
|
la_seekPos = -1;
|
|
vcrFlag = 0;
|
|
isStopped = false;
|
|
}
|
|
|
|
void PlayVideo::play()
|
|
{
|
|
MediaPacket *pkt;
|
|
int usl;
|
|
|
|
while (1)
|
|
{
|
|
vcrMutex.lock();
|
|
switch (vcrFlag)
|
|
{
|
|
case VCR_PLAY:
|
|
vcrFlag = 0;
|
|
vcrMutex.unlock();
|
|
if (pausedTime)
|
|
{
|
|
elapsedTime = av_gettime() - pausedTime;
|
|
pausedTime = 0;
|
|
}
|
|
isStopped = false;
|
|
continue;
|
|
break;
|
|
|
|
case VCR_PAUSE:
|
|
vcrMutex.unlock();
|
|
if (!pausedTime)
|
|
{
|
|
/* save amount of video played so far */
|
|
pausedTime = av_gettime() - elapsedTime;
|
|
}
|
|
usleep(1000 * 100);
|
|
isStopped = false;
|
|
continue;
|
|
break;
|
|
|
|
case VCR_STOP:
|
|
vcrMutex.unlock();
|
|
if (isStopped)
|
|
{
|
|
usleep(1000 * 100);
|
|
continue;
|
|
}
|
|
clearVideoQ();
|
|
elapsedTime = 0;
|
|
pausedTime = 0;
|
|
la_seekPos = -1;
|
|
xrdpvr_seek_media(0, 0);
|
|
isStopped = true;
|
|
continue;
|
|
break;
|
|
|
|
default:
|
|
vcrMutex.unlock();
|
|
goto label1;
|
|
break;
|
|
}
|
|
|
|
label1:
|
|
|
|
if (videoQueue->isEmpty())
|
|
{
|
|
continue;
|
|
}
|
|
pkt = videoQueue->dequeue();
|
|
sendMutex->lock();
|
|
send_video_pkt(channel, stream_id, pkt->av_pkt);
|
|
sendMutex->unlock();
|
|
usl = pkt->delay_in_us;
|
|
if (usl < 0)
|
|
{
|
|
usl = 0;
|
|
}
|
|
if (usl > 100 * 1000)
|
|
{
|
|
usl = 100 * 1000;
|
|
}
|
|
usleep(usl);
|
|
delete pkt;
|
|
updateMediaPos();
|
|
if (elapsedTime == 0)
|
|
elapsedTime = av_gettime();
|
|
|
|
/* time elapsed in 1/100th sec units since play started */
|
|
emit onElapsedtime((av_gettime() - elapsedTime) / 10000);
|
|
}
|
|
}
|
|
|
|
void PlayVideo::onMediaSeek(int value)
|
|
{
|
|
posMutex.lock();
|
|
la_seekPos = value;
|
|
posMutex.unlock();
|
|
}
|
|
|
|
void PlayVideo::updateMediaPos()
|
|
{
|
|
#if 0
|
|
if (elapsedTime == 0)
|
|
elapsedTime = av_gettime();
|
|
|
|
/* time elapsed in 1/100th sec units since play started */
|
|
emit onElapsedtime((av_gettime() - elapsedTime) / 10000);
|
|
#endif
|
|
|
|
posMutex.lock();
|
|
if (la_seekPos >= 0)
|
|
{
|
|
qDebug() << "seeking to" << la_seekPos;
|
|
xrdpvr_seek_media(la_seekPos, 0);
|
|
elapsedTime = av_gettime() - la_seekPos * 1000000;
|
|
la_seekPos = -1;
|
|
}
|
|
posMutex.unlock();
|
|
}
|
|
|
|
void PlayVideo::setVcrOp(int op)
|
|
{
|
|
vcrMutex.lock();
|
|
this->vcrFlag = op;
|
|
vcrMutex.unlock();
|
|
}
|
|
|
|
void PlayVideo::clearVideoQ()
|
|
{
|
|
MediaPacket *pkt;
|
|
|
|
while (!videoQueue->isEmpty())
|
|
{
|
|
pkt = videoQueue->dequeue();
|
|
av_free_packet((AVPacket *) pkt->av_pkt);
|
|
delete pkt;
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
void DecoderThread::updateSlider()
|
|
{
|
|
if (elapsedTime == 0)
|
|
elapsedTime = av_gettime();
|
|
|
|
/* time elapsed in 1/100th sec units since play started */
|
|
emit onElapsedtime((av_gettime() - elapsedTime) / 10000);
|
|
|
|
mutex.lock();
|
|
if (la_seekPos >= 0)
|
|
{
|
|
qDebug() << "seeking to" << la_seekPos;
|
|
//audioTimer->stop();
|
|
//videoTimer->stop();
|
|
xrdpvr_seek_media(la_seekPos, 0);
|
|
elapsedTime = av_gettime() - la_seekPos * 1000000;
|
|
//audioTimer->start(10);
|
|
//videoTimer->start(10);
|
|
la_seekPos = -1;
|
|
}
|
|
mutex.unlock();
|
|
}
|
|
#endif
|