39 #ifndef OPAL_CODEC_OPALPLUGIN_H
40 #define OPAL_CODEC_OPALPLUGIN_H
46 #ifndef _CRT_NONSTDC_NO_DEPRECATE
47 #define _CRT_NONSTDC_NO_DEPRECATE 1
50 #ifndef _CRT_SECURE_NO_WARNINGS
51 #define _CRT_SECURE_NO_WARNINGS 1
57 #pragma warning(disable:4201)
61 # ifdef PLUGIN_CODEC_DLL_EXPORTS
62 # define PLUGIN_CODEC_DLL_API __declspec(dllexport)
64 # define PLUGIN_CODEC_DLL_API __declspec(dllimport)
67 #if !defined(strcasecmp) && !defined(_WIN32_WCE)
68 #define strcasecmp stricmp
73 #define PLUGIN_CODEC_DLL_API
77 #ifdef PWLIB_PLUGIN_API_VERSION
78 #undef PWLIB_PLUGIN_API_VERSION
80 #define PWLIB_PLUGIN_API_VERSION 1
82 #define PLUGIN_CODEC_VERSION_FIRST 1 // initial version
83 #define PLUGIN_CODEC_VERSION_WIDEBAND 2 // added wideband
84 #define PLUGIN_CODEC_VERSION_VIDEO 3 // added video
85 #define PLUGIN_CODEC_VERSION_FAX 4 // added fax
86 #define PLUGIN_CODEC_VERSION_OPTIONS 5 // added options handling
87 #define PLUGIN_CODEC_VERSION_INTERSECT 6 // added media option intersection merge functionality
88 #define PLUGIN_CODEC_VERSION_H245_DEF_GEN_PARAM 7 // added suppression of H.245 generic parameters via default
90 #define PLUGIN_CODEC_VERSION PLUGIN_CODEC_VERSION_INTERSECT // Always latest version
92 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
93 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
95 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
96 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
98 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
99 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
100 { return PWLIB_PLUGIN_API_VERSION; }
192 #define PluginCodec_SetChannels(n) (((n-1)<<PluginCodec_ChannelsPos)&PluginCodec_ChannelsMask)
212 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
213 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
214 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
215 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
216 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
217 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
218 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
219 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
220 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
221 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
222 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
233 const char * section,
240 const char *
name,
void *
parm,
unsigned * parmLen);
268 #define PluginCodec_H245_Collapsing 0x40000000
269 #define PluginCodec_H245_NonCollapsing 0x20000000
270 #define PluginCodec_H245_Unsigned32 0x10000000
271 #define PluginCodec_H245_BooleanArray 0x08000000
272 #define PluginCodec_H245_TCS 0x04000000
273 #define PluginCodec_H245_OLC 0x02000000
274 #define PluginCodec_H245_ReqMode 0x01000000
275 #define PluginCodec_H245_OrdinalMask 0x0000ffff
276 #define PluginCodec_H245_PositionMask 0x00ff0000
277 #define PluginCodec_H245_PositionShift 16
301 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
302 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
303 #define PLUGINCODEC_OPTION_CHANNELS "Channels"
304 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
305 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
306 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE "Max Tx Packet Size"
307 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
308 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
309 #define PLUGINCODEC_OPTION_RATE_CONTROL_PERIOD "Rate Control Period"
310 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
311 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
312 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
313 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
314 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
315 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
316 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
317 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
318 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
319 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
321 #define PLUGINCODEC_OPTION_PROTOCOL "Protocol"
322 #define PLUGINCODEC_OPTION_PROTOCOL_H323 "H.323"
323 #define PLUGINCODEC_OPTION_PROTOCOL_SIP "SIP"
372 const void * from,
unsigned * fromLen,
373 void * to,
unsigned * toLen,
374 unsigned int * flag);
393 #define PLUGINCODEC_RAW_AUDIO "L16"
394 #define PLUGINCODEC_RAW_VIDEO "YUV420P"
397 #define PLUGINCODEC_CODEC_PAIR(MediaFormat, \
418 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, RawFormat, MediaFormat, NULL, \
419 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
420 CreateEncoder, DestroyEncoder, EncodeMedia, ControlsTable, H323type, H323data \
423 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, MediaFormat, RawFormat, NULL, \
424 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
425 CreateDecoder, DestroyDecoder, DecodeMedia, ControlsTable, H323type, H323data \
428 #define PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
436 RecFramesPerPacket, \
437 MaxFramesPerPacket, \
450 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
458 RecFramesPerPacket, \
459 MaxFramesPerPacket, \
470 PluginCodec_MediaTypeAudio | \
471 PluginCodec_InputTypeRaw | \
472 PluginCodec_OutputTypeRaw | \
474 PLUGINCODEC_RAW_AUDIO)
476 #define PLUGINCODEC_ONE_AUDIO_CODEC(MediaFormat, \
484 RecFramesPerPacket, \
485 MaxFramesPerPacket, \
491 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
492 PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
500 RecFramesPerPacket, \
501 MaxFramesPerPacket, \
516 #define PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
534 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
555 PluginCodec_MediaTypeVideo | \
556 PluginCodec_InputTypeRRP | \
557 PluginCodec_OutputTypeRRP | \
559 PLUGINCODEC_RAW_VIDEO)
561 #define PLUGINCODEC_ONE_VIDEO_CODEC(MediaFormat, \
572 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
573 PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
611 const unsigned char *
data;
749 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
752 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
753 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
756 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
757 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
760 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
763 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
769 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
770 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
771 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
772 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
775 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
783 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
784 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
785 #define PLUGINCODEC_CIF_MPI "CIF MPI"
786 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
787 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
788 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
790 #define PLUGINCODEC_MPI_DISABLED 33
792 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
793 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
795 #define H261_ANNEX_D "Annex D - Still Image Transmit"
796 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
797 #define H263_ANNEX_F "Annex F - Advanced Prediction"
798 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
799 #define H263_ANNEX_J "Annex J - Deblocking Filter"
800 #define H263_ANNEX_K "Annex K - Slice Structure"
801 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
802 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
803 #define H263_ANNEX_T "Annex T - Modified Quantization"
806 #define __INTERNAL_STRINGIZE__(v) #v
807 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
816 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
817 #define PluginCodec_RTP_MinHeaderSize (12)
818 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
820 #define PluginCodec_RTP_GetWORD(ptr, off) ((((unsigned char*)(ptr))[off] << 8) | ((unsigned char*)(ptr))[off+1])
822 #define PluginCodec_RTP_GetDWORD(ptr, off) ((((unsigned char*)(ptr))[off ] << 24)|\
823 (((unsigned char*)(ptr))[off+1] << 16)|\
824 (((unsigned char*)(ptr))[off+2] << 8 )|\
825 ((unsigned char*)(ptr))[off+3])
827 #define PluginCodec_RTP_SetWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 8 )),\
828 (((unsigned char*)(ptr))[off+1] = (unsigned char) (val) ))
830 #define PluginCodec_RTP_SetDWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 24)),\
831 (((unsigned char*)(ptr))[off+1] = (unsigned char)((val) >> 16)),\
832 (((unsigned char*)(ptr))[off+2] = (unsigned char)((val) >> 8 )),\
833 (((unsigned char*)(ptr))[off+3] = (unsigned char) (val) ))
835 #define PluginCodec_RTP_GetCSRCHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
836 #define PluginCodec_RTP_GetExtHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x10) ? (PluginCodec_RTP_GetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2)*4+4) : 0)
838 #define PluginCodec_RTP_GetHeaderLength(ptr) (PluginCodec_RTP_GetCSRCHdrLength(ptr) + PluginCodec_RTP_GetExtHdrLength(ptr))
839 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
840 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
841 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f)))
842 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
843 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0)))
844 #define PluginCodec_RTP_GetTimestamp(ptr) PluginCodec_RTP_GetDWORD(ptr, 4)
845 #define PluginCodec_RTP_SetTimestamp(ptr, ts) PluginCodec_RTP_SetDWORD(ptr, 4, ts)
846 #define PluginCodec_RTP_GetSequenceNumber(ptr) PluginCodec_RTP_GetWORD(ptr, 2)
847 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn) PluginCodec_RTP_SetWORD(ptr, 2, sn)
848 #define PluginCodec_RTP_GetSSRC(ptr) PluginCodec_RTP_GetDWORD(ptr, 8)
849 #define PluginCodec_RTP_SetSSRC(ptr, ssrc) PluginCodec_RTP_SetDWORD(ptr, 8, ssrc)
851 #define PluginCodec_RTP_SetExtended(ptr, type, sz) ((((unsigned char*)(ptr))[0] |= 0x10), \
852 PluginCodec_RTP_SetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr), type), \
853 PluginCodec_RTP_SetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2, sz))
880 #define PLUGIN_CODEC_VIDEO_SET_FRAME_SIZE_FN "set_frame_size" // argument is struct PluginCodec_VideoSetFrameInfo
892 #ifdef OPAL_STATIC_CODEC
894 # undef PLUGIN_CODEC_DLL_API
895 # define PLUGIN_CODEC_DLL_API static
896 # define PLUGIN_CODEC_IMPLEMENT(name) \
897 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
898 { return PWLIB_PLUGIN_API_VERSION; } \
899 static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
900 struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
901 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
903 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
904 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
905 { return PWLIB_PLUGIN_API_VERSION; } \
906 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
907 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
912 # define PLUGIN_CODEC_IMPLEMENT(name) \
913 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
914 { return PWLIB_PLUGIN_API_VERSION; } \
916 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
917 PLUGIN_CODEC_IMPLEMENT(name) \
918 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
919 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
930 #pragma warning(default:4201)
933 #endif // OPAL_CODEC_OPALPLUGIN_H