00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef OPAL_CODEC_OPALPLUGIN_H
00033 #define OPAL_CODEC_OPALPLUGIN_H
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 #include <time.h>
00040
00041 #ifdef _MSC_VER
00042 #pragma warning(disable:4201)
00043 #endif
00044
00045 #ifdef _WIN32
00046 # ifdef PLUGIN_CODEC_DLL_EXPORTS
00047 # define PLUGIN_CODEC_DLL_API __declspec(dllexport)
00048 # else
00049 # define PLUGIN_CODEC_DLL_API __declspec(dllimport)
00050 # endif
00051
00052 #else
00053
00054 #define PLUGIN_CODEC_DLL_API
00055
00056 #endif
00057
00058 #ifdef PWLIB_PLUGIN_API_VERSION
00059 #undef PWLIB_PLUGIN_API_VERSION
00060 #endif
00061 #define PWLIB_PLUGIN_API_VERSION 1
00062
00063 #define PLUGIN_CODEC_VERSION 1 // initial version
00064 #define PLUGIN_CODEC_VERSION_WIDEBAND 2 // added wideband
00065 #define PLUGIN_CODEC_VERSION_VIDEO 3 // added video
00066 #define PLUGIN_CODEC_VERSION_FAX 4 // added fax
00067 #define PLUGIN_CODEC_VERSION_OPTIONS 5 // added options handling
00068
00069 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
00070 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
00071
00072 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
00073 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
00074
00075 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
00076 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00077 { return PWLIB_PLUGIN_API_VERSION; }
00078
00079 enum {
00080 PluginCodec_License_None = 0,
00081 PluginCodec_Licence_None = PluginCodec_License_None,
00082 PluginCodec_License_GPL = 1,
00083 PluginCodec_License_MPL = 2,
00084 PluginCodec_License_Freeware = 3,
00085 PluginCodec_License_ResearchAndDevelopmentUseOnly = 4,
00086 PluginCodec_License_BSD = 5,
00087 PluginCodec_License_LGPL = 6,
00088
00089 PluginCodec_License_NoRoyalties = 0x7f,
00090
00091
00092 PluginCodec_License_RoyaltiesRequired = 0x80
00093 };
00094
00095 struct PluginCodec_information {
00096
00097 time_t timestamp;
00098
00099 const char * sourceAuthor;
00100 const char * sourceVersion;
00101 const char * sourceEmail;
00102 const char * sourceURL;
00103 const char * sourceCopyright;
00104 const char * sourceLicense;
00105 unsigned char sourceLicenseCode;
00106
00107 const char * codecDescription;
00108 const char * codecAuthor;
00109 const char * codecVersion;
00110 const char * codecEmail;
00111 const char * codecURL;
00112 const char * codecCopyright;
00113 const char * codecLicense;
00114 unsigned short codecLicenseCode;
00115
00116
00117 };
00118
00119 enum PluginCodec_Flags {
00120 PluginCodec_MediaTypeMask = 0x000f,
00121 PluginCodec_MediaTypeAudio = 0x0000,
00122 PluginCodec_MediaTypeVideo = 0x0001,
00123 PluginCodec_MediaTypeAudioStreamed = 0x0002,
00124 PluginCodec_MediaTypeFax = 0x0003,
00125
00126 PluginCodec_InputTypeMask = 0x0010,
00127 PluginCodec_InputTypeRaw = 0x0000,
00128 PluginCodec_InputTypeRTP = 0x0010,
00129
00130 PluginCodec_OutputTypeMask = 0x0020,
00131 PluginCodec_OutputTypeRaw = 0x0000,
00132 PluginCodec_OutputTypeRTP = 0x0020,
00133
00134 PluginCodec_RTPTypeMask = 0x0040,
00135 PluginCodec_RTPTypeDynamic = 0x0000,
00136 PluginCodec_RTPTypeExplicit = 0x0040,
00137
00138 PluginCodec_RTPSharedMask = 0x0080,
00139 PluginCodec_RTPTypeNotShared = 0x0000,
00140 PluginCodec_RTPTypeShared = 0x0080,
00141
00142 PluginCodec_DecodeSilenceMask = 0x0100,
00143 PluginCodec_NoDecodeSilence = 0x0000,
00144 PluginCodec_DecodeSilence = 0x0100,
00145
00146 PluginCodec_EncodeSilenceMask = 0x0200,
00147 PluginCodec_NoEncodeSilence = 0x0000,
00148 PluginCodec_EncodeSilence = 0x0200,
00149
00150 PluginCodec_MediaExtensionMask = 0x0400,
00151 PluginCodec_MediaTypeExtVideo = 0x0400,
00152
00153 PluginCodec_ComfortNoiseMask = 0x0800,
00154 PluginCodec_ComfortNoise = 0x0800,
00155
00156 PluginCodec_EmptyPayloadMask = 0x1000,
00157 PluginCodec_EmptyPayload = 0x1000,
00158
00159 PluginCodec_OtherPayloadMask = 0x2000,
00160 PluginCodec_OtherPayload = 0x2000,
00161
00162 PluginCodec_BitsPerSamplePos = 12,
00163 PluginCodec_BitsPerSampleMask = 0xf000,
00164 };
00165
00166 enum PluginCodec_CoderFlags {
00167 PluginCodec_CoderSilenceFrame = 1,
00168 PluginCodec_CoderForceIFrame = 2
00169 };
00170
00171 enum PluginCodec_ReturnCoderFlags {
00172 PluginCodec_ReturnCoderLastFrame = 1,
00173 PluginCodec_ReturnCoderIFrame = 2,
00174 PluginCodec_ReturnCoderRequestIFrame = 4,
00175 PluginCodec_ReturnCoderBufferTooSmall = 8
00176
00177 };
00178
00179 struct PluginCodec_Definition;
00180
00181
00182
00183 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
00184 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
00185 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
00186 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
00187 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
00188 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
00189 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
00190 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
00191 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
00192 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
00193 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
00194
00195
00196
00197
00198
00199
00200
00201 typedef int (*PluginCodec_LogFunction)(unsigned level,
00202 const char * file,
00203 unsigned line,
00204 const char * section,
00205 const char * log);
00206
00207
00208 struct PluginCodec_ControlDefn {
00209 const char * name;
00210 int (*control)(const struct PluginCodec_Definition * codec, void * context,
00211 const char * name, void * parm, unsigned * parmLen);
00212
00213 };
00214
00215 enum PluginCodec_OptionTypes {
00216 PluginCodec_StringOption,
00217 PluginCodec_BoolOption,
00218 PluginCodec_IntegerOption,
00219 PluginCodec_RealOption,
00220 PluginCodec_EnumOption,
00221 PluginCodec_OctetsOption,
00222 PluginCodec_NumOptionTypes,
00223 };
00224
00225 enum PluginCodec_OptionMerge {
00226 PluginCodec_NoMerge,
00227 PluginCodec_MinMerge,
00228 PluginCodec_MaxMerge,
00229 PluginCodec_EqualMerge,
00230 PluginCodec_NotEqualMerge,
00231 PluginCodec_AlwaysMerge,
00232 PluginCodec_CustomMerge,
00233 PluginCodec_IntersectionMerge,
00234
00235 PluginCodec_AndMerge = PluginCodec_MinMerge,
00236 PluginCodec_OrMerge = PluginCodec_MaxMerge
00237 };
00238
00239 #define PluginCodec_H245_Collapsing 0x40000000
00240 #define PluginCodec_H245_NonCollapsing 0x20000000
00241 #define PluginCodec_H245_Unsigned32 0x10000000
00242 #define PluginCodec_H245_BooleanArray 0x08000000
00243 #define PluginCodec_H245_TCS 0x04000000
00244 #define PluginCodec_H245_OLC 0x02000000
00245 #define PluginCodec_H245_ReqMode 0x01000000
00246 #define PluginCodec_H245_OrdinalMask 0x0000ffff
00247
00248 typedef int (*PluginCodec_MergeFunction)(char ** result, const char * dest, const char * src);
00249 typedef void (*PluginCodec_FreeFunction)(char * string);
00250
00251 struct PluginCodec_Option {
00252
00253 enum PluginCodec_OptionTypes m_type;
00254 const char * m_name;
00255 unsigned m_readOnly;
00256 enum PluginCodec_OptionMerge m_merge;
00257 const char * m_value;
00258 const char * m_FMTPName;
00259 const char * m_FMTPDefault;
00260 int m_H245Generic;
00261 const char * m_minimum;
00262 const char * m_maximum;
00263 PluginCodec_MergeFunction m_mergeFunction;
00264 PluginCodec_FreeFunction m_freeFunction;
00265 };
00266
00267
00268
00269 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
00270 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
00271 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
00272 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
00273 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
00274 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
00275 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
00276 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
00277 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
00278 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
00279 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
00280 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
00281 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
00282 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
00283 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
00284 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
00285
00286
00287
00288
00289
00290 struct PluginCodec_Definition {
00291 unsigned int version;
00292
00293
00294 struct PluginCodec_information * info;
00295
00296 unsigned int flags;
00297
00298
00299
00300
00301
00302 const char * descr;
00303
00304 const char * sourceFormat;
00305 const char * destFormat;
00306
00307 const void * userData;
00308
00309 unsigned int sampleRate;
00310 unsigned int bitsPerSec;
00311 unsigned int usPerFrame;
00312
00313 union _parm {
00314 struct _audio {
00315 unsigned int samplesPerFrame;
00316 unsigned int bytesPerFrame;
00317 unsigned int recommendedFramesPerPacket;
00318 unsigned int maxFramesPerPacket;
00319 } audio;
00320 struct _video {
00321 unsigned int maxFrameWidth;
00322 unsigned int maxFrameHeight;
00323 unsigned int recommendedFrameRate;
00324 unsigned int maxFrameRate;
00325 } video;
00326 } parm;
00327
00328 unsigned char rtpPayload;
00329 const char * sdpFormat;
00330
00331 void * (*createCodec)(const struct PluginCodec_Definition * codec);
00332 void (*destroyCodec) (const struct PluginCodec_Definition * codec, void * context);
00333 int (*codecFunction) (const struct PluginCodec_Definition * codec, void * context,
00334 const void * from, unsigned * fromLen,
00335 void * to, unsigned * toLen,
00336 unsigned int * flag);
00337 struct PluginCodec_ControlDefn * codecControls;
00338
00339
00340 unsigned char h323CapabilityType;
00341 const void * h323CapabilityData;
00342
00343
00344
00345
00346
00347 };
00348
00349 typedef struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(unsigned int *, unsigned int);
00350 typedef unsigned (* PluginCodec_GetAPIVersionFunction)();
00351
00353
00354
00355
00356
00357
00358 struct PluginCodec_H323CapabilityExtension {
00359 unsigned int index;
00360 void * data;
00361 unsigned dataLength;
00362 };
00363
00364 struct PluginCodec_H323NonStandardCodecData {
00365 const char * objectId;
00366 unsigned char t35CountryCode;
00367 unsigned char t35Extension;
00368 unsigned short manufacturerCode;
00369 const unsigned char * data;
00370 unsigned int dataLength;
00371 int (*capabilityMatchFunction)(struct PluginCodec_H323NonStandardCodecData *);
00372 };
00373
00374
00375 struct PluginCodec_H323GenericParameterDefinition
00376 {
00377
00378
00379
00380
00381
00382 #ifndef SOLARIS
00383 struct {
00384 #endif
00385 int collapsing:1;
00386 int excludeTCS:1;
00387 int excludeOLC:1;
00388 int excludeReqMode:1;
00389 int readOnly:1;
00390 #ifndef SOLARIS
00391 };
00392 #endif
00393
00394 unsigned int id;
00395
00396 enum PluginCodec_H323GenericParameterType {
00397
00398
00399
00400 PluginCodec_GenericParameter_Logical = 0,
00401 PluginCodec_GenericParameter_BooleanArray,
00402 PluginCodec_GenericParameter_UnsignedMin,
00403 PluginCodec_GenericParameter_UnsignedMax,
00404 PluginCodec_GenericParameter_Unsigned32Min,
00405 PluginCodec_GenericParameter_Unsigned32Max,
00406 PluginCodec_GenericParameter_OctetString,
00407 PluginCodec_GenericParameter_GenericParameter,
00408
00409 PluginCodec_GenericParameter_logical = 0,
00410 PluginCodec_GenericParameter_booleanArray,
00411 PluginCodec_GenericParameter_unsignedMin,
00412 PluginCodec_GenericParameter_unsignedMax,
00413 PluginCodec_GenericParameter_unsigned32Min,
00414 PluginCodec_GenericParameter_unsigned32Max,
00415 PluginCodec_GenericParameter_octetString,
00416 PluginCodec_GenericParameter_genericParameter
00417 } type;
00418
00419 union {
00420 unsigned long integer;
00421 const char * octetstring;
00422 struct PluginCodec_H323GenericParameterDefinition *genericparameter;
00423 } value;
00424 };
00425
00426 struct PluginCodec_H323GenericCodecData
00427 {
00428
00429
00430 const char * standardIdentifier;
00431 unsigned int maxBitRate;
00432
00433
00434
00435 unsigned int nParameters;
00436
00437 const struct PluginCodec_H323GenericParameterDefinition *params;
00438 };
00439
00440
00441 struct PluginCodec_H323AudioGSMData {
00442 int comfortNoise:1;
00443 int scrambled:1;
00444 };
00445
00446 struct PluginCodec_H323AudioG7231AnnexC {
00447 unsigned char maxAl_sduAudioFrames;
00448 int silenceSuppression:1;
00449 int highRateMode0:6;
00450 int highRateMode1:6;
00451 int lowRateMode0:6;
00452 int lowRateMode1:6;
00453 int sidMode0:4;
00454 int sidMode1:4;
00455 };
00456
00457
00458 enum {
00459 PluginCodec_H323Codec_undefined,
00460 PluginCodec_H323Codec_programmed,
00461 PluginCodec_H323Codec_nonStandard,
00462 PluginCodec_H323Codec_generic,
00463
00464
00465 PluginCodec_H323AudioCodec_g711Alaw_64k,
00466 PluginCodec_H323AudioCodec_g711Alaw_56k,
00467 PluginCodec_H323AudioCodec_g711Ulaw_64k,
00468 PluginCodec_H323AudioCodec_g711Ulaw_56k,
00469 PluginCodec_H323AudioCodec_g722_64k,
00470 PluginCodec_H323AudioCodec_g722_56k,
00471 PluginCodec_H323AudioCodec_g722_48k,
00472 PluginCodec_H323AudioCodec_g7231,
00473 PluginCodec_H323AudioCodec_g728,
00474 PluginCodec_H323AudioCodec_g729,
00475 PluginCodec_H323AudioCodec_g729AnnexA,
00476 PluginCodec_H323AudioCodec_is11172,
00477 PluginCodec_H323AudioCodec_is13818Audio,
00478 PluginCodec_H323AudioCodec_g729wAnnexB,
00479 PluginCodec_H323AudioCodec_g729AnnexAwAnnexB,
00480 PluginCodec_H323AudioCodec_g7231AnnexC,
00481 PluginCodec_H323AudioCodec_gsmFullRate,
00482 PluginCodec_H323AudioCodec_gsmHalfRate,
00483 PluginCodec_H323AudioCodec_gsmEnhancedFullRate,
00484 PluginCodec_H323AudioCodec_g729Extensions,
00485
00486
00487 PluginCodec_H323VideoCodec_h261,
00488 PluginCodec_H323VideoCodec_h262,
00489 PluginCodec_H323VideoCodec_h263,
00490 PluginCodec_H323VideoCodec_is11172,
00491
00492
00493 PluginCodec_H323VideoCodec_Extended,
00494 PluginCodec_H323T38Codec,
00495
00496
00497 PluginCodec_H323Codec_NoH323 = 0xff,
00498 };
00499
00501
00502
00503
00504
00505
00506
00507 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
00508
00509
00510 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
00511 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
00512
00513
00514 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
00515 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
00516
00517
00518 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
00519
00520
00521 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
00522
00523
00524
00525
00526
00527 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
00528 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
00529 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
00530 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
00531
00532
00533 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
00534
00535
00537
00538
00539
00540
00541 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
00542 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
00543 #define PLUGINCODEC_CIF_MPI "CIF MPI"
00544 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
00545 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
00546 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
00547
00548 #define PLUGINCODEC_MPI_DISABLED 33
00549
00550 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
00551 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
00552
00553 #define H261_ANNEX_D "Annex D - Still Image Transmit"
00554 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
00555 #define H263_ANNEX_F "Annex F - Advanced Prediction"
00556 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
00557 #define H263_ANNEX_J "Annex J - Deblocking Filter"
00558 #define H263_ANNEX_K "Annex K - Slice Structure"
00559 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
00560 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
00561 #define H263_ANNEX_T "Annex T - Modified Quantization"
00562
00563 #ifndef STRINGIZE
00564 #define __INTERNAL_STRINGIZE__(v) #v
00565 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
00566 #endif
00567
00568
00570
00571
00572
00573
00574 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
00575 #define PluginCodec_RTP_MinHeaderSize (12)
00576 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
00577
00578 #define PluginCodec_RTP_GetHeaderLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
00579 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
00580 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
00581 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f))
00582 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
00583 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0))
00584 #define PluginCodec_RTP_GetTimestamp(ptr) ((((unsigned char*)(ptr))[4] << 24) | (((unsigned char*)(ptr))[5] << 16) | (((unsigned char*)(ptr))[6] << 8) | ((unsigned char*)(ptr))[7])
00585 #define PluginCodec_RTP_SetTimestamp(ptr, ts) ((((unsigned char*)(ptr))[4] = ((ts) >> 24)),(((unsigned char*)(ptr))[5] = ((ts) >> 16)),(((unsigned char*)(ptr))[6] = ((ts) >> 8)),(((unsigned char*)(ptr))[7] = (ts)))
00586 #define PluginCodec_RTP_GetSequenceNumber(ptr) ((((unsigned char*)(ptr))[2] << 8) | ((unsigned char*)(ptr))[3])
00587 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn)((((unsigned char*)(ptr))[2] = ((sn) >> 8)),(((unsigned char*)(ptr))[3] = (sn)))
00588
00589
00591
00592
00593
00594
00595 struct PluginCodec_Video_FrameHeader {
00596 unsigned int x;
00597 unsigned int y;
00598 unsigned int width;
00599 unsigned int height;
00600 };
00601
00602 #ifdef __cplusplus
00603 };
00604
00605 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(struct PluginCodec_Video_FrameHeader * base)
00606 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00607
00608 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(const PluginCodec_Video_FrameHeader * base)
00609 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00610
00611 extern "C" {
00612 #endif
00613
00614 #define PLUGIN_CODEC_VIDEO_SET_FRAME_SIZE_FN "set_frame_size" // argument is struct PluginCodec_VideoSetFrameInfo
00615 struct PluginCodec_Video_SetFrameInfo {
00616 int width;
00617 int height;
00618 };
00619
00620
00622
00623
00624
00625
00626 #ifdef OPAL_STATIC_CODEC
00627
00628 # undef PLUGIN_CODEC_DLL_API
00629 # define PLUGIN_CODEC_DLL_API static
00630 # define PLUGIN_CODEC_IMPLEMENT(name) \
00631 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00632 { return PWLIB_PLUGIN_API_VERSION; } \
00633 static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
00634 struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
00635 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
00636
00637 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00638 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00639 { return PWLIB_PLUGIN_API_VERSION; } \
00640 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
00641 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00642
00643
00644 #else
00645
00646 # define PLUGIN_CODEC_IMPLEMENT(name) \
00647 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00648 { return PWLIB_PLUGIN_API_VERSION; } \
00649
00650 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00651 PLUGIN_CODEC_IMPLEMENT(name) \
00652 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
00653 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00654
00655
00656 #endif
00657
00658 #ifdef __cplusplus
00659 };
00660 #endif
00661
00662
00663 #ifdef _MSC_VER
00664 #pragma warning(default:4201)
00665 #endif
00666
00667 #endif // OPAL_CODEC_OPALPLUGIN_H