OPAL  Version 3.14.3
mediafmt.h
Go to the documentation of this file.
1 /*
2  * mediafmt.h
3  *
4  * Media Format descriptions
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (c) 2001 Equivalence Pty. Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open H323 Library.
22  *
23  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24  *
25  * Contributor(s): ______________________________________.
26  *
27  * $Revision: 32687 $
28  * $Author: rjongbloed $
29  * $Date: 2014-09-05 13:52:07 +1000 (Fri, 05 Sep 2014) $
30  */
31 
32 #ifndef OPAL_OPAL_MEDIAFMT_H
33 #define OPAL_OPAL_MEDIAFMT_H
34 
35 #ifdef P_USE_PRAGMA
36 #pragma interface
37 #endif
38 
39 #include <opal_config.h>
40 
41 #include <opal/mediatype.h>
42 #include <rtp/rtp.h>
43 #include <ptlib/bitwise_enum.h>
44 
45 #if OPAL_VIDEO
46 #include <ptlib/videoio.h>
47 #endif
48 
49 #include <limits>
50 
51 
53 class OpalMediaFormat;
54 class H225_BandWidth;
55 class PASN_Integer;
56 
57 
59 
65  public:
66  enum Direction {
67  Rx = 1,
68  Tx,
71  };
72  friend std::ostream & operator<<(std::ostream & strm, OpalBandwidth::Direction dir);
73 
74  typedef unsigned int_type;
75 
76  __inline OpalBandwidth(int_type bps = 0) : m_bps(bps) { }
77  __inline OpalBandwidth & operator=(int_type bps) { m_bps = bps; return *this; }
78  __inline operator int_type() const { return m_bps; }
79 
80  OpalBandwidth(const PString & str);
81 
82  __inline OpalBandwidth operator+ (const OpalBandwidth & bw) const { return OpalBandwidth(m_bps + bw.m_bps); }
83  __inline OpalBandwidth operator- (const OpalBandwidth & bw) const { return OpalBandwidth(m_bps - bw.m_bps); }
84  __inline OpalBandwidth & operator+=(const OpalBandwidth & bw) { m_bps += bw.m_bps; return *this; }
85  __inline OpalBandwidth & operator-=(const OpalBandwidth & bw) { m_bps += bw.m_bps; return *this; }
86  __inline OpalBandwidth & operator&=(const OpalBandwidth & bw) { if (m_bps > bw.m_bps) m_bps = bw.m_bps; return *this; }
87 
88  friend std::ostream & operator<<(std::ostream & strm, const OpalBandwidth & bw);
89  friend std::istream & operator>>(std::istream & strm, OpalBandwidth & bw);
90 
91 #if OPAL_H323
92  OpalBandwidth(const H225_BandWidth & bw);
93  OpalBandwidth & operator=(const H225_BandWidth & bw);
94  void SetH225(H225_BandWidth & bw) const;
95  void SetH245(PASN_Integer & bitRate) const;
96  void FromH245(const PASN_Integer & bitRate);
97 #endif
98  unsigned kbps() const { return (m_bps+999)/1000; }
99 
100  static OpalBandwidth Max() { return OpalBandwidth(UINT_MAX); }
101 
102  protected:
104 };
105 
106 
108 
109 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
110 
113 class OpalMediaFormatList : public OpalMediaFormatBaseList
114 {
115  PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
116  public:
122 
126  const OpalMediaFormat & format
127  );
128 
131  OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
133 
140  const char * wildcard
141  ) { PConstString w(wildcard); return operator+=(w); }
142 
147  const PString & wildcard
148  );
149 
154  const OpalMediaFormat & format
155  );
156 
161  const OpalMediaFormatList & formats
162  );
163 
168  const OpalMediaFormat & format
169  );
170 
175  const OpalMediaFormatList & formats
176  );
177 
194  const_iterator FindFormat(
195  RTP_DataFrame::PayloadTypes rtpPayloadType,
196  const unsigned clockRate = 0,
197  const char * rtpEncodingName = NULL,
198  const char * protocol = NULL,
199  const_iterator start = const_iterator()
200  ) const;
201 
218  const_iterator FindFormat(
219  const PString & wildcard,
220  const_iterator start = const_iterator()
221  ) const;
222 
225  PBoolean HasFormat(
226  RTP_DataFrame::PayloadTypes rtpPayloadType
227  ) const { return FindFormat(rtpPayloadType) != end(); }
228 
234  PBoolean HasFormat(
235  const PString & wildcard
236  ) const { return FindFormat(wildcard) != end(); }
237 
240  bool HasType(
241  const OpalMediaType & type,
242  bool mustBeTransportable = true
243  ) const;
244 
248 
264  void Reorder(
265  const PStringArray & order
266  );
267 
286  void Remove(
287  const PStringArray & mask
288  );
289 
292  void RemoveNonTransportable();
294 
295  private:
296  virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
297  virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
298 };
299 
300 
302 
305 class OpalMediaOption : public PObject
306 {
307  PCLASSINFO(OpalMediaOption, PObject);
308  public:
309  // Note the below enum must be identical to PluginCodec_OptionMerge in opalplugin.h
310  enum MergeType {
318  IntersectionMerge, // Set intersection, applies to numeric (bit wise AND) or string (common substrings)
319 
320  // Synonyms
321  AndMerge = MinMerge, // Applies to Boolean option or Enum with two elements
322  OrMerge = MaxMerge // Applies to Boolean option or Enum with two elements
323  };
324 
325  protected:
327  const PString & name
328  );
330  const char * name,
331  bool readOnly,
332  MergeType merge
333  );
334 
335  public:
336  virtual Comparison Compare(const PObject & obj) const;
337 
338  virtual bool Merge(
339  const OpalMediaOption & option
340  );
341 
342  virtual bool ValidateMerge(
343  const OpalMediaOption & option
344  ) const;
345 
346  virtual Comparison CompareValue(
347  const OpalMediaOption & option
348  ) const = 0;
349  virtual void Assign(
350  const OpalMediaOption & option
351  ) = 0;
352 
353  PString AsString() const;
354  bool FromString(const PString & value);
355 
356  const PString & GetName() const { return m_name; }
357 
358  bool IsReadOnly() const { return m_readOnly; }
359  void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
360 
361  MergeType GetMerge() const { return m_merge; }
362  void SetMerge(MergeType merge) { m_merge = merge; }
363 
364 #if OPAL_SIP
365  const PString & GetFMTPName() const { return m_FMTPName; }
366  void SetFMTPName(const char * name) { m_FMTPName = name; }
367 
368  const PString & GetFMTPDefault() const { return m_FMTPDefault; }
369  void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
370 
371  void SetFMTP(const char * name, const char * dflt)
372  {
373  m_FMTPName = name;
374  m_FMTPDefault = dflt;
375  }
376 #define OPAL_SET_MEDIA_OPTION_FMTP(opt, name, dflt) (opt)->SetFMTP(name, dflt)
377 #else
378 #define OPAL_SET_MEDIA_OPTION_FMTP(opt, name, dflt)
379 #endif // OPAL_SIP
380 
381 #if OPAL_H323
383  H245GenericInfo();
385  unsigned mask,
386  const char * dflt = NULL
387  );
388 
389  unsigned ordinal;
390 
391  enum Modes {
395  } mode;
396 
401  } integerType;
402 
406  int position; // Position in sequence for parameter
407  PString defaultValue; // Do not include parameter if this value
408  };
409 
410  const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
411  void SetH245Generic(const H245GenericInfo & genericInfo) { m_H245Generic = genericInfo; }
412 #define OPAL_SET_MEDIA_OPTION_H245(opt, ...) (opt)->SetH245Generic(OpalMediaOption::H245GenericInfo(__VA_ARGS__))
413 #else
414 #define OPAL_SET_MEDIA_OPTION_H245(opt, ...)
415 #endif // OPAL_H323
416 
417  protected:
418  PCaselessString m_name;
421 
422 #if OPAL_SIP
423  PCaselessString m_FMTPName;
424  PString m_FMTPDefault;
425 #endif // OPAL_SIP
426 
427 #if OPAL_H323
429 #endif // OPAL_H323
430 };
431 
432 
433 template <typename T>
435 {
437  public:
439  const char * name,
440  bool readOnly,
442  T value = T()
443  )
444  : OpalMediaOption(name, readOnly, merge)
445  , m_value(value)
446  {
447  }
448 
449  virtual PObject * Clone() const
450  {
451  return new OpalMediaOptionValue(*this);
452  }
453 
454  virtual void PrintOn(ostream & strm) const
455  {
456  strm << m_value;
457  }
458 
459  virtual void ReadFrom(istream & strm)
460  {
461  strm >> m_value;
462  }
463 
464  virtual bool Merge(const OpalMediaOption & option)
465  {
466  if (m_merge != IntersectionMerge)
467  return OpalMediaOption::Merge(option);
468 
469  const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
470  if (otherOption == NULL)
471  return false;
472 
473  m_value &= otherOption->m_value;
474  return true;
475  }
476 
477  virtual Comparison CompareValue(const OpalMediaOption & option) const
478  {
479  const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
480  if (otherOption == NULL)
481  return GreaterThan;
482  if (m_value < otherOption->m_value)
483  return LessThan;
484  if (m_value > otherOption->m_value)
485  return GreaterThan;
486  return EqualTo;
487  }
488 
489  virtual void Assign(const OpalMediaOption & option)
490  {
491  const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
492  if (otherOption != NULL)
493  m_value = otherOption->m_value;
494  }
495 
496  T GetValue() const
497  {
498  return m_value;
499  }
500 
501  void SetValue(T value)
502  {
503  m_value = value;
504  }
505 
506  protected:
508 };
509 
510 
511 template <typename T>
513 {
516  public:
518  const char * name,
519  bool readOnly,
521  T value = 0,
522  T minimum = std::numeric_limits<T>::min(),
523  T maximum = std::numeric_limits<T>::max()
524  )
525  : BaseClass(name, readOnly, merge, value)
526  , m_minimum(minimum)
527  , m_maximum(maximum)
528  {
529  }
530 
531  virtual PObject * Clone() const
532  {
533  return new OpalMediaOptionNumericalValue(*this);
534  }
535 
536  virtual void ReadFrom(istream & strm)
537  {
538  T temp = 0;
539  strm >> temp;
540  if (strm.fail())
541  return;
542  if (temp >= m_minimum && temp <= m_maximum)
543  this->m_value = temp;
544  else
545  strm.setstate(ios::badbit);
546  }
547 
548  void SetValue(T value)
549  {
550  if (value < m_minimum)
551  this->m_value = m_minimum;
552  else if (value > m_maximum)
553  this->m_value = m_maximum;
554  else
555  this->m_value = value;
556  }
557 
558  void SetMinimum(T m)
559  {
560  this->m_minimum = m;
561  }
562 
563  void SetMaximum(T m)
564  {
565  this->m_maximum = m;
566  }
567 
568  protected:
571 };
572 
573 
577 
578 // Wrapper class so we can implement intersection (&= operator) for floating point
580 {
581  double m_value;
582  public:
583  OpalMediaOptionRealValue(double value = 0) : m_value(value) { }
584  operator double() const { return m_value; }
585  void operator&=(double other) { if (m_value > other) m_value = other; }
586  friend ostream & operator<<(ostream & strm, const OpalMediaOptionRealValue & value) { return strm << value.m_value; }
587  friend istream & operator>>(istream & strm, OpalMediaOptionRealValue & value) { return strm >> value.m_value; }
588 };
589 
591 
592 
594 {
596  public:
598  const char * name,
599  bool readOnly
600  );
602  const char * name,
603  bool readOnly,
604  const char * const * enumerations,
605  PINDEX count,
606  MergeType merge = EqualMerge,
607  PINDEX value = 0
608  );
609 
610  virtual PObject * Clone() const;
611  virtual void PrintOn(ostream & strm) const;
612  virtual void ReadFrom(istream & strm);
613 
614  virtual bool Merge(const OpalMediaOption & option);
615  virtual Comparison CompareValue(const OpalMediaOption & option) const;
616  virtual void Assign(const OpalMediaOption & option);
617 
618  PINDEX GetValue() const { return m_value; }
619  void SetValue(PINDEX value);
620 
621  const PStringArray & GetEnumerations() const { return m_enumerations; }
622  void SetEnumerations(const PStringArray & e)
623  {
624  m_enumerations = e;
625  }
626 
627  protected:
628  PStringArray m_enumerations;
629  PINDEX m_value;
630 };
631 
632 
634 {
636  public:
638  const char * name,
639  bool readOnly
640  );
642  const char * name,
643  bool readOnly,
644  const PString & value
645  );
646 
647  virtual PObject * Clone() const;
648  virtual void PrintOn(ostream & strm) const;
649  virtual void ReadFrom(istream & strm);
650 
651  virtual bool Merge(const OpalMediaOption & option);
652  virtual Comparison CompareValue(const OpalMediaOption & option) const;
653  virtual void Assign(const OpalMediaOption & option);
654 
655  const PString & GetValue() const { return m_value; }
656  void SetValue(const PString & value);
657 
658  protected:
659  PString m_value;
660 };
661 
662 
664 {
666  public:
668  const char * name,
669  bool readOnly,
670  bool base64 = false
671  );
673  const char * name,
674  bool readOnly,
675  bool base64,
676  const PBYTEArray & value
677  );
679  const char * name,
680  bool readOnly,
681  bool base64,
682  const BYTE * data,
683  PINDEX length
684  );
685 
686  virtual PObject * Clone() const;
687  virtual void PrintOn(ostream & strm) const;
688  virtual void ReadFrom(istream & strm);
689 
690  virtual Comparison CompareValue(const OpalMediaOption & option) const;
691  virtual void Assign(const OpalMediaOption & option);
692 
693  const PBYTEArray & GetValue() const { return m_value; }
694  void SetValue(const PBYTEArray & value);
695  void SetValue(const BYTE * data, PINDEX length);
696 
697  void SetBase64(bool b)
698  {
699  m_base64 = b;
700  }
701 
702  protected:
703  PBYTEArray m_value;
704  bool m_base64;
705 };
706 
707 
709 
710 class OpalMediaFormatInternal : public PObject
711 {
712  PCLASSINFO(OpalMediaFormatInternal, PObject);
713  public:
715  const char * fullName,
716  const OpalMediaType & mediaType,
717  RTP_DataFrame::PayloadTypes rtpPayloadType,
718  const char * encodingName,
719  bool needsJitter,
720  OpalBandwidth bandwidth,
721  PINDEX frameSize,
722  unsigned frameTime,
723  unsigned clockRate,
724  time_t timeStamp
725  );
726 
727  const PCaselessString & GetName() const { return formatName; }
728 
729  virtual PObject * Clone() const;
730  virtual void PrintOn(ostream & strm) const;
731 
732  virtual bool IsValid() const;
733  virtual bool IsTransportable() const;
734 
735  virtual PStringToString GetOptions() const;
736  virtual bool GetOptionValue(const PString & name, PString & value) const;
737  virtual bool SetOptionValue(const PString & name, const PString & value);
738  virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
739  virtual bool SetOptionBoolean(const PString & name, bool value);
740  virtual int GetOptionInteger(const PString & name, int dflt) const;
741  virtual bool SetOptionInteger(const PString & name, int value);
742  virtual double GetOptionReal(const PString & name, double dflt) const;
743  virtual bool SetOptionReal(const PString & name, double value);
744  virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
745  virtual bool SetOptionEnum(const PString & name, PINDEX value);
746  virtual PString GetOptionString(const PString & name, const PString & dflt) const;
747  virtual bool SetOptionString(const PString & name, const PString & value);
748  virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
749  virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
750  virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
751  virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = false);
752  virtual OpalMediaOption * FindOption(const PString & name) const;
753 
754  virtual bool ToNormalisedOptions();
755  virtual bool ToCustomisedOptions();
756  virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
757 
758  virtual bool ValidateMerge(const OpalMediaFormatInternal & mediaFormat) const;
759 
760  virtual bool IsValidForProtocol(const PString & protocol) const;
761 
762  protected:
763  bool AdjustByOptionMaps(
764  PTRACE_PARAM(const char * operation,)
765  bool (*adjuster)(PluginCodec_OptionMap & original, PluginCodec_OptionMap & changed)
766  );
767 
768  PCaselessString formatName;
770  PCaselessString rtpEncodingName;
773  PSortedList<OpalMediaOption> options;
776 
777  friend bool operator==(const char * other, const OpalMediaFormat & fmt);
778  friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
779  friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
780  friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
781 
782  friend class OpalMediaFormat;
783  friend class OpalMediaFormatList;
785 };
786 
787 
789 
795 class OpalMediaFormat : public PContainer
796 {
797  PCLASSINFO(OpalMediaFormat, PContainer)
798  public:
799  OpalMediaFormat(const OpalMediaFormat & c);
800  virtual ~OpalMediaFormat();
801  OpalMediaFormat & operator=(const OpalMediaFormat & c) { AssignContents(c); return *this; }
802  virtual PBoolean MakeUnique();
803  protected:
804  virtual void DestroyContents();
805  virtual void AssignContents(const PContainer & c);
806 
807  public:
811  OpalMediaFormatInternal * info = NULL
812  );
813 
828  const char * fullName,
829  const OpalMediaType & mediaType,
830  RTP_DataFrame::PayloadTypes rtpPayloadType,
831  const char * encodingName,
832  PBoolean needsJitter,
833  OpalBandwidth bandwidth,
834  PINDEX frameSize,
835  unsigned frameTime,
836  unsigned clockRate,
837  time_t timeStamp = 0
838  );
839 
850  RTP_DataFrame::PayloadTypes rtpPayloadType,
851  unsigned clockRate,
852  const char * rtpEncodingName = NULL,
853  const char * protocol = NULL
854  );
855 
870  const char * wildcard
871  );
872 
887  const PString & wildcard
888  );
889 
894  RTP_DataFrame::PayloadTypes rtpPayloadType
895  );
896 
901  const char * wildcard
902  );
903 
908  const PString & wildcard
909  );
910 
913  virtual PObject * Clone() const;
914 
917  virtual Comparison Compare(const PObject & obj) const;
918 
923  virtual void PrintOn(ostream & strm) const;
924 
927  virtual void ReadFrom(istream & strm);
928 
933  bool ToNormalisedOptions();
934 
938  bool ToCustomisedOptions();
939 
942  bool Update(
943  const OpalMediaFormat & mediaFormat
944  );
945 
956  bool Merge(
957  const OpalMediaFormat & mediaFormat,
958  bool copyPayloadType = false
959  );
962  bool ValidateMerge(
963  const OpalMediaFormat & mediaFormat
964  ) const;
965 
968  PString GetName() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? "" : m_info->formatName; }
969 
972  PString GetDescription() const { return GetOptionString(DescriptionOption()); }
973  static const PString & DescriptionOption();
974 
979  PBoolean IsValid() const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->IsValid(); }
980 
984  PBoolean IsTransportable() const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->IsTransportable(); }
985 
992  void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(m_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
993 
996  const char * GetEncodingName() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? "" : (const char *)m_info->rtpEncodingName; }
997 
1000  OpalMediaType GetMediaType() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
1001 
1005  bool IsMediaType(const OpalMediaType & mediaType) const;
1006 
1011  static const PString & NeedsJitterOption();
1012 
1016  static const PString & MaxBitRateOption();
1017 
1021  static const PString & TargetBitRateOption();
1022 
1027  PINDEX GetFrameSize() const { return GetOptionInteger(MaxFrameSizeOption()); }
1028  static const PString & MaxFrameSizeOption();
1029 
1033  unsigned GetFrameTime() const { return GetOptionInteger(FrameTimeOption()); }
1034  static const PString & FrameTimeOption();
1035 
1038  unsigned GetTimeUnits() const { return GetClockRate()/1000; }
1039 
1043  };
1044 
1048  static const PString & ClockRateOption();
1049 
1052  static const PString & ProtocolOption();
1053 
1060  static const PString & MaxTxPacketSizeOption();
1061 
1065  PStringToString GetOptions() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
1066 
1069  PINDEX GetOptionCount() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
1070 
1075  PINDEX index
1076  ) const { PWaitAndSignal m(m_mutex); return m_info->options[index]; }
1077 
1083  const PString & name,
1084  PString & value
1085  ) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
1086 
1094  const PString & name,
1095  const PString & value
1096  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
1097 
1102  const PString & name,
1103  bool dflt = false
1104  ) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
1105 
1113  const PString & name,
1114  bool value
1115  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
1116 
1121  const PString & name,
1122  int dflt = 0
1123  ) const { PWaitAndSignal m(m_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
1124 
1133  const PString & name,
1134  int value
1135  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
1136 
1141  const PString & name,
1142  double dflt = 0
1143  ) const { PWaitAndSignal m(m_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
1144 
1152  const PString & name,
1153  double value
1154  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
1155 
1163  template <typename Enum>
1165  const PString & name,
1166  Enum dflt = (Enum)0
1167  ) const { PWaitAndSignal m(m_mutex); return m_info == NULL ? dflt : (Enum)m_info->GetOptionEnum(name, dflt); }
1168 
1178  template <typename Enum>
1180  const PString & name,
1181  Enum value
1182  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
1183 
1188  const PString & name,
1189  const PString & dflt = PString::Empty()
1190  ) const { PWaitAndSignal m(m_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
1191 
1199  const PString & name,
1200  const PString & value
1201  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
1202 
1207  const PString & name,
1208  PBYTEArray & octets
1209  ) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
1210 
1218  const PString & name,
1219  const PBYTEArray & octets
1220  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
1222  const PString & name,
1223  const BYTE * data,
1224  PINDEX length
1225  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
1226 
1230  static void GetAllRegisteredMediaFormats(
1231  OpalMediaFormatList & copy
1232  );
1233 
1240  static bool RegisterKnownMediaFormats(
1241  const PString & name = PString::Empty()
1242  );
1243 
1247  static bool SetRegisteredMediaFormat(
1248  const OpalMediaFormat & mediaFormat
1249  );
1250 
1254  static bool RemoveRegisteredMediaFormat(
1255  const OpalMediaFormat & mediaFormat
1256  );
1257 
1262  OpalMediaOption * option,
1263  PBoolean overwrite = false
1264  ) { PWaitAndSignal m(m_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
1265 
1269  bool HasOption(const PString & name) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
1270 
1275  const PString & name
1276  ) const { PWaitAndSignal m(m_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
1277 
1281  template <class T> T * FindOptionAs(
1282  const PString & name
1283  ) const { return dynamic_cast<T *>(FindOption(name)); }
1284 
1290  bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
1291 
1292  time_t GetCodecVersionTime() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
1293 
1294  ostream & PrintOptions(ostream & strm) const
1295  {
1296  PWaitAndSignal m(m_mutex);
1297  if (m_info != NULL)
1298  strm << setw(-1) << *m_info;
1299  return strm;
1300  }
1301 
1302 #if OPAL_VIDEO
1303 
1305  void AdjustVideoArgs(
1306  PVideoDevice::OpenArgs & args
1307  ) const;
1308 #endif
1309 
1310  // Backward compatibility
1311  virtual PBoolean IsEmpty() const { PWaitAndSignal m(m_mutex); return m_info == NULL || !m_info->IsValid(); }
1312  operator PString() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? "" : m_info->formatName; }
1313  operator const char *() const { PWaitAndSignal m(m_mutex); return m_info == NULL ? "" : m_info->formatName; }
1314  bool operator==(const char * other) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->formatName == other; }
1315  bool operator!=(const char * other) const { PWaitAndSignal m(m_mutex); return m_info == NULL || m_info->formatName != other; }
1316  bool operator==(const PString & other) const { PWaitAndSignal m(m_mutex); return m_info != NULL && m_info->formatName == other; }
1317  bool operator!=(const PString & other) const { PWaitAndSignal m(m_mutex); return m_info == NULL || m_info->formatName != other; }
1318  bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(m_mutex); return Compare(other) == EqualTo; }
1319  bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(m_mutex); return Compare(other) != EqualTo; }
1320  friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
1321  friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
1322  friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
1323  friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
1324 
1325 #if OPAL_H323
1326  static const PString & MediaPacketizationOption();
1327  static const PString & MediaPacketizationsOption();
1328  PStringArray GetMediaPacketizations() const;
1329  PStringSet GetMediaPacketizationSet() const { return PStringSet(GetMediaPacketizations()); }
1330  void SetMediaPacketizations(const PStringSet & packetizations);
1331 #endif
1332 
1333  private:
1334  PBoolean SetSize(PINDEX) { return true; }
1335 
1336  protected:
1337  void Construct(OpalMediaFormatInternal * info);
1338 
1340  PMutex m_mutex;
1341 
1343  friend class OpalMediaFormatList;
1344  friend class OpalVideoFormat;
1345 };
1346 
1347 
1349 {
1350  public:
1352  const char * fullName,
1353  RTP_DataFrame::PayloadTypes rtpPayloadType,
1354  const char * encodingName,
1355  PINDEX frameSize,
1356  unsigned frameTime,
1357  unsigned rxFrames,
1358  unsigned txFrames,
1359  unsigned maxFrames,
1360  unsigned clockRate,
1361  time_t timeStamp = 0,
1362  unsigned channels = 1
1363  );
1364  virtual PObject * Clone() const;
1365  virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
1366 };
1367 
1369 {
1370  PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
1371  public:
1373  OpalMediaFormatInternal * info = NULL
1374  ) : OpalMediaFormat(info) { }
1376  const char * fullName
1377  ) : OpalMediaFormat(fullName) { }
1379  const char * fullName,
1380  RTP_DataFrame::PayloadTypes rtpPayloadType,
1381  const char * encodingName,
1382  PINDEX frameSize,
1383  unsigned frameTime,
1384  unsigned rxFrames,
1385  unsigned txFrames,
1386  unsigned maxFrames = 256,
1387  unsigned clockRate = 8000,
1388  time_t timeStamp = 0,
1389  unsigned channels = 1
1390  );
1391 
1392  static const PString & RxFramesPerPacketOption();
1393  static const PString & TxFramesPerPacketOption();
1394  static const PString & MaxFramesPerPacketOption();
1395  static const PString & ChannelsOption();
1396 };
1397 
1398 #if OPAL_VIDEO
1399 
1401 
1403 {
1404  PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
1405  public:
1407  OpalVideoFormatInternal * info = NULL
1408  );
1410  const char * fullName
1411  ) : OpalMediaFormat(fullName) { }
1413  const char * fullName,
1414  RTP_DataFrame::PayloadTypes rtpPayloadType,
1415  const char * encodingName,
1416  unsigned maxFrameWidth,
1417  unsigned maxFrameHeight,
1418  unsigned maxFrameRate,
1419  unsigned maxBitRate,
1420  time_t timeStamp = 0
1421  );
1422 
1423  OpalVideoFormat & operator=(const OpalMediaFormat & other);
1424 
1425  static const PString & FrameWidthOption();
1426  static const PString & FrameHeightOption();
1427  static const PString & MinRxFrameWidthOption();
1428  static const PString & MinRxFrameHeightOption();
1429  static const PString & MaxRxFrameWidthOption();
1430  static const PString & MaxRxFrameHeightOption();
1431  static const PString & TemporalSpatialTradeOffOption();
1432  static const PString & TxKeyFramePeriodOption();
1433  static const PString & RateControlPeriodOption(); // Period over which the rate controller maintains the target bit rate.
1434  static const PString & RateControllerOption(); // String for controller algorithm. Empty is none.
1435  static const PString & FreezeUntilIntraFrameOption();
1436 
1447  P_DECLARE_STREAMABLE_ENUM(ContentRole,
1448  eNoRole,
1449  ePresentation,
1450  eMainRole,
1451  eSpeaker,
1452  eSignLanguage
1453  );
1454 
1455  enum { ContentRoleMask = 15 };
1456  __inline static unsigned ContentRoleBit(ContentRole contentRole) { return contentRole != eNoRole ? (1<<(contentRole-1)) : 0; }
1457  static const PString & ContentRoleOption();
1458  static const PString & ContentRoleMaskOption();
1459 
1462  RTCPFeedback,
1463  7,
1464  (
1465  e_NoRTCPFb,
1466  e_PLI,
1467  e_FIR,
1468  e_TMMBR,
1469  e_TSTR,
1470  e_VBCM,
1471  e_NACK,
1472  e_SLI
1473  ),
1474  "", "pli", "fir", "tmmbr", "tstr", "vcbm", "nack", "sli"
1475  );
1477  static const PString & RTCPFeedbackOption();
1478 
1479 #if OPAL_SIP
1480 
1481  P_DECLARE_STREAMABLE_ENUM(ImageAttributeInSDP,
1482  ImageAttrSuppressed,
1483  ImageAddrOffered,
1484  ImageAttrAnswerRequired
1485  );
1487  static const PString & UseImageAttributeInSDP();
1488 #endif
1489 
1495  };
1496  VideoFrameType GetVideoFrameType(const BYTE * payloadPtr, PINDEX payloadSize, PBYTEArray & context) const;
1497 };
1498 
1500 {
1501  public:
1503  const char * fullName,
1504  RTP_DataFrame::PayloadTypes rtpPayloadType,
1505  const char * encodingName,
1506  unsigned maxFrameWidth,
1507  unsigned maxFrameHeight,
1508  unsigned maxFrameRate,
1509  unsigned maxBitRate,
1510  time_t timeStamp = 0
1511  );
1512  virtual PObject * Clone() const;
1513  virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
1514  virtual OpalVideoFormat::VideoFrameType GetVideoFrameType(const BYTE * payloadPtr, PINDEX payloadSize, PBYTEArray & context) const;
1515 };
1516 
1517 #endif // OPAL_VIDEO
1518 
1519 
1520 #include <codec/known.h>
1521 
1522 
1523 extern const OpalAudioFormat & GetOpalPCM16(unsigned clockRate, unsigned channels = 1);
1524 
1525 extern const OpalAudioFormat & GetOpalPCM16();
1526 extern const OpalAudioFormat & GetOpalPCM16S();
1527 extern const OpalAudioFormat & GetOpalPCM16_12KHZ();
1528 extern const OpalAudioFormat & GetOpalPCM16S_12KHZ();
1529 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
1530 extern const OpalAudioFormat & GetOpalPCM16S_16KHZ();
1531 extern const OpalAudioFormat & GetOpalPCM16_24KHZ();
1532 extern const OpalAudioFormat & GetOpalPCM16S_24KHZ();
1533 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
1534 extern const OpalAudioFormat & GetOpalPCM16S_32KHZ();
1535 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
1536 extern const OpalAudioFormat & GetOpalPCM16S_48KHZ();
1537 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
1538 extern const OpalAudioFormat & GetOpalL16_STEREO_8KHZ();
1539 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
1540 extern const OpalAudioFormat & GetOpalL16_STEREO_16KHZ();
1541 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
1542 extern const OpalAudioFormat & GetOpalL16_STEREO_32KHZ();
1543 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
1544 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
1545 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
1546 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
1547 extern const OpalAudioFormat & GetOpalG722();
1548 extern const OpalAudioFormat & GetOpalG7221_24K();
1549 extern const OpalAudioFormat & GetOpalG7221_32K();
1550 extern const OpalAudioFormat & GetOpalG7221C_24K();
1551 extern const OpalAudioFormat & GetOpalG7221C_32K();
1552 extern const OpalAudioFormat & GetOpalG7221C_48K();
1553 extern const OpalAudioFormat & GetOpalG7222();
1554 extern const OpalAudioFormat & GetOpalG726_40K();
1555 extern const OpalAudioFormat & GetOpalG726_32K();
1556 extern const OpalAudioFormat & GetOpalG726_24K();
1557 extern const OpalAudioFormat & GetOpalG726_16K();
1558 extern const OpalAudioFormat & GetOpalG728();
1559 extern const OpalAudioFormat & GetOpalG729();
1560 extern const OpalAudioFormat & GetOpalG729A();
1561 extern const OpalAudioFormat & GetOpalG729B();
1562 extern const OpalAudioFormat & GetOpalG729AB();
1563 extern const OpalAudioFormat & GetOpalG7231_6k3();
1564 extern const OpalAudioFormat & GetOpalG7231_5k3();
1565 extern const OpalAudioFormat & GetOpalG7231A_6k3();
1566 extern const OpalAudioFormat & GetOpalG7231A_5k3();
1567 extern const OpalAudioFormat & GetOpalG7231_Cisco_A();
1568 extern const OpalAudioFormat & GetOpalG7231_Cisco_AR();
1569 extern const OpalAudioFormat & GetOpalGSM0610();
1570 extern const OpalAudioFormat & GetOpalGSMAMR();
1571 extern const OpalAudioFormat & GetOpaliLBC();
1572 extern const OpalAudioFormat & GetOpalSpeexNB();
1573 extern const OpalAudioFormat & GetOpalSpeexWB();
1574 
1575 #if OPAL_VIDEO
1576 extern const OpalVideoFormat & GetOpalH261();
1577 extern const OpalVideoFormat & GetOpalH263();
1578 extern const OpalVideoFormat & GetOpalH263plus();
1579 extern const OpalVideoFormat & GetOpalH264_MODE0();
1580 extern const OpalVideoFormat & GetOpalH264_MODE1();
1581 extern const OpalVideoFormat & GetOpalMPEG4();
1582 #endif // OPAL_VIDEO
1583 
1584 extern const OpalMediaFormat & GetOpalRFC2833();
1585 
1586 #if OPAL_T38_CAPABILITY
1587 extern const OpalMediaFormat & GetOpalCiscoNSE();
1588 extern const OpalMediaFormat & GetOpalT38();
1589 #endif
1590 
1591 
1592 #define OpalPCM16 GetOpalPCM16()
1593 #define OpalPCM16S GetOpalPCM16S()
1594 #define OpalPCM16_12KHZ GetOpalPCM16_12KHZ()
1595 #define OpalPCM16S_12KHZ GetOpalPCM16S_12KHZ()
1596 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
1597 #define OpalPCM16S_16KHZ GetOpalPCM16S_16KHZ()
1598 #define OpalPCM16_24KHZ GetOpalPCM16_24KHZ()
1599 #define OpalPCM16S_24KHZ GetOpalPCM16S_24KHZ()
1600 #define OpalPCM16_32KHZ GetOpalPCM16_32KHZ()
1601 #define OpalPCM16S_32KHZ GetOpalPCM16S_32KHZ()
1602 #define OpalPCM16_48KHZ GetOpalPCM16_48KHZ()
1603 #define OpalPCM16S_48KHZ GetOpalPCM16S_48KHZ()
1604 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
1605 #define OpalL16_STEREO_8KHZ GetOpalL16_STEREO_8KHZ()
1606 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
1607 #define OpalL16_STEREO_16KHZ GetOpalL16_STEREO_16KHZ()
1608 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
1609 #define OpalL16_STEREO_32KHZ GetOpalL16_STEREO_32KHZ()
1610 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
1611 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
1612 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
1613 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
1614 #define OpalG722 GetOpalG722()
1615 #define OpalG7221 OpalG7221_32K
1616 #define OpalG7221_24K GetOpalG7221_24K()
1617 #define OpalG7221_32K GetOpalG7221_32K()
1618 #define OpalG7221C_24K GetOpalG7221C_24K()
1619 #define OpalG7221C_32K GetOpalG7221C_32K()
1620 #define OpalG7221C_48K GetOpalG7221C_48K()
1621 #define OpalG7222 GetOpalG7222()
1622 #define OpalG726_40K GetOpalG726_40K()
1623 #define OpalG726_32K GetOpalG726_32K()
1624 #define OpalG726_24K GetOpalG726_24K()
1625 #define OpalG726_16K GetOpalG726_16K()
1626 #define OpalG728 GetOpalG728()
1627 #define OpalG729 GetOpalG729()
1628 #define OpalG729A GetOpalG729A()
1629 #define OpalG729B GetOpalG729B()
1630 #define OpalG729AB GetOpalG729AB()
1631 #define OpalG7231_6k3 GetOpalG7231_6k3()
1632 #define OpalG7231_5k3 GetOpalG7231_5k3()
1633 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
1634 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
1635 #define OpalG7231_Cisco_A GetOpalG7231_Cisco_A()
1636 #define OpalG7231_Cisco_AR GetOpalG7231_Cisco_AR()
1637 #define OpalGSM0610 GetOpalGSM0610()
1638 #define OpalGSMAMR GetOpalGSMAMR()
1639 #define OpaliLBC GetOpaliLBC()
1640 #define OpalSpeexNB GetOpalSpeexNB()
1641 #define OpalSpeexWB GetOpalSpeexWB()
1642 #define OpalRFC2833 GetOpalRFC2833()
1643 #define OpalCiscoNSE GetOpalCiscoNSE()
1644 #define OpalT38 GetOpalT38()
1645 
1646 #if OPAL_VIDEO
1647 #define OpalH261 GetOpalH261()
1648 #define OpalH263 GetOpalH263()
1649 #define OpalH263plus GetOpalH263plus()
1650 #define OpalH264 GetOpalH264_MODE1()
1651 #define OpalH264_MODE0 GetOpalH264_MODE0()
1652 #define OpalH264_MODE1 GetOpalH264_MODE1()
1653 #define OpalMPEG4 GetOpalMPEG4()
1654 #endif
1655 
1656 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
1657 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
1658 #define OpalG711uLaw OpalG711_ULAW_64K
1659 #define OpalG711ALaw OpalG711_ALAW_64K
1660 
1661 
1662 #endif // OPAL_OPAL_MEDIAFMT_H
1663 
1664 
1665 // End of File ///////////////////////////////////////////////////////////////