203 lines
4.6 KiB
C++
203 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;
|
|
|
|
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;
|
|
|
|
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
|