mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-06 00:55:50 +00:00
Use unique_ptr with custom deleter for VideoPicture::rgbaFrame
This commit is contained in:
parent
b7076549a3
commit
eb93fdfbea
20
extern/osg-ffmpeg-videoplayer/videostate.cpp
vendored
20
extern/osg-ffmpeg-videoplayer/videostate.cpp
vendored
@ -156,6 +156,12 @@ void PacketQueue::clear()
|
||||
this->mutex.unlock ();
|
||||
}
|
||||
|
||||
void VideoPicture::AVFrameDeleter::operator()(AVFrame* frame) const
|
||||
{
|
||||
av_freep(frame->data);
|
||||
av_frame_free(&frame);
|
||||
}
|
||||
|
||||
int VideoState::istream_read(void *user_data, uint8_t *buf, int buf_size)
|
||||
{
|
||||
try
|
||||
@ -623,8 +629,9 @@ int VideoState::stream_open(int stream_index, AVFormatContext *pFormatCtx)
|
||||
}
|
||||
|
||||
// Allocate RGBA frame queue.
|
||||
for (std::size_t i = 0; i < VIDEO_PICTURE_ARRAY_SIZE; ++i) {
|
||||
AVFrame *frame = av_frame_alloc();
|
||||
for (std::size_t i = 0; i < VIDEO_PICTURE_ARRAY_SIZE; ++i)
|
||||
{
|
||||
std::unique_ptr<AVFrame, VideoPicture::AVFrameDeleter> frame{av_frame_alloc()};
|
||||
if (frame == nullptr) {
|
||||
std::cerr << "av_frame_alloc failed" << std::endl;
|
||||
return -1;
|
||||
@ -638,7 +645,7 @@ int VideoState::stream_open(int stream_index, AVFormatContext *pFormatCtx)
|
||||
std::cerr << "av_image_alloc failed" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
this->pictq[i].rgbaFrame = frame;
|
||||
this->pictq[i].rgbaFrame = std::move(frame);
|
||||
}
|
||||
|
||||
this->video_thread.reset(new VideoThread(this));
|
||||
@ -784,11 +791,8 @@ void VideoState::deinit()
|
||||
}
|
||||
|
||||
// Dellocate RGBA frame queue.
|
||||
for (std::size_t i = 0; i < VIDEO_PICTURE_ARRAY_SIZE; ++i) {
|
||||
if (this->pictq[i].rgbaFrame == nullptr) continue;
|
||||
av_freep(&this->pictq[i].rgbaFrame->data[0]);
|
||||
av_frame_free(&this->pictq[i].rgbaFrame);
|
||||
}
|
||||
for (std::size_t i = 0; i < VIDEO_PICTURE_ARRAY_SIZE; ++i)
|
||||
this->pictq[i].rgbaFrame = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
6
extern/osg-ffmpeg-videoplayer/videostate.hpp
vendored
6
extern/osg-ffmpeg-videoplayer/videostate.hpp
vendored
@ -95,7 +95,11 @@ struct VideoPicture {
|
||||
VideoPicture() : pts(0.0)
|
||||
{ }
|
||||
|
||||
AVFrame* rgbaFrame = nullptr;
|
||||
struct AVFrameDeleter {
|
||||
void operator()(AVFrame* frame) const;
|
||||
};
|
||||
|
||||
std::unique_ptr<AVFrame, AVFrameDeleter> rgbaFrame;
|
||||
double pts;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user