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 #ifndef OPAL_CODEC_VIDCODEC_H
00032 #define OPAL_CODEC_VIDCODEC_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #include <opal/buildopts.h>
00039
00040 #include <opal/transcoders.h>
00041
00042 #if OPAL_VIDEO
00043
00044 #if OPAL_H323
00045 #include <h323/h323caps.h>
00046 #endif
00047
00048 #include <codec/opalplugin.h>
00049
00050
00051 #define OPAL_RGB24 "RGB24"
00052 #define OPAL_RGB32 "RGB32"
00053 #define OPAL_YUV420P "YUV420P"
00054
00055 extern const OpalVideoFormat & GetOpalRGB24();
00056 extern const OpalVideoFormat & GetOpalRGB32();
00057 extern const OpalVideoFormat & GetOpalYUV420P();
00058
00059 #define OpalRGB24 GetOpalRGB24()
00060 #define OpalRGB32 GetOpalRGB32()
00061 #define OpalYUV420P GetOpalYUV420P()
00062
00063
00065
00072 class OpalVideoTranscoder : public OpalTranscoder
00073 {
00074 PCLASSINFO(OpalVideoTranscoder, OpalTranscoder);
00075 public:
00076 typedef PluginCodec_Video_FrameHeader FrameHeader;
00077
00082 OpalVideoTranscoder(
00083 const OpalMediaFormat & inputMediaFormat,
00084 const OpalMediaFormat & outputMediaFormat
00085 );
00087
00103 virtual bool UpdateMediaFormats(
00104 const OpalMediaFormat & inputMediaFormat,
00105 const OpalMediaFormat & outputMediaFormat
00106 );
00107
00114 virtual PINDEX GetOptimalDataFrameSize(
00115 PBoolean input
00116 ) const;
00117
00127 virtual PBoolean ExecuteCommand(
00128 const OpalMediaCommand & command
00129 );
00130
00141 virtual PBoolean Convert(
00142 const RTP_DataFrame & input,
00143 RTP_DataFrame & output
00144 );
00145
00146 #if OPAL_STATISTICS
00147 virtual void GetStatistics(OpalMediaStatistics & statistics) const;
00148 #endif
00149
00150 bool WasLastFrameIFrame() const { return lastFrameWasIFrame; }
00151 void ForceIFrame() { forceIFrame = true; }
00153
00154 protected:
00155 PINDEX inDataSize;
00156 PINDEX outDataSize;
00157 bool forceIFrame;
00158 bool lastFrameWasIFrame;
00159
00160 DWORD m_totalFrames;
00161 DWORD m_keyFrames;
00162 };
00163
00164
00166
00167 OPAL_DEFINE_MEDIA_COMMAND(OpalVideoFreezePicture, "Freeze Picture");
00168
00174 class OpalVideoUpdatePicture : public OpalMediaCommand
00175 {
00176 PCLASSINFO(OpalVideoUpdatePicture, OpalMediaCommand);
00177 public:
00178 virtual PString GetName() const;
00179 };
00180
00186 class OpalVideoPictureLoss : public OpalVideoUpdatePicture
00187 {
00188 PCLASSINFO(OpalVideoPictureLoss, OpalVideoUpdatePicture);
00189 public:
00190 OpalVideoPictureLoss(unsigned sequenceNumber = 0, unsigned timestamp = 0);
00191
00192 virtual PString GetName() const;
00193
00194 unsigned GetSequenceNumber() const { return m_sequenceNumber; }
00195 unsigned GetTimestamp() const { return m_timestamp; }
00196
00197 protected:
00198 unsigned m_sequenceNumber;
00199 unsigned m_timestamp;
00200 };
00201
00202
00211 class OpalTemporalSpatialTradeOff : public OpalMediaCommand
00212 {
00213 PCLASSINFO(OpalTemporalSpatialTradeOff, OpalMediaCommand);
00214 public:
00215 OpalTemporalSpatialTradeOff(int tradeoff) : m_tradeOff(tradeoff) { }
00216
00217 virtual PString GetName() const;
00218
00219 enum {
00220 MaximiseSpatial = 0,
00221 MaximiseTemporal = 31
00222 };
00223
00224 unsigned GetTradeOff() const { return m_tradeOff; }
00225
00226 protected:
00227 unsigned m_tradeOff;
00228 };
00229
00230
00231 #endif // OPAL_VIDEO
00232
00233 #endif // OPAL_CODEC_VIDCODEC_H
00234