mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 06:06:00 -06:00
121 lines
No EOL
2.4 KiB
C++
121 lines
No EOL
2.4 KiB
C++
#include <CtrlLib/CtrlLib.h>
|
|
|
|
using namespace Upp;
|
|
|
|
#include "MediaPlayer.h"
|
|
#include "utility.h"
|
|
#include "mediaplayer_in.h"
|
|
|
|
|
|
PacketQueue::PacketQueue()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
void PacketQueue::Init()
|
|
{
|
|
first_pkt = last_pkt = 0;
|
|
nb_packets = size = 0;
|
|
abort_request = false;
|
|
//mutex = 0;
|
|
//cond = 0;
|
|
}
|
|
|
|
void PacketQueue::Init(AVPacket &pkt, AVPacket *flush_pkt)
|
|
{
|
|
Init();
|
|
//mutex = SDL_CreateMutex();
|
|
//cond = SDL_CreateCond();
|
|
Put(&pkt, flush_pkt);
|
|
}
|
|
|
|
void PacketQueue::Flush()
|
|
{
|
|
AVPacketList *pkt, *pkt1;
|
|
|
|
INTERLOCKED_(mutex) {
|
|
for(pkt = first_pkt; pkt != NULL; pkt = pkt1) {
|
|
pkt1 = pkt->next;
|
|
av_free_packet(&pkt->pkt);
|
|
av_freep(&pkt);
|
|
}
|
|
first_pkt = last_pkt = 0;
|
|
nb_packets = size = 0;
|
|
}
|
|
}
|
|
|
|
void PacketQueue::End()
|
|
{
|
|
Flush();
|
|
//SDL_DestroyMutex(mutex);
|
|
//SDL_DestroyCond(cond);
|
|
}
|
|
|
|
int PacketQueue::Put(AVPacket *pkt, AVPacket *flush_pkt)
|
|
{
|
|
AVPacketList *pkt1;
|
|
|
|
// Duplicate the packet
|
|
if (pkt != flush_pkt && av_dup_packet(pkt) < 0)
|
|
return -1;
|
|
|
|
pkt1 = (AVPacketList*)av_malloc(sizeof(AVPacketList));
|
|
if (!pkt1)
|
|
return -1;
|
|
pkt1->pkt = *pkt;
|
|
pkt1->next = NULL;
|
|
|
|
INTERLOCKED_(mutex) {
|
|
if (!last_pkt)
|
|
first_pkt = pkt1;
|
|
else
|
|
last_pkt->next = pkt1;
|
|
last_pkt = pkt1;
|
|
nb_packets++;
|
|
size += pkt1->pkt.size + sizeof(*pkt1);
|
|
// Should duplicate packet data in DV case
|
|
cond.Signal();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void PacketQueue::Abort()
|
|
{
|
|
INTERLOCKED_(mutex) {
|
|
abort_request = true;
|
|
cond.Signal();
|
|
}
|
|
}
|
|
|
|
// return < 0 if aborted, 0 if no packet and > 0 if packet.
|
|
int PacketQueue::Get(AVPacket *pkt, bool decodeEnd)
|
|
{
|
|
AVPacketList *pkt1;
|
|
int ret;
|
|
|
|
INTERLOCKED_(mutex) {
|
|
for(;;) {
|
|
if (abort_request) {
|
|
ret = -1;
|
|
break;
|
|
}
|
|
pkt1 = first_pkt;
|
|
if (pkt1) {
|
|
first_pkt = pkt1->next;
|
|
if (!first_pkt)
|
|
last_pkt = NULL;
|
|
nb_packets--;
|
|
size -= pkt1->pkt.size + sizeof(*pkt1);
|
|
*pkt = pkt1->pkt;
|
|
av_free(pkt1);
|
|
ret = 1;
|
|
break;
|
|
} else if (decodeEnd) {
|
|
ret = 0;
|
|
break;
|
|
} else
|
|
cond.Wait(mutex);
|
|
}
|
|
}
|
|
return ret;
|
|
} |