mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 22:23:51 +00:00
Merge branch 'videoplayback' of https://github.com/ChrisKCat/openmw into videoplayback
This commit is contained in:
commit
df9121f7fc
1 changed files with 17 additions and 3 deletions
|
@ -29,12 +29,13 @@ enum {
|
||||||
|
|
||||||
struct PacketQueue {
|
struct PacketQueue {
|
||||||
PacketQueue()
|
PacketQueue()
|
||||||
: first_pkt(NULL), last_pkt(NULL), nb_packets(0), size(0)
|
: first_pkt(NULL), last_pkt(NULL), flushing(false), nb_packets(0), size(0)
|
||||||
{ }
|
{ }
|
||||||
~PacketQueue()
|
~PacketQueue()
|
||||||
{ flush(); }
|
{ clear(); }
|
||||||
|
|
||||||
AVPacketList *first_pkt, *last_pkt;
|
AVPacketList *first_pkt, *last_pkt;
|
||||||
|
volatile bool flushing;
|
||||||
int nb_packets;
|
int nb_packets;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
|
@ -45,6 +46,7 @@ struct PacketQueue {
|
||||||
int get(AVPacket *pkt, VideoState *is);
|
int get(AVPacket *pkt, VideoState *is);
|
||||||
|
|
||||||
void flush();
|
void flush();
|
||||||
|
void clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VideoPicture {
|
struct VideoPicture {
|
||||||
|
@ -202,6 +204,8 @@ int PacketQueue::get(AVPacket *pkt, VideoState *is)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this->flushing)
|
||||||
|
break;
|
||||||
this->cond.wait(lock);
|
this->cond.wait(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,6 +213,12 @@ int PacketQueue::get(AVPacket *pkt, VideoState *is)
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketQueue::flush()
|
void PacketQueue::flush()
|
||||||
|
{
|
||||||
|
this->flushing = true;
|
||||||
|
this->cond.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketQueue::clear()
|
||||||
{
|
{
|
||||||
AVPacketList *pkt, *pkt1;
|
AVPacketList *pkt, *pkt1;
|
||||||
|
|
||||||
|
@ -401,7 +411,7 @@ public:
|
||||||
|
|
||||||
while(total < len)
|
while(total < len)
|
||||||
{
|
{
|
||||||
while(mFramePos >= mFrameSize)
|
if(mFramePos >= mFrameSize)
|
||||||
{
|
{
|
||||||
/* We have already sent all our data; get more */
|
/* We have already sent all our data; get more */
|
||||||
mFrameSize = audio_decode_frame(mFrame);
|
mFrameSize = audio_decode_frame(mFrame);
|
||||||
|
@ -413,6 +423,7 @@ public:
|
||||||
|
|
||||||
mFramePos = std::min<ssize_t>(mFrameSize, sample_skip);
|
mFramePos = std::min<ssize_t>(mFrameSize, sample_skip);
|
||||||
sample_skip -= mFramePos;
|
sample_skip -= mFramePos;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len1 = len - total;
|
size_t len1 = len - total;
|
||||||
|
@ -752,7 +763,10 @@ void VideoState::decode_thread_loop(VideoState *self)
|
||||||
else
|
else
|
||||||
av_free_packet(packet);
|
av_free_packet(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all done - wait for it */
|
/* all done - wait for it */
|
||||||
|
self->videoq.flush();
|
||||||
|
self->audioq.flush();
|
||||||
while(!self->quit)
|
while(!self->quit)
|
||||||
{
|
{
|
||||||
// EOF reached, all packets processed, we can exit now
|
// EOF reached, all packets processed, we can exit now
|
||||||
|
|
Loading…
Reference in a new issue