Я добавляю ответ на свой вопрос.
Надеюсь увидеть лучший ответ...
Я нашел решение, используя две функции IPP:
Я выбрал функции, использующие математику с фиксированной точкой, для лучшей производительности.
- Реализация фиксированной точки
0.859
масштабирования выполняется путем расширения, масштабирования и смещения. Пример: b = (a*scale + (1<<7)) >> 8;
[Когда scale
= (0.859)*2^8
].
Параметр val
для ippsMulC_8u_Sfs
устанавливается равным round(0.859*2^8)
= 220
.
Параметр scaleFactor
для ippsMulC_8u_Sfs
устанавливается равным 8
(разделите масштабированный результат на 2^8
).
Пример кода:
void GrayscaleToNV12(const unsigned char I[],
int image_width,
int image_height,
unsigned char J[])
{
IppStatus ipp_status;
const int image_size = image_width*image_height;
unsigned char *UV = &J[image_size]; //In NV12 format, UV plane starts below Y.
const Ipp8u expanded_scaling = (Ipp8u)(0.859 * 256.0 + 0.5);
//J[x] = (expanded_scaling * I[x] + 128u) >> 8u;
ipp_status = ippsMulC_8u_Sfs(I, //const Ipp8u* pSrc,
expanded_scaling, //Ipp8u val,
J, //Ipp8u* pDst,
image_size, //int len,
8); //int scaleFactor);
//Check ipp_status, and handle errors...
//J[x] += 16;
//ippsAddC_8u_ISfs is deprecated, I used it to keep the code simple.
ipp_status = ippsAddC_8u_ISfs(16, //Ipp8u val,
J, //Ipp8u* pSrcDst,
image_size, //int len,
0); //int scaleFactor);
//Check ipp_status, and handle errors...
//2. Fill all UV plane with 128 value - "gray color".
memset(UV, 128, image_width*image_height/2);
}
Примечание не по теме.
Существует способ пометить видеопоток как "полный диапазон" (где Y
диапазон равен [0, 255] вместо [16
, 235
] и U
, Диапазон V
также равен [0, 255]).
Использование стандарта "полный диапазон" позволяет разместить I
вместо Y
(т. е. Y = I).
Пометка потока как «полного диапазона» с помощью Intel Media SDK возможна (но недостаточно документирована).
Чтобы пометить поток H.264 как «полный диапазон», необходимо добавить указатель на список mfxExtBuffer **ExtParam
(в структуре mfxVideoParam
):
Указатель на структуру типа mfxExtVideoSignalInfo
нужно добавить со следующими значениями:
typedef struct {
mfxExtBuffer Header; //MFX_EXTBUFF_VIDEO_SIGNAL_INFO and sizeof(mfxExtVideoSignalInfo)
mfxU16 VideoFormat; //Most likely 5 ("Unspecified video format")
mfxU16 VideoFullRange; //1 (video_full_range_flag is equal to 1)
mfxU16 ColourDescriptionPresent; //0 (description_present_flag equal to 0)
mfxU16 ColourPrimaries; //0 (no affect when ColourDescriptionPresent = 0)
mfxU16 TransferCharacteristics; //0 (no affect when ColourDescriptionPresent = 0)
mfxU16 MatrixCoefficients; //0 (no affect when ColourDescriptionPresent = 0)
} mfxExtVideoSignalInfo;
VideoFullRange = 1
— единственный важный параметр настройки «полного диапазона» видео, но мы должны заполнить всю структуру.
person
Rotem
schedule
26.06.2016
MFX_CHROMAFORMAT_MONOCHROME
? - person apalopohapa   schedule 11.02.2017