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; }
200 #define PluginCodec_SetChannels(n) (((n-1)<<PluginCodec_ChannelsPos)&PluginCodec_ChannelsMask)
221 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
222 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
223 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
224 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
225 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
226 #define PLUGINCODEC_CONTROL_GET_ACTIVE_OPTIONS "get_active_options"
227 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
228 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
229 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
230 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
231 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
232 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
243 const char * section,
250 const char *
name,
void *
parm,
unsigned * parmLen);
278 #define PluginCodec_H245_Collapsing 0x40000000
279 #define PluginCodec_H245_NonCollapsing 0x20000000
280 #define PluginCodec_H245_Unsigned32 0x10000000
281 #define PluginCodec_H245_BooleanArray 0x08000000
282 #define PluginCodec_H245_TCS 0x04000000
283 #define PluginCodec_H245_OLC 0x02000000
284 #define PluginCodec_H245_ReqMode 0x01000000
285 #define PluginCodec_H245_OrdinalMask 0x0000ffff
286 #define PluginCodec_H245_PositionMask 0x00ff0000
287 #define PluginCodec_H245_PositionShift 16
311 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
312 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
313 #define PLUGINCODEC_OPTION_CHANNELS "Channels"
314 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
315 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
316 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE "Max Tx Packet Size"
317 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
318 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
319 #define PLUGINCODEC_OPTION_RATE_CONTROL_PERIOD "Rate Control Period"
320 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
321 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
322 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
323 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
324 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
325 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
326 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
327 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
328 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
329 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
331 #define PLUGINCODEC_OPTION_PROTOCOL "Protocol"
332 #define PLUGINCODEC_OPTION_PROTOCOL_H323 "H.323"
333 #define PLUGINCODEC_OPTION_PROTOCOL_SIP "SIP"
382 const void * from,
unsigned * fromLen,
383 void * to,
unsigned * toLen,
384 unsigned int * flag);
397 typedef const struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(
unsigned int *,
unsigned int);
403 #define PLUGINCODEC_RAW_AUDIO "L16"
404 #define PLUGINCODEC_RAW_VIDEO "YUV420P"
405 #define PLUGINCODEC_VIDEO_CLOCK 90000
406 #define PLUGINCODEC_MAX_FRAME_RATE 30
408 #define PLUGINCODEC_CIF_WIDTH 352
409 #define PLUGINCODEC_CIF_HEIGHT 288
411 #define PLUGINCODEC_CIF4_WIDTH (PLUGINCODEC_CIF_WIDTH*2)
412 #define PLUGINCODEC_CIF4_HEIGHT (PLUGINCODEC_CIF_HEIGHT*2)
414 #define PLUGINCODEC_CIF16_WIDTH (PLUGINCODEC_CIF_WIDTH*4)
415 #define PLUGINCODEC_CIF16_HEIGHT (PLUGINCODEC_CIF_HEIGHT*4)
417 #define PLUGINCODEC_QCIF_WIDTH (PLUGINCODEC_CIF_WIDTH/2)
418 #define PLUGINCODEC_QCIF_HEIGHT (PLUGINCODEC_CIF_HEIGHT/2)
420 #define PLUGINCODEC_QCIF4_WIDTH (PLUGINCODEC_CIF4_WIDTH/2)
421 #define PLUGINCODEC_QCIF4_HEIGHT (PLUGINCODEC_CIF4_HEIGHT/2)
423 #define PLUGINCODEC_SQCIF_WIDTH 128
424 #define PLUGINCODEC_SQCIF_HEIGHT 96
427 #ifndef __TIMESTAMP__
428 #define __TIMESTAMP__ "0"
431 #define PLUGINCODEC_LICENSE(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15) \
432 static struct PluginCodec_information MyLicenseInfo = { 0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,__TIMESTAMP__ }
436 #define PLUGINCODEC_CODEC_PAIR(MediaFormat, \
458 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, RawFormat, MediaFormat, UserData, \
459 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
460 CreateEncoder, DestroyEncoder, EncodeMedia, ControlsTable, H323type, H323data \
463 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, MediaFormat, RawFormat, UserData, \
464 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
465 CreateDecoder, DestroyDecoder, DecodeMedia, ControlsTable, H323type, H323data \
468 #define PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
474 RecFramesPerPacket, \
475 MaxFramesPerPacket, \
488 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
493 (SamplesPerFrame)*1000000/(SampleRate), \
495 (BitsPerSecond)*(SampleRate)/(SamplesPerFrame)/8, \
496 RecFramesPerPacket, \
497 MaxFramesPerPacket, \
508 PluginCodec_MediaTypeAudio | \
509 PluginCodec_InputTypeRaw | \
510 PluginCodec_OutputTypeRaw | \
512 PLUGINCODEC_RAW_AUDIO, \
515 #define PLUGINCODEC_ONE_AUDIO_CODEC(MediaFormat, \
521 RecFramesPerPacket, \
522 MaxFramesPerPacket, \
528 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
529 PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
535 RecFramesPerPacket, \
536 MaxFramesPerPacket, \
551 #define PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
569 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
574 1000000/PLUGINCODEC_MAX_FRAME_RATE, \
577 0,PLUGINCODEC_MAX_FRAME_RATE, \
588 PluginCodec_MediaTypeVideo | \
589 PluginCodec_InputTypeRTP | \
590 PluginCodec_OutputTypeRTP | \
592 PLUGINCODEC_RAW_VIDEO, \
595 #define PLUGINCODEC_ONE_VIDEO_CODEC(MediaFormat, \
606 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
607 PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
645 const unsigned char *
data;
783 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
786 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
787 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
790 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
791 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
794 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
797 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
803 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
804 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
805 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
806 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
809 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
817 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
818 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
819 #define PLUGINCODEC_CIF_MPI "CIF MPI"
820 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
821 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
822 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
824 #define PLUGINCODEC_MPI_DISABLED 33
826 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
827 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
829 #define H261_ANNEX_D "Annex D - Still Image Transmit"
830 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
831 #define H263_ANNEX_F "Annex F - Advanced Prediction"
832 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
833 #define H263_ANNEX_J "Annex J - Deblocking Filter"
834 #define H263_ANNEX_K "Annex K - Slice Structure"
835 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
836 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
837 #define H263_ANNEX_T "Annex T - Modified Quantization"
840 #define __INTERNAL_STRINGIZE__(v) #v
841 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
850 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
851 #define PluginCodec_RTP_MinHeaderSize (12)
852 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
854 #define PluginCodec_RTP_GetWORD(ptr, off) ((((unsigned char*)(ptr))[off] << 8) | ((unsigned char*)(ptr))[off+1])
856 #define PluginCodec_RTP_GetDWORD(ptr, off) ((((unsigned char*)(ptr))[off ] << 24)|\
857 (((unsigned char*)(ptr))[off+1] << 16)|\
858 (((unsigned char*)(ptr))[off+2] << 8 )|\
859 ((unsigned char*)(ptr))[off+3])
861 #define PluginCodec_RTP_SetWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 8 )),\
862 (((unsigned char*)(ptr))[off+1] = (unsigned char) (val) ))
864 #define PluginCodec_RTP_SetDWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 24)),\
865 (((unsigned char*)(ptr))[off+1] = (unsigned char)((val) >> 16)),\
866 (((unsigned char*)(ptr))[off+2] = (unsigned char)((val) >> 8 )),\
867 (((unsigned char*)(ptr))[off+3] = (unsigned char) (val) ))
869 #define PluginCodec_RTP_GetCSRCHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
870 #define PluginCodec_RTP_GetExtHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x10) ? (PluginCodec_RTP_GetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2)*4+4) : 0)
872 #define PluginCodec_RTP_GetHeaderLength(ptr) (PluginCodec_RTP_GetCSRCHdrLength(ptr) + PluginCodec_RTP_GetExtHdrLength(ptr))
873 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
874 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
875 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f)))
876 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
877 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0)))
878 #define PluginCodec_RTP_GetTimestamp(ptr) PluginCodec_RTP_GetDWORD(ptr, 4)
879 #define PluginCodec_RTP_SetTimestamp(ptr, ts) PluginCodec_RTP_SetDWORD(ptr, 4, ts)
880 #define PluginCodec_RTP_GetSequenceNumber(ptr) PluginCodec_RTP_GetWORD(ptr, 2)
881 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn) PluginCodec_RTP_SetWORD(ptr, 2, sn)
882 #define PluginCodec_RTP_GetSSRC(ptr) PluginCodec_RTP_GetDWORD(ptr, 8)
883 #define PluginCodec_RTP_SetSSRC(ptr, ssrc) PluginCodec_RTP_SetDWORD(ptr, 8, ssrc)
917 #ifdef OPAL_STATIC_CODEC
919 # undef PLUGIN_CODEC_DLL_API
920 # define PLUGIN_CODEC_DLL_API static
921 # define PLUGIN_CODEC_IMPLEMENT(name) \
922 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
923 { return PWLIB_PLUGIN_API_VERSION; } \
924 static const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
925 struct const PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
926 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
928 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
929 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
930 { return PWLIB_PLUGIN_API_VERSION; } \
931 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
932 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
937 # define PLUGIN_CODEC_IMPLEMENT(name) \
938 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
939 { return PWLIB_PLUGIN_API_VERSION; } \
941 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
942 PLUGIN_CODEC_IMPLEMENT(name) \
943 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
944 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
955 #pragma warning(default:4201)
958 #endif // OPAL_CODEC_OPALPLUGIN_H