libvmx
VMX Codec
Loading...
Searching...
No Matches
vmxcodec.h
Go to the documentation of this file.
1/*
2* MIT License
3*
4* Copyright (c) 2025 Open Media Transport Contributors
5*
6* Permission is hereby granted, free of charge, to any person obtaining a copy
7* of this software and associated documentation files (the "Software"), to deal
8* in the Software without restriction, including without limitation the rights
9* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10* copies of the Software, and to permit persons to whom the Software is
11* furnished to do so, subject to the following conditions:
12*
13* The above copyright notice and this permission notice shall be included in all
14* copies or substantial portions of the Software.
15*
16* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22* SOFTWARE.
23*
24*/
25
26#pragma once
27#include <cstdint>
28#include <cstring>
29#include "thread_tasks.h"
30#ifdef _MSC_VER
31#define VMX_API __declspec(dllexport)
32#else
33#define VMX_API extern "C" __attribute__((visibility("default")))
34#endif
35#if defined(_M_ARM64) | defined(__arm64) | defined(__aarch64__)
36#define ARM64
37#endif
38#if defined(_M_X64) | defined(__x86_64__)
39#define X64
40#define AVX2 //Include AVX2 in all Intel builds as these functions will be dynamically called only if instruction set available.
41#endif
42
43const int VMX_SLICE_HEIGHT = 16;
44const int VMX_QUALITY_COUNT = 25;
45const int VMX_MAX_PLANES = 4;
46
47typedef unsigned long long buffer_t;
48typedef unsigned char BYTE;
49
50typedef struct {
51 int width;
52 int height;
53} VMX_SIZE;
54
59
69
79
89
96
109
111{
112 unsigned char* Stream;
113 unsigned char* StreamPos;
116 //buffer_t BitsLeft;
117 int BitsLeft; //Bad data may lead to wraparound if unsigned. Going negative is preferred
121};
122
124{
128 int Offset16[VMX_MAX_PLANES]; //Offset for working with 16bit data
129 VMX_SIZE PixelSize; //Size in pixels of the slice, for copying from source image data. Due to alignment last slice will be only 8 pixels height for 1080 for example.
130 VMX_SIZE PixelSizeInterlaced; //Same as above but for second field alignment adjustment at the mid point.
131 int LowerField; //=1 when this is a lower field slice
132 __declspec(align(64)) short TempBlock[128];
133 __declspec(align(64)) short TempBlock2[128];
134 __declspec(align(64)) short TempBlock3[128];
135};
136
138{
139 int Index;
141 int Stride; //Double this when dealing with 16bit data
144};
145
192
195
196//Public exports
197
205
210
219VMX_API void VMX_SetQuality(VMX_INSTANCE* instance, int q);
220
230
239VMX_API void VMX_GetEncodingParameters(VMX_INSTANCE* instance, int* frameMin, int* frameMax, int* minQuality, int* dcShift);
240
252VMX_API void VMX_SetEncodingParameters(VMX_INSTANCE* instance, int frameMin, int frameMax, int minQuality, int dcShift);
253
263VMX_API VMX_ERR VMX_DecodeBGRA(VMX_INSTANCE* instance, BYTE* dst, int stride);
264
272VMX_API VMX_ERR VMX_DecodeBGRX(VMX_INSTANCE* instance, BYTE* dst, int stride);
273
285VMX_API VMX_ERR VMX_DecodeP216(VMX_INSTANCE* instance, BYTE* dst, int stride);
286
298VMX_API VMX_ERR VMX_DecodePA16(VMX_INSTANCE* instance, BYTE* dst, int stride);
299
307VMX_API VMX_ERR VMX_DecodeUYVY(VMX_INSTANCE* instance, BYTE* dst, int stride);
308
316VMX_API VMX_ERR VMX_DecodeUYVA(VMX_INSTANCE* instance, BYTE* dst, int stride);
317
325VMX_API VMX_ERR VMX_DecodeYUY2(VMX_INSTANCE* instance, BYTE* dst, int stride);
326
341
349
357
365
373
374
385VMX_API VMX_ERR VMX_EncodeBGRA(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
386
394VMX_API VMX_ERR VMX_EncodeBGRX(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
395
403VMX_API VMX_ERR VMX_EncodeUYVY(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
404
415VMX_API VMX_ERR VMX_EncodeUYVA(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
416
424VMX_API VMX_ERR VMX_EncodeYUY2(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
425
435VMX_API VMX_ERR VMX_EncodeNV12(VMX_INSTANCE* instance, BYTE* srcY, int srcStrideY, BYTE* srcUV, int srcStrideUV, int interlaced);
436
448VMX_API VMX_ERR VMX_EncodeYV12(VMX_INSTANCE* instance, BYTE* srcY, int srcStrideY, BYTE* srcU, int srcStrideU, BYTE* srcV, int srcStrideV, int interlaced);
449
462VMX_API VMX_ERR VMX_EncodeP216(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
463
476VMX_API VMX_ERR VMX_EncodePA16(VMX_INSTANCE* instance, BYTE* src, int stride, int interlaced);
477
478
479VMX_API VMX_ERR VMX_EncodePlanar(VMX_INSTANCE* instance, int interlaced);
480
487VMX_API VMX_ERR VMX_LoadFrom(VMX_INSTANCE* instance, BYTE* data, int dataLen);
488
495VMX_API int VMX_SaveTo(VMX_INSTANCE* instance, BYTE* dst, int maxLen);
496
501
510VMX_API void VMX_BGRXToUYVY(BYTE* pSrc, int srcStride, BYTE* pDst, int dstStride, VMX_SIZE size);
511
529VMX_API int VMX_BGRXToUYVYConditional(BYTE* pSrc, BYTE* pSrcPrev, int srcStride, BYTE* pDst, int dstStride, VMX_SIZE size);
530
536VMX_API float VMX_CalculatePSNR(BYTE* p1, BYTE* p2, int stride, int bytesPerPixel, VMX_SIZE sz);
537
543
549VMX_API void VMX_SetThreads(VMX_INSTANCE* instance, int numThreads);
550
551VMX_API int VMX_Test(VMX_INSTANCE* instance, short* src, short* dst);
552//Private functions
555
556
Definition thread_tasks.h:101
Definition vmxcodec.h:147
int AlignedHeight
Definition vmxcodec.h:169
VMX_SLICE_SET ** Slices
Definition vmxcodec.h:170
VMX_PROFILE Profile
Definition vmxcodec.h:150
int Threads
Definition vmxcodec.h:173
int ImageStrideA
Definition vmxcodec.h:188
int ImageStrideU
Definition vmxcodec.h:182
int ImageStride
Definition vmxcodec.h:179
unsigned short * EncodeMatrix256
Definition vmxcodec.h:165
ThreadTasks * Tasks
Definition vmxcodec.h:174
VMX_COLORSPACE ColorSpace
Definition vmxcodec.h:151
unsigned short * EncodeQualityPresets256[VMX_QUALITY_COUNT]
Definition vmxcodec.h:163
unsigned short * DecodeMatrix256
Definition vmxcodec.h:164
BYTE * ImageDataV
Definition vmxcodec.h:184
BYTE * ImageDataA
Definition vmxcodec.h:187
VMX_SIZE PreviewSizeInterlaced
Definition vmxcodec.h:176
VMX_PLANE Planes[VMX_MAX_PLANES]
Definition vmxcodec.h:167
VMX_FORMAT Format
Definition vmxcodec.h:149
int Quality
Definition vmxcodec.h:153
VMX_IMAGE_FORMAT ImageFormat
Definition vmxcodec.h:190
BYTE * ImageDataU
Definition vmxcodec.h:181
int avx2
Definition vmxcodec.h:148
int ImageStrideV
Definition vmxcodec.h:185
int DCShift
Definition vmxcodec.h:155
int SliceCount
Definition vmxcodec.h:168
unsigned short * EncodeQualityPresets[VMX_QUALITY_COUNT]
Definition vmxcodec.h:158
unsigned short * DecodeMatrix
Definition vmxcodec.h:159
BYTE * ImageData
Definition vmxcodec.h:178
int TargetBytesPerFrameMin
Definition vmxcodec.h:171
int MinQuality
Definition vmxcodec.h:154
VMX_SIZE PreviewSize
Definition vmxcodec.h:175
unsigned short * DecodeQualityPresets256[VMX_QUALITY_COUNT]
Definition vmxcodec.h:162
unsigned short * EncodeMatrix
Definition vmxcodec.h:160
unsigned short * DecodeQualityPresets[VMX_QUALITY_COUNT]
Definition vmxcodec.h:157
int TargetBytesPerFrameMax
Definition vmxcodec.h:172
Definition vmxcodec.h:138
int Index
Definition vmxcodec.h:139
BYTE * DataLowerPreview
Definition vmxcodec.h:143
int Stride
Definition vmxcodec.h:141
VMX_SIZE Size
Definition vmxcodec.h:140
BYTE * Data
Definition vmxcodec.h:142
Definition vmxcodec.h:50
int width
Definition vmxcodec.h:51
int height
Definition vmxcodec.h:52
Definition vmxcodec.h:111
buffer_t TempRead
Definition vmxcodec.h:119
unsigned char * Stream
Definition vmxcodec.h:112
unsigned char * StreamPos
Definition vmxcodec.h:113
int MaxStreamLength
Definition vmxcodec.h:114
int StreamLength
Definition vmxcodec.h:115
int BitsLeft
Definition vmxcodec.h:117
VMX_SIZE Size[3]
Definition vmxcodec.h:120
buffer_t Temp
Definition vmxcodec.h:118
Definition vmxcodec.h:124
int LowerField
Definition vmxcodec.h:131
VMX_SLICE_DATA DC
Definition vmxcodec.h:125
int Offset16[VMX_MAX_PLANES]
Definition vmxcodec.h:128
__declspec(align(64)) short TempBlock[128]
VMX_SLICE_DATA AC
Definition vmxcodec.h:126
VMX_SIZE PixelSizeInterlaced
Definition vmxcodec.h:130
VMX_SIZE PixelSize
Definition vmxcodec.h:129
int Offset[VMX_MAX_PLANES]
Definition vmxcodec.h:127
VMX_API VMX_ERR VMX_EncodeUYVA(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
VMX_API VMX_ERR VMX_DecodePA16(VMX_INSTANCE *instance, BYTE *dst, int stride)
#define VMX_API
Definition vmxcodec.h:33
VMX_API int VMX_SaveTo(VMX_INSTANCE *instance, BYTE *dst, int maxLen)
VMX_FORMAT
Definition vmxcodec.h:55
@ VMX_FORMAT_INTERLACED
Definition vmxcodec.h:57
@ VMX_FORMAT_PROGRESSIVE
Definition vmxcodec.h:56
VMX_API void VMX_BGRXToUYVY(BYTE *pSrc, int srcStride, BYTE *pDst, int dstStride, VMX_SIZE size)
VMX_API VMX_ERR VMX_DecodePreviewBGRA(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API int VMX_GetThreads(VMX_INSTANCE *instance)
const int VMX_DECODE_MATRIX_COUNT
Definition vmxcodec.h:193
unsigned char BYTE
Definition vmxcodec.h:48
VMX_API int VMX_BGRXToUYVYConditional(BYTE *pSrc, BYTE *pSrcPrev, int srcStride, BYTE *pDst, int dstStride, VMX_SIZE size)
VMX_API VMX_ERR VMX_EncodeBGRA(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
void VMX_ResetData(VMX_SLICE_DATA *s)
VMX_API VMX_ERR VMX_DecodeUYVA(VMX_INSTANCE *instance, BYTE *dst, int stride)
const int VMX_MAX_PLANES
Definition vmxcodec.h:45
VMX_API VMX_ERR VMX_DecodeUYVY(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API void VMX_SetEncodingParameters(VMX_INSTANCE *instance, int frameMin, int frameMax, int minQuality, int dcShift)
VMX_API float VMX_CalculatePSNR(BYTE *p1, BYTE *p2, int stride, int bytesPerPixel, VMX_SIZE sz)
VMX_API VMX_ERR VMX_LoadFrom(VMX_INSTANCE *instance, BYTE *data, int dataLen)
VMX_API VMX_ERR VMX_EncodeBGRX(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
VMX_COLORSPACE
Definition vmxcodec.h:84
@ VMX_COLORSPACE_BT709
Definition vmxcodec.h:87
@ VMX_COLORSPACE_UNDEFINED
Definition vmxcodec.h:85
@ VMX_COLORSPACE_BT601
Definition vmxcodec.h:86
VMX_API VMX_ERR VMX_DecodePreviewYUY2(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API void VMX_SetThreads(VMX_INSTANCE *instance, int numThreads)
VMX_API VMX_ERR VMX_EncodeYV12(VMX_INSTANCE *instance, BYTE *srcY, int srcStrideY, BYTE *srcU, int srcStrideU, BYTE *srcV, int srcStrideV, int interlaced)
VMX_API void VMX_Destroy(VMX_INSTANCE *instance)
const int VMX_ENCODE_MATRIX_COUNT
Definition vmxcodec.h:194
VMX_API VMX_ERR VMX_EncodePA16(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
const int VMX_SLICE_HEIGHT
Definition vmxcodec.h:43
VMX_CODEC_FORMAT
Definition vmxcodec.h:90
@ VMX_CODEC_FORMAT_EXTENDED
Definition vmxcodec.h:94
@ VMX_CODEC_FORMAT_NONE
Definition vmxcodec.h:91
@ VMX_CODEC_FORMAT_INTERLACED
Definition vmxcodec.h:93
@ VMX_CODEC_FORMAT_PROGRESSIVE
Definition vmxcodec.h:92
VMX_API VMX_ERR VMX_DecodeP216(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API VMX_ERR VMX_DecodePreviewBGRX(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API VMX_ERR VMX_DecodeBGRA(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API VMX_ERR VMX_EncodeNV12(VMX_INSTANCE *instance, BYTE *srcY, int srcStrideY, BYTE *srcUV, int srcStrideUV, int interlaced)
unsigned long long buffer_t
Definition vmxcodec.h:47
VMX_API VMX_ERR VMX_EncodeYUY2(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
VMX_ERR
Definition vmxcodec.h:60
@ VMX_ERR_INVALID_PARAMETERS
Definition vmxcodec.h:67
@ VMX_ERR_INVALID_CODEC_FORMAT
Definition vmxcodec.h:63
@ VMX_ERR_INVALID_INSTANCE
Definition vmxcodec.h:66
@ VMX_ERR_OK
Definition vmxcodec.h:61
@ VMX_ERR_BUFFER_OVERFLOW
Definition vmxcodec.h:65
@ VMX_ERR_UNKNOWN
Definition vmxcodec.h:62
@ VMX_ERR_INVALID_SLICE_COUNT
Definition vmxcodec.h:64
VMX_API VMX_ERR VMX_DecodeYUY2(VMX_INSTANCE *instance, BYTE *dst, int stride)
const int VMX_QUALITY_COUNT
Definition vmxcodec.h:44
VMX_API void VMX_GetEncodingParameters(VMX_INSTANCE *instance, int *frameMin, int *frameMax, int *minQuality, int *dcShift)
VMX_API VMX_INSTANCE * VMX_Create(VMX_SIZE dimensions, VMX_PROFILE profile, VMX_COLORSPACE colorSpace)
VMX_IMAGE_FORMAT
Definition vmxcodec.h:97
@ VMX_IMAGE_BGRA
Definition vmxcodec.h:103
@ VMX_IMAGE_YUY2
Definition vmxcodec.h:99
@ VMX_IMAGE_YUVPLANAR422
Definition vmxcodec.h:102
@ VMX_IMAGE_UYVY
Definition vmxcodec.h:98
@ VMX_IMAGE_P216
Definition vmxcodec.h:106
@ VMX_IMAGE_NV12
Definition vmxcodec.h:100
@ VMX_IMAGE_PA16
Definition vmxcodec.h:107
@ VMX_IMAGE_UYVA
Definition vmxcodec.h:105
@ VMX_IMAGE_YV12
Definition vmxcodec.h:101
@ VMX_IMAGE_BGRX
Definition vmxcodec.h:104
VMX_API int VMX_GetEncodedPreviewLength(VMX_INSTANCE *instance)
VMX_PROFILE
Definition vmxcodec.h:70
@ VMX_PROFILE_OMT_SQ
Definition vmxcodec.h:76
@ VMX_PROFILE_SQ
Definition vmxcodec.h:73
@ VMX_PROFILE_OMT_HQ
Definition vmxcodec.h:77
@ VMX_PROFILE_LQ
Definition vmxcodec.h:72
@ VMX_PROFILE_DEFAULT
Definition vmxcodec.h:71
@ VMX_PROFILE_HQ
Definition vmxcodec.h:74
@ VMX_PROFILE_OMT_LQ
Definition vmxcodec.h:75
VMX_API VMX_ERR VMX_DecodePreviewUYVY(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API void VMX_SetQuality(VMX_INSTANCE *instance, int q)
VMX_API VMX_ERR VMX_EncodeP216(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
VMX_API VMX_ERR VMX_EncodeUYVY(VMX_INSTANCE *instance, BYTE *src, int stride, int interlaced)
VMX_API VMX_ERR VMX_DecodeBGRX(VMX_INSTANCE *instance, BYTE *dst, int stride)
void VMX_ResetStream(VMX_INSTANCE *instance)
VMX_API int VMX_GetQuality(VMX_INSTANCE *instance)
VMX_API VMX_ERR VMX_DecodePreviewUYVA(VMX_INSTANCE *instance, BYTE *dst, int stride)
VMX_API VMX_ERR VMX_EncodePlanar(VMX_INSTANCE *instance, int interlaced)
VMX_API int VMX_Test(VMX_INSTANCE *instance, short *src, short *dst)