43 #ifndef OPAL_CODEC_OPALPLUGIN_H
44 #define OPAL_CODEC_OPALPLUGIN_H
50 #ifndef _CRT_NONSTDC_NO_DEPRECATE
51 #define _CRT_NONSTDC_NO_DEPRECATE 1
54 #ifndef _CRT_SECURE_NO_WARNINGS
55 #define _CRT_SECURE_NO_WARNINGS 1
61 #pragma warning(disable:4201)
65 # ifdef PLUGIN_CODEC_DLL_EXPORTS
66 # define PLUGIN_CODEC_DLL_API __declspec(dllexport)
68 # define PLUGIN_CODEC_DLL_API __declspec(dllimport)
71 #if !defined(strcasecmp) && !defined(_WIN32_WCE)
72 #define strcasecmp stricmp
77 #define PLUGIN_CODEC_DLL_API
81 #ifdef PWLIB_PLUGIN_API_VERSION
82 #undef PWLIB_PLUGIN_API_VERSION
84 #define PWLIB_PLUGIN_API_VERSION 1
86 #define PLUGIN_CODEC_VERSION_FIRST 1 // initial version
87 #define PLUGIN_CODEC_VERSION_WIDEBAND 2 // added wideband
88 #define PLUGIN_CODEC_VERSION_VIDEO 3 // added video
89 #define PLUGIN_CODEC_VERSION_FAX 4 // added fax
90 #define PLUGIN_CODEC_VERSION_OPTIONS 5 // added options handling
91 #define PLUGIN_CODEC_VERSION_INTERSECT 6 // added media option intersection merge functionality
92 #define PLUGIN_CODEC_VERSION_H245_DEF_GEN_PARAM 7 // added suppression of H.245 generic parameters via default
94 #define PLUGIN_CODEC_VERSION PLUGIN_CODEC_VERSION_H245_DEF_GEN_PARAM // Always latest version
96 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
97 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
99 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
100 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
102 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
103 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
104 { return PWLIB_PLUGIN_API_VERSION; }
201 #define PluginCodec_SetChannels(n) (((n-1)<<PluginCodec_ChannelsPos)&PluginCodec_ChannelsMask)
222 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
223 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
224 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
225 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
226 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
227 #define PLUGINCODEC_CONTROL_GET_ACTIVE_OPTIONS "get_active_options"
228 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
229 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
230 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
231 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
232 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
233 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
244 const char * section,
251 const char *
name,
void *
parm,
unsigned * parmLen);
279 #define PluginCodec_H245_Collapsing 0x40000000
280 #define PluginCodec_H245_NonCollapsing 0x20000000
281 #define PluginCodec_H245_Unsigned32 0x10000000
282 #define PluginCodec_H245_BooleanArray 0x08000000
283 #define PluginCodec_H245_TCS 0x04000000
284 #define PluginCodec_H245_OLC 0x02000000
285 #define PluginCodec_H245_ReqMode 0x01000000
286 #define PluginCodec_H245_OrdinalMask 0x0000ffff
287 #define PluginCodec_H245_PositionMask 0x00ff0000
288 #define PluginCodec_H245_PositionShift 16
312 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
313 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
314 #define PLUGINCODEC_OPTION_CHANNELS "Channels"
315 #define PLUGINCODEC_OPTION_RTP_CLOCK_RATE "RTP Clock Rate"
316 #define PLUGINCODEC_OPTION_RTP_CHANNELS "RTP Channels"
317 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
318 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
319 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE "Max Tx Packet Size"
320 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
321 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
322 #define PLUGINCODEC_OPTION_RATE_CONTROL_PERIOD "Rate Control Period"
323 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
324 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
325 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
326 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
327 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
328 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
329 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
330 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
331 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
332 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
333 #define PLUGINCODEC_OPTION_VOICE_ACTIVITY_DETECT "VAD"
335 #define PLUGINCODEC_OPTION_PROTOCOL "Protocol"
336 #define PLUGINCODEC_OPTION_PROTOCOL_H323 "H.323"
337 #define PLUGINCODEC_OPTION_PROTOCOL_SIP "SIP"
386 const void * from,
unsigned * fromLen,
387 void * to,
unsigned * toLen,
388 unsigned int * flag);
401 typedef const struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(
unsigned int *,
unsigned int);
407 #define PLUGINCODEC_RAW_AUDIO "L16"
408 #define PLUGINCODEC_RAW_VIDEO "YUV420P"
409 #define PLUGINCODEC_VIDEO_CLOCK 90000
410 #define PLUGINCODEC_MAX_FRAME_RATE 30
412 #define PLUGINCODEC_CIF_WIDTH 352
413 #define PLUGINCODEC_CIF_HEIGHT 288
415 #define PLUGINCODEC_CIF4_WIDTH (PLUGINCODEC_CIF_WIDTH*2)
416 #define PLUGINCODEC_CIF4_HEIGHT (PLUGINCODEC_CIF_HEIGHT*2)
418 #define PLUGINCODEC_CIF16_WIDTH (PLUGINCODEC_CIF_WIDTH*4)
419 #define PLUGINCODEC_CIF16_HEIGHT (PLUGINCODEC_CIF_HEIGHT*4)
421 #define PLUGINCODEC_QCIF_WIDTH (PLUGINCODEC_CIF_WIDTH/2)
422 #define PLUGINCODEC_QCIF_HEIGHT (PLUGINCODEC_CIF_HEIGHT/2)
424 #define PLUGINCODEC_QCIF4_WIDTH (PLUGINCODEC_CIF4_WIDTH/2)
425 #define PLUGINCODEC_QCIF4_HEIGHT (PLUGINCODEC_CIF4_HEIGHT/2)
427 #define PLUGINCODEC_SQCIF_WIDTH 128
428 #define PLUGINCODEC_SQCIF_HEIGHT 96
431 #ifndef __TIMESTAMP__
432 #define __TIMESTAMP__ "0"
435 #define PLUGINCODEC_LICENSE(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15) \
436 static struct PluginCodec_information MyLicenseInfo = { 0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,__TIMESTAMP__ }
440 #define PLUGINCODEC_CODEC_PAIR(MediaFormat, \
462 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, RawFormat, MediaFormat, UserData, \
463 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
464 CreateEncoder, DestroyEncoder, EncodeMedia, ControlsTable, H323type, H323data \
467 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, MediaFormat, RawFormat, UserData, \
468 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
469 CreateDecoder, DestroyDecoder, DecodeMedia, ControlsTable, H323type, H323data \
472 #define PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
478 RecFramesPerPacket, \
479 MaxFramesPerPacket, \
492 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
497 (SamplesPerFrame)*1000000/(SampleRate), \
499 (BitsPerSecond)*(SampleRate)/(SamplesPerFrame)/8, \
500 RecFramesPerPacket, \
501 MaxFramesPerPacket, \
512 PluginCodec_MediaTypeAudio | \
513 PluginCodec_InputTypeRaw | \
514 PluginCodec_OutputTypeRaw | \
516 PLUGINCODEC_RAW_AUDIO, \
519 #define PLUGINCODEC_ONE_AUDIO_CODEC(MediaFormat, \
525 RecFramesPerPacket, \
526 MaxFramesPerPacket, \
532 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
533 PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
539 RecFramesPerPacket, \
540 MaxFramesPerPacket, \
555 #define PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
573 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
578 1000000/PLUGINCODEC_MAX_FRAME_RATE, \
581 0,PLUGINCODEC_MAX_FRAME_RATE, \
592 PluginCodec_MediaTypeVideo | \
593 PluginCodec_InputTypeRTP | \
594 PluginCodec_OutputTypeRTP | \
596 PLUGINCODEC_RAW_VIDEO, \
599 #define PLUGINCODEC_ONE_VIDEO_CODEC(MediaFormat, \
610 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
611 PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
649 const unsigned char *
data;
787 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
788 #define PLUGINCODEC_OPTION_OCTET_ALIGNED "Octet Aligned"
792 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
793 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
796 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
797 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
800 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
803 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
808 #define PLUGINCODEC_OPTION_PROFILE "Profile"
809 #define PLUGINCODEC_OPTION_SIMPLE_PROFILE "Simple"
810 #define PLUGINCODEC_OPTION_LEVEL "Level"
813 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
814 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
815 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
816 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
817 #define PLUGINCODEC_OPTION_MAX_NALU_SIZE "Max NALU Size"
818 #define PLUGINCODEC_OPTION_H264_PACKET_MODE "Packetization Mode"
821 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
822 #define PLUGINCODEC_OPTION_MPEG4_ADV_SIMPLE_PROFILE "Advanced Simple"
823 #define PLUGINCODEC_OPTION_MPEG4_DECODER_CONFIG "DCI"
831 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
832 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
833 #define PLUGINCODEC_CIF_MPI "CIF MPI"
834 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
835 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
836 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
838 #define PLUGINCODEC_MPI_DISABLED 33
840 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
841 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
843 #define H261_ANNEX_D "Annex D - Still Image Transmit"
844 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
845 #define H263_ANNEX_F "Annex F - Advanced Prediction"
846 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
847 #define H263_ANNEX_J "Annex J - Deblocking Filter"
848 #define H263_ANNEX_K "Annex K - Slice Structure"
849 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
850 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
851 #define H263_ANNEX_T "Annex T - Modified Quantization"
854 #define __INTERNAL_STRINGIZE__(v) #v
855 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
864 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
865 #define PluginCodec_RTP_MinHeaderSize (12)
866 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
868 #define PluginCodec_RTP_GetWORD(ptr, off) ((((unsigned char*)(ptr))[off] << 8) | ((unsigned char*)(ptr))[off+1])
870 #define PluginCodec_RTP_GetDWORD(ptr, off) ((((unsigned char*)(ptr))[off ] << 24)|\
871 (((unsigned char*)(ptr))[off+1] << 16)|\
872 (((unsigned char*)(ptr))[off+2] << 8 )|\
873 ((unsigned char*)(ptr))[off+3])
875 #define PluginCodec_RTP_SetWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 8 )),\
876 (((unsigned char*)(ptr))[off+1] = (unsigned char) (val) ))
878 #define PluginCodec_RTP_SetDWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 24)),\
879 (((unsigned char*)(ptr))[off+1] = (unsigned char)((val) >> 16)),\
880 (((unsigned char*)(ptr))[off+2] = (unsigned char)((val) >> 8 )),\
881 (((unsigned char*)(ptr))[off+3] = (unsigned char) (val) ))
883 #define PluginCodec_RTP_GetCSRCHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
884 #define PluginCodec_RTP_GetExtHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x10) ? (PluginCodec_RTP_GetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2)*4+4) : 0)
886 #define PluginCodec_RTP_GetHeaderLength(ptr) (PluginCodec_RTP_GetCSRCHdrLength(ptr) + PluginCodec_RTP_GetExtHdrLength(ptr))
887 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
888 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
889 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f)))
890 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
891 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0)))
892 #define PluginCodec_RTP_GetTimestamp(ptr) PluginCodec_RTP_GetDWORD(ptr, 4)
893 #define PluginCodec_RTP_SetTimestamp(ptr, ts) PluginCodec_RTP_SetDWORD(ptr, 4, ts)
894 #define PluginCodec_RTP_GetSequenceNumber(ptr) PluginCodec_RTP_GetWORD(ptr, 2)
895 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn) PluginCodec_RTP_SetWORD(ptr, 2, sn)
896 #define PluginCodec_RTP_GetSSRC(ptr) PluginCodec_RTP_GetDWORD(ptr, 8)
897 #define PluginCodec_RTP_SetSSRC(ptr, ssrc) PluginCodec_RTP_SetDWORD(ptr, 8, ssrc)
931 #ifdef OPAL_STATIC_CODEC
933 # undef PLUGIN_CODEC_DLL_API
934 # define PLUGIN_CODEC_DLL_API static
935 # define PLUGIN_CODEC_IMPLEMENT(name) \
936 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
937 { return PWLIB_PLUGIN_API_VERSION; } \
938 static const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
939 struct const PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
940 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
942 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
943 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
944 { return PWLIB_PLUGIN_API_VERSION; } \
945 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
946 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
951 # define PLUGIN_CODEC_IMPLEMENT(name) \
952 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
953 { return PWLIB_PLUGIN_API_VERSION; } \
955 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
956 PLUGIN_CODEC_IMPLEMENT(name) \
957 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
958 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
969 #pragma warning(default:4201)
972 #endif // OPAL_CODEC_OPALPLUGIN_H