1
0
Fork 1
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:
scrawl 2012-12-16 16:59:49 +01:00
commit df9121f7fc

View file

@ -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