tagparser/avc/avcinfo.h

205 lines
4.6 KiB
C++

#ifndef TAG_PARSER_AVCINFO_H
#define TAG_PARSER_AVCINFO_H
#include "../aspectratio.h"
#include "../margin.h"
#include "../size.h"
namespace CppUtilities {
class BinaryReader;
class BitReader;
} // namespace CppUtilities
namespace TagParser {
/*!
* \brief Type used to store unsigned integer values using golomb coding.
*/
using ugolomb = std::uint32_t;
/*!
* \brief Type used to store signed integer values using golomb coding.
*/
using sgolomb = std::int32_t;
struct TAG_PARSER_EXPORT TimingInfo {
constexpr TimingInfo();
std::uint32_t unitsInTick;
std::uint32_t timeScale;
std::uint8_t isPresent;
std::uint8_t fixedFrameRate;
constexpr std::int64_t defaultDuration() const;
};
constexpr TimingInfo::TimingInfo()
: unitsInTick(0)
, timeScale(0)
, isPresent(0)
, fixedFrameRate(0)
{
}
constexpr std::int64_t TimingInfo::defaultDuration() const
{
return 1000000000ll * unitsInTick / timeScale;
}
struct TAG_PARSER_EXPORT HrdParameters {
constexpr HrdParameters();
ugolomb cpbCount;
std::uint8_t bitRateScale;
std::uint8_t cpbSizeScale;
std::uint8_t initialCpbRemovalDelayLength;
std::uint8_t cpbRemovalDelayLength;
std::uint8_t cpbOutputDelayLength;
std::uint8_t timeOffsetLength;
void parse(CppUtilities::BitReader &reader);
};
constexpr HrdParameters::HrdParameters()
: cpbCount(0)
, bitRateScale(0)
, cpbSizeScale(0)
, initialCpbRemovalDelayLength(0)
, cpbRemovalDelayLength(0)
, cpbOutputDelayLength(0)
, timeOffsetLength(0)
{
}
struct TAG_PARSER_EXPORT SpsInfo {
constexpr SpsInfo();
ugolomb id;
std::uint8_t profileIndication;
std::uint8_t profileConstraints;
std::uint8_t levelIndication;
ugolomb chromaFormatIndication;
ugolomb pictureOrderCountType;
ugolomb log2MaxFrameNum;
ugolomb log2MaxPictureOrderCountLsb;
sgolomb offsetForNonRefPic;
sgolomb offsetForTopToBottomField;
ugolomb numRefFramesInPicOrderCntCycle;
std::uint8_t deltaPicOrderAlwaysZeroFlag;
std::uint8_t frameMbsOnly;
std::uint8_t vuiPresent;
AspectRatio pixelAspectRatio;
TimingInfo timingInfo;
Margin cropping;
Size pictureSize;
std::uint8_t hrdParametersPresent;
HrdParameters nalHrdParameters;
HrdParameters vclHrdParameters;
std::uint8_t pictureStructPresent;
std::uint16_t size;
static constexpr std::uint16_t minSize = 2;
void parse(CppUtilities::BinaryReader &reader, std::uint32_t maxSize);
};
constexpr SpsInfo::SpsInfo()
: id(0)
, profileIndication(0)
, profileConstraints(0)
, levelIndication(0)
, chromaFormatIndication(0)
, pictureOrderCountType(0)
, log2MaxFrameNum(0)
, log2MaxPictureOrderCountLsb(0)
, offsetForNonRefPic(0)
, offsetForTopToBottomField(0)
, numRefFramesInPicOrderCntCycle(0)
, deltaPicOrderAlwaysZeroFlag(0)
, frameMbsOnly(0)
, vuiPresent(0)
, hrdParametersPresent(0)
, pictureStructPresent(0)
, size(0)
{
}
struct TAG_PARSER_EXPORT PpsInfo {
constexpr PpsInfo();
ugolomb id;
ugolomb spsId;
std::uint8_t picOrderPresent;
std::uint16_t size;
static constexpr std::uint16_t minSize = 2;
void parse(CppUtilities::BinaryReader &reader, std::uint32_t maxSize);
};
constexpr PpsInfo::PpsInfo()
: id(0)
, spsId(0)
, picOrderPresent(false)
, size(0)
{
}
struct TAG_PARSER_EXPORT SliceInfo {
constexpr SliceInfo();
std::uint8_t naluType;
std::uint8_t naluRefIdc;
std::uint8_t type;
std::uint8_t ppsId;
std::uint32_t frameNum;
bool fieldPicFlag;
bool bottomFieldFlag;
std::uint32_t idrPicId;
std::uint32_t picOrderCntLsb;
std::uint32_t deltaPicOrderCntBottom;
std::uint32_t deltaPicOrderCnt[2];
std::uint32_t firstMbInSlice;
std::uint32_t sps;
std::uint32_t pps;
};
constexpr SliceInfo::SliceInfo()
: naluType(0)
, naluRefIdc(0)
, type(0)
, ppsId(0)
, frameNum(0)
, fieldPicFlag(false)
, bottomFieldFlag(false)
, idrPicId(0)
, picOrderCntLsb(0)
, deltaPicOrderCntBottom(0)
, deltaPicOrderCnt{ 0, 0 }
, firstMbInSlice(0)
, sps(0)
, pps(0)
{
}
struct TAG_PARSER_EXPORT AvcFrame {
constexpr AvcFrame();
std::uint64_t start;
std::uint64_t end;
std::uint64_t ref1;
std::uint64_t ref2;
SliceInfo sliceInfo;
std::uint32_t presentationOrder;
std::uint32_t decodeOrder;
bool keyframe;
bool hasProvidedTimecode;
};
constexpr AvcFrame::AvcFrame()
: start(0)
, end(0)
, ref1(0)
, ref2(0)
, presentationOrder(0)
, decodeOrder(0)
, keyframe(false)
, hasProvidedTimecode(false)
{
}
} // namespace TagParser
#endif // TAG_PARSER_AVCINFO_H