Files
oak-editor/app/codec/oiio/oiiodecoder.h
T
itsmattkc 490a634473 oiiodecoder: fixed segfault caused by some OIIO decoders if they received
unexpected data

When "probing" footage, Olive runs it past all of its decoders until one
responds that it can decode this file. However this caused issues when some
OIIO decoders would erroneously pick up incompatible files, try to read them
and segfault the entire app (notable OpenJPEG with MPEG-4 and RLA with WAVE
audio). We now use the file extension to check with OIIO if it "should" be
compatible before actually testing if it is.

This is not a "perfect" solution (i.e. someone could recreate the segfault by
renaming an MPEG-4 file to an image extension like .JPG), but is probably as
much as can be done Olive-side and should filter out all segfaults under normal
circumstances.
2020-01-26 11:54:49 +11:00

72 lines
1.5 KiB
C++

/***
Olive - Non-Linear Video Editor
Copyright (C) 2019 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef OIIODECODER_H
#define OIIODECODER_H
#include <OpenImageIO/imageio.h>
#include "codec/decoder.h"
#include "render/pixelservice.h"
class OIIODecoder : public Decoder
{
public:
OIIODecoder();
virtual QString id() override;
virtual bool Probe(Footage *f) override;
virtual bool Open() override;
virtual FramePtr RetrieveVideo(const rational &timecode) override;
virtual void Close() override;
virtual int64_t GetTimestampFromTime(const rational &time) override;
virtual bool SupportsVideo() override;
private:
#if OIIO_VERSION < 10903
OIIO::ImageInput* image_;
#else
std::unique_ptr<OIIO::ImageInput> image_;
#endif
int width_;
int height_;
PixelFormat::Format pix_fmt_;
PixelFormat::Info pix_fmt_info_;
bool is_rgba_;
FramePtr frame_;
static QStringList supported_formats_;
};
#endif // OIIODECODER_H