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
89 #define PLUGIN_CODEC_VERSION PLUGIN_CODEC_VERSION_INTERSECT // Always latest version
91 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
92 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
94 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
95 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
97 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
98 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
99 { return PWLIB_PLUGIN_API_VERSION; }
191 #define PluginCodec_SetChannels(n) (((n-1)<<PluginCodec_ChannelsPos)&PluginCodec_ChannelsMask)
211 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
212 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
213 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
214 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
215 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
216 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
217 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
218 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
219 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
220 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
221 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
232 const char * section,
239 const char *
name,
void *
parm,
unsigned * parmLen);
267 #define PluginCodec_H245_Collapsing 0x40000000
268 #define PluginCodec_H245_NonCollapsing 0x20000000
269 #define PluginCodec_H245_Unsigned32 0x10000000
270 #define PluginCodec_H245_BooleanArray 0x08000000
271 #define PluginCodec_H245_TCS 0x04000000
272 #define PluginCodec_H245_OLC 0x02000000
273 #define PluginCodec_H245_ReqMode 0x01000000
274 #define PluginCodec_H245_OrdinalMask 0x0000ffff
297 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
298 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
299 #define PLUGINCODEC_OPTION_CHANNELS "Channels"
300 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
301 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
302 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE "Max Tx Packet Size"
303 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
304 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
305 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
306 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
307 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
308 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
309 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
310 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
311 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
312 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
313 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
314 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
364 const void * from,
unsigned * fromLen,
365 void * to,
unsigned * toLen,
366 unsigned int * flag);
385 #define PLUGINCODEC_RAW_AUDIO "L16"
386 #define PLUGINCODEC_RAW_VIDEO "YUV420P"
389 #define PLUGINCODEC_CODEC_PAIR(MediaFormat, \
410 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, RawFormat, MediaFormat, NULL, \
411 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
412 CreateEncoder, DestroyEncoder, EncodeMedia, ControlsTable, H323type, H323data \
415 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, MediaFormat, RawFormat, NULL, \
416 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
417 CreateDecoder, DestroyDecoder, DecodeMedia, ControlsTable, H323type, H323data \
420 #define PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
428 RecFramesPerPacket, \
429 MaxFramesPerPacket, \
442 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
450 RecFramesPerPacket, \
451 MaxFramesPerPacket, \
462 PluginCodec_MediaTypeAudio | \
463 PluginCodec_InputTypeRaw | \
464 PluginCodec_OutputTypeRaw | \
466 PLUGINCODEC_RAW_AUDIO)
468 #define PLUGINCODEC_ONE_AUDIO_CODEC(MediaFormat, \
476 RecFramesPerPacket, \
477 MaxFramesPerPacket, \
483 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
484 PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
492 RecFramesPerPacket, \
493 MaxFramesPerPacket, \
508 #define PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
526 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
547 PluginCodec_MediaTypeVideo | \
548 PluginCodec_InputTypeRRP | \
549 PluginCodec_OutputTypeRRP | \
551 PLUGINCODEC_RAW_VIDEO)
553 #define PLUGINCODEC_ONE_VIDEO_CODEC(MediaFormat, \
564 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
565 PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
603 const unsigned char *
data;
741 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
744 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
745 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
748 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
749 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
752 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
755 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
761 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
762 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
763 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
764 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
767 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
775 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
776 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
777 #define PLUGINCODEC_CIF_MPI "CIF MPI"
778 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
779 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
780 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
782 #define PLUGINCODEC_MPI_DISABLED 33
784 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
785 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
787 #define H261_ANNEX_D "Annex D - Still Image Transmit"
788 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
789 #define H263_ANNEX_F "Annex F - Advanced Prediction"
790 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
791 #define H263_ANNEX_J "Annex J - Deblocking Filter"
792 #define H263_ANNEX_K "Annex K - Slice Structure"
793 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
794 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
795 #define H263_ANNEX_T "Annex T - Modified Quantization"
798 #define __INTERNAL_STRINGIZE__(v) #v
799 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
808 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
809 #define PluginCodec_RTP_MinHeaderSize (12)
810 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
812 #define PluginCodec_RTP_GetWORD(ptr, off) ((((unsigned char*)(ptr))[off] << 8) | ((unsigned char*)(ptr))[off+1])
814 #define PluginCodec_RTP_GetDWORD(ptr, off) ((((unsigned char*)(ptr))[off ] << 24)|\
815 (((unsigned char*)(ptr))[off+1] << 16)|\
816 (((unsigned char*)(ptr))[off+2] << 8 )|\
817 ((unsigned char*)(ptr))[off+3])
819 #define PluginCodec_RTP_SetWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 8 )),\
820 (((unsigned char*)(ptr))[off+1] = (unsigned char) (val) ))
822 #define PluginCodec_RTP_SetDWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 24)),\
823 (((unsigned char*)(ptr))[off+1] = (unsigned char)((val) >> 16)),\
824 (((unsigned char*)(ptr))[off+2] = (unsigned char)((val) >> 8 )),\
825 (((unsigned char*)(ptr))[off+3] = (unsigned char) (val) ))
827 #define PluginCodec_RTP_GetCSRCHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
828 #define PluginCodec_RTP_GetExtHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x10) ? (PluginCodec_RTP_GetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2)*4+4) : 0)
830 #define PluginCodec_RTP_GetHeaderLength(ptr) (PluginCodec_RTP_GetCSRCHdrLength(ptr) + PluginCodec_RTP_GetExtHdrLength(ptr))
831 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
832 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
833 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f)))
834 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
835 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0)))
836 #define PluginCodec_RTP_GetTimestamp(ptr) PluginCodec_RTP_GetDWORD(ptr, 4)
837 #define PluginCodec_RTP_SetTimestamp(ptr, ts) PluginCodec_RTP_SetDWORD(ptr, 4, ts)
838 #define PluginCodec_RTP_GetSequenceNumber(ptr) PluginCodec_RTP_GetWORD(ptr, 2)
839 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn) PluginCodec_RTP_SetWORD(ptr, 2, sn)
840 #define PluginCodec_RTP_GetSSRC(ptr) PluginCodec_RTP_GetDWORD(ptr, 8)
841 #define PluginCodec_RTP_SetSSRC(ptr, ssrc) PluginCodec_RTP_SetDWORD(ptr, 8, ssrc)
843 #define PluginCodec_RTP_SetExtended(ptr, type, sz) ((((unsigned char*)(ptr))[0] |= 0x10), \
844 PluginCodec_RTP_SetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr), type), \
845 PluginCodec_RTP_SetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2, sz))
872 #define PLUGIN_CODEC_VIDEO_SET_FRAME_SIZE_FN "set_frame_size" // argument is struct PluginCodec_VideoSetFrameInfo
884 #ifdef OPAL_STATIC_CODEC
886 # undef PLUGIN_CODEC_DLL_API
887 # define PLUGIN_CODEC_DLL_API static
888 # define PLUGIN_CODEC_IMPLEMENT(name) \
889 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
890 { return PWLIB_PLUGIN_API_VERSION; } \
891 static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
892 struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
893 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
895 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
896 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
897 { return PWLIB_PLUGIN_API_VERSION; } \
898 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
899 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
904 # define PLUGIN_CODEC_IMPLEMENT(name) \
905 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
906 { return PWLIB_PLUGIN_API_VERSION; } \
908 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
909 PLUGIN_CODEC_IMPLEMENT(name) \
910 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
911 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
922 #pragma warning(default:4201)
925 #endif // OPAL_CODEC_OPALPLUGIN_H