p26001-store-acs-soc-fw-app/video/core/SampleFormat.cpp
2026-09-28 21:33:04 +08:00

119 lines
3.4 KiB
C++

/*
*******************************************************************************
* INCLUDE
*******************************************************************************
*/
#include "SampleFormat.h"
namespace Video
{
namespace Core
{
/*
*******************************************************************************
* TYPEDEFS
*******************************************************************************
*/
struct SampleFormatInfo
{
std::string name;
int bits;
bool isPlanar;
SampleFormat altFormat;
};
/*
*******************************************************************************
* LOCAL VARIABLES
*******************************************************************************
*/
static const SampleFormatInfo sampleFormatInfo[(int)SampleFormat::NB] = {
{"u8", 8, false, SampleFormat::U8P}, {"s16", 16, false, SampleFormat::S16P},
{"s32", 32, false, SampleFormat::S32P}, {"s64", 64, false, SampleFormat::S64P},
{"flt", 32, false, SampleFormat::FLTP}, {"dbl", 64, false, SampleFormat::DBLP},
{"u8p", 8, true, SampleFormat::U8}, {"s16p", 16, true, SampleFormat::S16},
{"s32p", 32, true, SampleFormat::S32}, {"s64p", 64, true, SampleFormat::S64},
{"fltp", 32, true, SampleFormat::FLT}, {"dblp", 64, true, SampleFormat::DBL},
};
static const std::string UNKNOWN = "UNKNOWN";
/*
*******************************************************************************
* LOCAL FUNCTIONS
*******************************************************************************
*/
static inline bool isSampleFormatValid(SampleFormat format)
{
return ((int)format >= 0 && format < SampleFormat::NB);
}
/*
*******************************************************************************
* FUNCTIONS
*******************************************************************************
*/
const std::string& sampleFormatName(SampleFormat format)
{
if (isSampleFormatValid(format))
return sampleFormatInfo[(int)format].name;
return UNKNOWN;
}
int sampleFormatBitWidth(SampleFormat format)
{
if (isSampleFormatValid(format))
return sampleFormatInfo[(int)format].bits;
return 0;
}
int sampleFormatBytesPerSample(SampleFormat format)
{
if (isSampleFormatValid(format))
return sampleFormatInfo[(int)format].bits >> 3;
return 0;
}
bool sampleFormatIsPlanar(SampleFormat format)
{
if (isSampleFormatValid(format))
return sampleFormatInfo[(int)format].isPlanar;
return false;
}
int sampleFormatCalcLineSize(SampleFormat format, ChannelLayout layout, int samples)
{
int size = sampleFormatBytesPerSample(format) * samples;
if (!sampleFormatIsPlanar(format))
size *= channelLayoutChannels(layout);
return size;
}
SampleFormat sampleFormatGetPackedFormat(SampleFormat format)
{
if (!isSampleFormatValid(format))
return SampleFormat::NONE;
if (!sampleFormatIsPlanar(format))
return format;
return sampleFormatInfo[(int)format].altFormat;
}
SampleFormat sampleFormatGetPlanarFormat(SampleFormat format)
{
if (!isSampleFormatValid(format))
return SampleFormat::NONE;
if (sampleFormatIsPlanar(format))
return format;
return sampleFormatInfo[(int)format].altFormat;
}
}
}