123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /**
* Copyright (c) 2006-2026 LOVE Development Team
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
#include "VideoStream.h"
using love::thread::Lock;
namespace love
{
namespace video
{
love::Type VideoStream::type("VideoStream", &Object::type);
void VideoStream::setSync(VideoStream::FrameSync *frameSync)
{
this->frameSync = frameSync;
}
VideoStream::FrameSync *VideoStream::getSync() const
{
return frameSync;
}
void VideoStream::play()
{
frameSync->play();
}
void VideoStream::pause()
{
frameSync->pause();
}
void VideoStream::seek(double offset)
{
frameSync->seek(offset);
}
double VideoStream::tell() const
{
return frameSync->tell();
}
bool VideoStream::isPlaying() const
{
return frameSync->isPlaying();
}
VideoStream::Frame::Frame()
: yplane(nullptr)
, cbplane(nullptr)
, crplane(nullptr)
{
}
VideoStream::Frame::~Frame()
{
delete[] yplane;
delete[] cbplane;
delete[] crplane;
}
void VideoStream::FrameSync::copyState(const VideoStream::FrameSync *other)
{
seek(other->tell());
if (other->isPlaying())
play();
else
pause();
}
double VideoStream::FrameSync::tell() const
{
return getPosition();
}
VideoStream::DeltaSync::DeltaSync()
: playing(false)
, position(0)
, speed(1)
{
}
VideoStream::DeltaSync::~DeltaSync()
{
}
double VideoStream::DeltaSync::getPosition() const
{
return position;
}
void VideoStream::DeltaSync::update(double dt)
{
Lock l(mutex);
if (playing)
position += dt*speed;
}
void VideoStream::DeltaSync::play()
{
playing = true;
}
void VideoStream::DeltaSync::pause()
{
playing = false;
}
void VideoStream::DeltaSync::seek(double time)
{
Lock l(mutex);
position = time;
}
bool VideoStream::DeltaSync::isPlaying() const
{
return playing;
}
VideoStream::SourceSync::SourceSync(love::audio::Source *source)
: source(source)
{
}
double VideoStream::SourceSync::getPosition() const
{
return source->tell(love::audio::Source::UNIT_SECONDS);
}
void VideoStream::SourceSync::play()
{
source->play();
}
void VideoStream::SourceSync::pause()
{
source->pause();
}
void VideoStream::SourceSync::seek(double time)
{
source->seek(time, love::audio::Source::UNIT_SECONDS);
}
bool VideoStream::SourceSync::isPlaying() const
{
return source->isPlaying();
}
} // video
} // love
|