mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-05 19:19:44 +00:00
use unique_ptr instead
This commit is contained in:
parent
3b7cef9e88
commit
ed118537a8
1 changed files with 16 additions and 35 deletions
51
extern/osg-ffmpeg-videoplayer/videostate.cpp
vendored
51
extern/osg-ffmpeg-videoplayer/videostate.cpp
vendored
|
@ -38,36 +38,11 @@ namespace
|
||||||
const int MAX_AUDIOQ_SIZE = (5 * 16 * 1024);
|
const int MAX_AUDIOQ_SIZE = (5 * 16 * 1024);
|
||||||
const int MAX_VIDEOQ_SIZE = (5 * 256 * 1024);
|
const int MAX_VIDEOQ_SIZE = (5 * 256 * 1024);
|
||||||
|
|
||||||
class PacketGuard
|
struct AVPacketUnref
|
||||||
{
|
{
|
||||||
AVPacket mPacket;
|
void operator()(AVPacket* packet) const
|
||||||
bool mReleased;
|
|
||||||
public:
|
|
||||||
PacketGuard() : mReleased(false)
|
|
||||||
{
|
{
|
||||||
av_init_packet(&mPacket);
|
av_packet_unref(packet);
|
||||||
}
|
|
||||||
|
|
||||||
AVPacket* operator->()
|
|
||||||
{
|
|
||||||
return &mPacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVPacket* operator*()
|
|
||||||
{
|
|
||||||
return &mPacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVPacket* release()
|
|
||||||
{
|
|
||||||
mReleased = true;
|
|
||||||
return &mPacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
~PacketGuard()
|
|
||||||
{
|
|
||||||
if(!mReleased)
|
|
||||||
av_packet_unref(&mPacket);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -438,10 +413,12 @@ public:
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
VideoState* self = mVideoState;
|
VideoState* self = mVideoState;
|
||||||
PacketGuard packet;
|
AVPacket packetData;
|
||||||
|
av_init_packet(&packetData);
|
||||||
|
std::unique_ptr<AVPacket, AVPacketUnref> packet(&packetData, AVPacketUnref{});
|
||||||
std::unique_ptr<AVFrame, VideoPicture::AVFrameDeleter> pFrame{av_frame_alloc()};
|
std::unique_ptr<AVFrame, VideoPicture::AVFrameDeleter> pFrame{av_frame_alloc()};
|
||||||
|
|
||||||
while(self->videoq.get(*packet, self) >= 0)
|
while(self->videoq.get(packet.get(), self) >= 0)
|
||||||
{
|
{
|
||||||
if(packet->data == flush_pkt.data)
|
if(packet->data == flush_pkt.data)
|
||||||
{
|
{
|
||||||
|
@ -458,7 +435,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode video frame
|
// Decode video frame
|
||||||
int ret = avcodec_send_packet(self->video_ctx, *packet);
|
int ret = avcodec_send_packet(self->video_ctx, packet.get());
|
||||||
// EAGAIN is not expected
|
// EAGAIN is not expected
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Error decoding video frame");
|
throw std::runtime_error("Error decoding video frame");
|
||||||
|
@ -504,7 +481,9 @@ public:
|
||||||
VideoState* self = mVideoState;
|
VideoState* self = mVideoState;
|
||||||
|
|
||||||
AVFormatContext *pFormatCtx = self->format_ctx;
|
AVFormatContext *pFormatCtx = self->format_ctx;
|
||||||
PacketGuard packet;
|
AVPacket packetData;
|
||||||
|
av_init_packet(&packetData);
|
||||||
|
std::unique_ptr<AVPacket, AVPacketUnref> packet(&packetData, AVPacketUnref{});
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -587,7 +566,7 @@ public:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(av_read_frame(pFormatCtx, *packet) < 0)
|
if(av_read_frame(pFormatCtx, packet.get()) < 0)
|
||||||
{
|
{
|
||||||
if (self->audioq.nb_packets == 0 && self->videoq.nb_packets == 0 && self->pictq_size == 0)
|
if (self->audioq.nb_packets == 0 && self->videoq.nb_packets == 0 && self->pictq_size == 0)
|
||||||
self->mVideoEnded = true;
|
self->mVideoEnded = true;
|
||||||
|
@ -598,9 +577,11 @@ public:
|
||||||
|
|
||||||
// Is this a packet from the video stream?
|
// Is this a packet from the video stream?
|
||||||
if(self->video_st && packet->stream_index == self->video_st-pFormatCtx->streams)
|
if(self->video_st && packet->stream_index == self->video_st-pFormatCtx->streams)
|
||||||
self->videoq.put(packet.release());
|
self->videoq.put(packet.get());
|
||||||
else if(self->audio_st && packet->stream_index == self->audio_st-pFormatCtx->streams)
|
else if(self->audio_st && packet->stream_index == self->audio_st-pFormatCtx->streams)
|
||||||
self->audioq.put(packet.release());
|
self->audioq.put(packet.get());
|
||||||
|
else
|
||||||
|
av_packet_unref(packet.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(std::exception& e) {
|
catch(std::exception& e) {
|
||||||
|
|
Loading…
Reference in a new issue