You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.1 KiB
C++
187 lines
6.1 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
#pragma once
|
|
|
|
#include "exif.hpp"
|
|
#include "exiv2lib_export.h"
|
|
#include "image.hpp"
|
|
|
|
namespace Exiv2 {
|
|
|
|
// *****************************************************************************
|
|
// class definitions
|
|
|
|
/*!
|
|
@brief Class to access RIFF video files.
|
|
*/
|
|
class EXIV2API RiffVideo : public Image {
|
|
public:
|
|
//! @name Creators
|
|
//@{
|
|
/*!
|
|
@brief Constructor for a Riff video. Since the constructor
|
|
can not return a result, callers should check the good() method
|
|
after object construction to determine success or failure.
|
|
@param io An auto-pointer that owns a BasicIo instance used for
|
|
reading and writing image metadata. \b Important: The constructor
|
|
takes ownership of the passed in BasicIo instance through the
|
|
auto-pointer. Callers should not continue to use the BasicIo
|
|
instance after it is passed to this method. Use the Image::io()
|
|
method to get a temporary reference.
|
|
*/
|
|
explicit RiffVideo(BasicIo::UniquePtr io);
|
|
//@}
|
|
|
|
//! @name Manipulators
|
|
//@{
|
|
void readMetadata() override;
|
|
void writeMetadata() override;
|
|
//@}
|
|
|
|
//! @name Accessors
|
|
//@{
|
|
[[nodiscard]] std::string mimeType() const override;
|
|
//@}
|
|
|
|
protected:
|
|
class HeaderReader {
|
|
std::string id_;
|
|
uint64_t size_ = 0;
|
|
|
|
public:
|
|
explicit HeaderReader(const BasicIo::UniquePtr& io);
|
|
|
|
[[nodiscard]] uint64_t getSize() const {
|
|
return size_;
|
|
}
|
|
|
|
[[nodiscard]] const std::string& getId() const {
|
|
return id_;
|
|
}
|
|
};
|
|
|
|
void readList(const HeaderReader& header_);
|
|
|
|
void readChunk(const HeaderReader& header_);
|
|
|
|
void decodeBlocks();
|
|
|
|
private:
|
|
static bool equal(const std::string& str1, const std::string& str2);
|
|
|
|
/*!
|
|
@brief Interpret MainAVIHeader (avih) structure, and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readAviHeader();
|
|
|
|
/*!
|
|
@brief Interpret stream header list element (strh), and save it in the respective XMP container.
|
|
*/
|
|
void readStreamHeader();
|
|
|
|
/*!
|
|
@brief Interpret stream header list element (strf), and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readStreamFormat(uint64_t size_);
|
|
|
|
/*!
|
|
@brief Interpret Additional header data (strd), and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readStreamData(uint64_t size_);
|
|
|
|
/*!
|
|
@brief Interpret stream header list element (strn) , and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void StreamName(uint64_t size_);
|
|
/*!
|
|
@brief Interpret INFO List Chunk, and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readInfoListChunk(uint64_t size_);
|
|
|
|
/*!
|
|
@brief Interpret Riff Stream Data tag information, and save it in the respective XMP container.
|
|
The Movi - Lists contain Video, Audio, Subtitle and (secondary) index data. Those can be grouped into rec - Lists.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readMoviList(uint64_t size_);
|
|
/*!
|
|
@brief Interpret Video Properties Header chunk, and save it in the respective XMP container.
|
|
The video properties header identifies video signal properties associated with a digital video stream in an AVI file
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readVPRPChunk(uint64_t size_);
|
|
/*!
|
|
@brief Interpret Riff INdex Chunk, and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readIndexChunk(uint64_t size_);
|
|
/*!
|
|
@brief Interpret Riff Stream Chunk, and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readDataChunk(uint64_t size_);
|
|
/*!
|
|
@brief Interpret Junk Chunk and save it in the respective XMP container.
|
|
@param size Size of the data block used to store Tag Information.
|
|
*/
|
|
void readJunk(uint64_t size_);
|
|
|
|
static std::string getStreamType(uint32_t stream);
|
|
/*!
|
|
@brief Calculates Duration of a video, and stores it in the respective XMP container.
|
|
@param frame_rate Frame rate of the video.
|
|
@param frame_count Total number of frames present in the video.
|
|
*/
|
|
void fillDuration(double frame_rate, size_t frame_count);
|
|
|
|
/*!
|
|
@brief Calculates Aspect Ratio of a video, and stores it in the respective XMP container.
|
|
@param width Width of the video.
|
|
@param height Height of the video.
|
|
*/
|
|
void fillAspectRatio(size_t width, size_t height);
|
|
|
|
static constexpr auto CHUNK_HEADER_ICCP = "ICCP";
|
|
static constexpr auto CHUNK_HEADER_EXIF = "EXIF";
|
|
static constexpr auto CHUNK_HEADER_XMP = "XMP ";
|
|
|
|
/* Chunk header names */
|
|
static constexpr auto CHUNK_ID_MOVI = "MOVI";
|
|
static constexpr auto CHUNK_ID_DATA = "DATA";
|
|
static constexpr auto CHUNK_ID_HDRL = "HDRL";
|
|
static constexpr auto CHUNK_ID_STRL = "STRL";
|
|
static constexpr auto CHUNK_ID_LIST = "LIST";
|
|
static constexpr auto CHUNK_ID_JUNK = "JUNK";
|
|
static constexpr auto CHUNK_ID_AVIH = "AVIH";
|
|
static constexpr auto CHUNK_ID_STRH = "STRH";
|
|
static constexpr auto CHUNK_ID_STRF = "STRF";
|
|
static constexpr auto CHUNK_ID_FMT = "FMT ";
|
|
static constexpr auto CHUNK_ID_STRN = "STRN";
|
|
static constexpr auto CHUNK_ID_STRD = "STRD";
|
|
static constexpr auto CHUNK_ID_IDIT = "IDIT";
|
|
static constexpr auto CHUNK_ID_INFO = "INFO";
|
|
static constexpr auto CHUNK_ID_NCDT = "NCDT";
|
|
static constexpr auto CHUNK_ID_ODML = "ODML";
|
|
static constexpr auto CHUNK_ID_VPRP = "VPRP";
|
|
static constexpr auto CHUNK_ID_IDX1 = "IDX1";
|
|
|
|
int streamType_{};
|
|
|
|
}; // Class RiffVideo
|
|
|
|
/*
|
|
@brief Create a new RiffVideo instance and return an auto-pointer to it.
|
|
Caller owns the returned object and the auto-pointer ensures that
|
|
it will be deleted.
|
|
*/
|
|
EXIV2API Image::UniquePtr newRiffInstance(BasicIo::UniquePtr io, bool create);
|
|
|
|
//! Check if the file iIo is a Riff Video.
|
|
EXIV2API bool isRiffType(BasicIo& iIo, bool advance);
|
|
|
|
} // namespace Exiv2
|