00001
00002
00003 #ifndef _MPEG_DESCRIPTORS_H_
00004 #define _MPEG_DESCRIPTORS_H_
00005
00006 #include <cassert>
00007 #include "iso639.h"
00008
00009 typedef vector<const unsigned char*> desc_list_t;
00010
00011 class DescriptorID
00012 {
00013 public:
00014 enum
00015 {
00016
00017 video = 0x02,
00018 audio = 0x03,
00019 hierarchy = 0x04,
00020 registration = 0x05,
00021 data_stream_alignment = 0x06,
00022 target_background_grid = 0x07,
00023 video_window = 0x08,
00024 conditional_access = 0x09,
00025 ISO_639_language = 0x0A,
00026 system_clock = 0x0B,
00027 multiplex_buffer_utilization= 0x0C,
00028 copyright = 0x0D,
00029 maximum_bitrate = 0x0E,
00030 private_data_indicator = 0x0F,
00031 smoothing_buffer = 0x10,
00032 STD = 0x11,
00033 IBP = 0x12,
00034 mpeg4_video = 0x1B,
00035 mpeg4_audio = 0x1C,
00036 IOD = 0x1D,
00037 SL = 0x1E,
00038 FMC = 0x1F,
00039 external_es_id = 0x20,
00040 mux_code = 0x21,
00041 fmx_buffer_size = 0x22,
00042 multiplex_buffer = 0x23,
00043 content_labeling = 0x24,
00044 metadata_pointer = 0x25,
00045 metadata = 0x26,
00046 metadata_std = 0x27,
00047 avc_video = 0x28,
00048 ipmp = 0x29,
00049 avc_timing__hrd = 0x30,
00050
00051
00052 network_name = 0x40,
00053 service_list = 0x41,
00054 dvb_stuffing = 0x42,
00055 satellite_delivery_system = 0x43,
00056 cable_delivery_system = 0x44,
00057 VBI_data = 0x45,
00058 VBI_teletext = 0x46,
00059 bouquet_name = 0x47,
00060 service = 0x48,
00061 country_availability = 0x49,
00062 linkage = 0x4A,
00063 NVOD_reference = 0x4B,
00064 dvb_time_shifted_service = 0x4C,
00065 short_event = 0x4D,
00066 extended_event = 0x4E,
00067 time_shifted_event = 0x4F,
00068 component = 0x50,
00069 mosaic = 0x51,
00070 stream_identifier = 0x52,
00071 CA_identifier = 0x53,
00072 content = 0x54,
00073 parental_rating = 0x55,
00074 teletext = 0x56,
00075 telephone = 0x57,
00076 local_time_offset = 0x58,
00077 subtitling = 0x59,
00078 terrestrial_delivery_system = 0x5A,
00079 multilingual_network_name = 0x5B,
00080 multilingual_bouquet_name = 0x5C,
00081 multilingual_service_name = 0x5D,
00082 multilingual_component = 0x5E,
00083 private_data_specifier = 0x5F,
00084 service_move = 0x60,
00085 short_smoothing_buffer = 0x61,
00086 frequency_list = 0x62,
00087 partial_transport_stream = 0x63,
00088 data_broadcast = 0x64,
00089 scrambling = 0x65,
00090 data_broadcast_id = 0x66,
00091 transport_stream = 0x67,
00092 DSNG = 0x68,
00093 PDC = 0x69,
00094 AC3 = 0x6A,
00095 ancillary_data = 0x6B,
00096 cell_list = 0x6C,
00097 cell_frequency_link = 0x6D,
00098 announcement_support = 0x6E,
00099 application_signalling = 0x6F,
00100 adaptation_field_data = 0x70,
00101 service_identifier = 0x71,
00102 service_availability = 0x72,
00103 default_authority = 0x73,
00104 related_content = 0x74,
00105 TVA_id = 0x75,
00106 dvb_content_identifier = 0x76,
00107 time_slice_fec_identifier = 0x77,
00108 ECM_repetition_rate = 0x78,
00109
00110
00111 dvb_uk_channel_list = 0x83,
00112
00113
00114 atsc_stuffing = 0x80,
00115 audio_stream = 0x81,
00116 caption_service = 0x86,
00117 content_advisory = 0x87,
00118
00119
00120 dish_event_name = 0x91,
00121 dish_event_description = 0x92,
00122
00123
00124 extended_channel_name = 0xA0,
00125 service_location = 0xA1,
00126 atsc_time_shifted_service = 0xA2,
00127 component_name = 0xA3,
00128 DCC_departing_request = 0xA8,
00129 DCC_arriving_request = 0xA9,
00130 DRM_control = 0xAA,
00131 atsc_content_identifier = 0xB6,
00132
00133
00134 premiere_content_order = 0xF0,
00135 premiere_parental_information = 0xF1,
00136 premiere_content_transmission = 0xF2,
00137 };
00138 };
00139
00140 class MPEGDescriptor
00141 {
00142 public:
00143 operator const unsigned char*() const { return _data; }
00144
00145 MPEGDescriptor(const unsigned char* data) : _data(data) { ; }
00146 virtual ~MPEGDescriptor() {}
00147
00148 uint DescriptorTag() const { return _data[0]; }
00149 QString DescriptorTagString() const;
00150 uint DescriptorLength() const { return _data[1]; }
00151 static desc_list_t Parse(const unsigned char* data, uint len);
00152 static desc_list_t ParseAndExclude(const unsigned char* data, uint len,
00153 int descriptorid);
00154 static desc_list_t ParseOnlyInclude(const unsigned char* data, uint len,
00155 int descriptorid);
00156
00157 static const unsigned char* Find(const desc_list_t &parsed, uint desc_tag);
00158 static desc_list_t FindAll(const desc_list_t &parsed, uint desc_tag);
00159
00160 static const unsigned char* FindBestMatch(
00161 const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
00162 static desc_list_t FindBestMatches(
00163 const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);
00164
00165 virtual QString toString() const;
00166 protected:
00167 const unsigned char* _data;
00168 };
00169
00170
00171 class RegistrationDescriptor : public MPEGDescriptor
00172 {
00173 public:
00174 RegistrationDescriptor(const unsigned char* data) : MPEGDescriptor(data)
00175 {
00176 assert(DescriptorID::registration == DescriptorTag());
00177 if (0x04 != DescriptorLength())
00178 {
00179
00180 }
00181 }
00182
00183 uint FormatIdentifier(void) const
00184 { return (_data[2]<<24) | (_data[3]<<16) | (_data[4]<<8) | _data[5]; }
00185 QString FormatIdentifierString(void) const
00186 {
00187 return QString("") + QChar(_data[2]) + QChar(_data[3]) +
00188 QChar(_data[4]) + QChar(_data[5]);
00189 }
00190 QString toString() const;
00191 };
00192
00193 class ConditionalAccessDescriptor : public MPEGDescriptor
00194 {
00195 public:
00196 ConditionalAccessDescriptor(const unsigned char* data) : MPEGDescriptor(data)
00197 {
00198 assert(DescriptorID::conditional_access == DescriptorTag());
00199 }
00200 uint SystemID(void) const { return _data[2] << 8 | _data[3]; }
00201 uint PID(void) const { return (_data[4] & 0x1F) << 8 | _data[5]; }
00202 uint DataSize(void) const { return DescriptorLength() - 4; }
00203 const unsigned char* Data(void) const { return _data+6; }
00204 QString toString() const;
00205 };
00206
00207 class ISO639LanguageDescriptor : public MPEGDescriptor
00208 {
00209 public:
00210 ISO639LanguageDescriptor(const unsigned char* data) : MPEGDescriptor(data)
00211 {
00212 assert(DescriptorID::ISO_639_language == DescriptorTag());
00213 }
00214 const unsigned char* CodeRaw() const { return &_data[2]; }
00215
00216 int LanguageKey(void) const
00217 { return iso639_str3_to_key(&_data[2]); }
00218 QString LanguageString(void) const
00219 { return iso639_key_to_str3(LanguageKey()); }
00220 int CanonicalLanguageKey(void) const
00221 { return iso639_key_to_canonical_key(LanguageKey()); }
00222 QString CanonicalLanguageString(void) const
00223 { return iso639_key_to_str3(CanonicalLanguageKey()); }
00224 QString toString() const;
00225 };
00226
00228 class AVCVideoDescriptor : public MPEGDescriptor
00229 {
00230 public:
00231 AVCVideoDescriptor(const unsigned char* data) : MPEGDescriptor(data)
00232 {
00233
00234
00235 assert(DescriptorID::avc_video == DescriptorTag());
00236
00237 }
00238
00239 uint ProfileIDC(void) const { return _data[2]; }
00240
00241 bool ConstaintSet0(void) const { return _data[3]&0x80; }
00242
00243 bool ConstaintSet1(void) const { return _data[3]&0x40; }
00244
00245 bool ConstaintSet2(void) const { return _data[3]&0x20; }
00246
00247 uint AVCCompatible(void) const { return _data[3]&0x1f; }
00248
00249 uint LevelIDC(void) const { return _data[4]; }
00250
00251 bool AVCStill(void) const { return _data[5]&0x80; }
00252
00253 bool AVC24HourPicture(void) const { return _data[5]&0x40; }
00254
00255 QString toString() const;
00256 };
00257
00259 class AVCTimingAndHRDDescriptor : public MPEGDescriptor
00260 {
00261 AVCTimingAndHRDDescriptor(const unsigned char* data) : MPEGDescriptor(data)
00262 {
00263
00264
00265 assert(DescriptorID::avc_timing__hrd == DescriptorTag());
00266
00267 }
00268
00269 bool HRDManagementValid(void) const { return _data[2]&0x80; }
00270
00271
00272 bool HasPictureAndTimingInfo(void) const { return _data[2]&0x01;}
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 };
00287
00288 #endif // _MPEG_DESCRIPTORS_H_