119 lines
3.4 KiB
C++
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;
|
|
}
|
|
}
|
|
}
|