1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
#[derive(Clone, Debug)]
pub enum TagDVB {
    NetworkName,
    ServiceList,
    Stuffing,
    SatelliteDeliverySystem,
    CableDeliverySystem,
    VBIData,
    VBITeletext,
    BouquetName,
    Service,
    CountryAvailability,
    Linkage,
    NVODReference,
    TimeShiftedService,
    ShortEvent,
    ExtendedEvent,
    TimeShiftedEvent,
    Component,
    Mosaic,
    StreamIdentifier,
    CAIdentifier,
    Content,
    ParentalRating,
    Teletext,
    Telephone,
    LocalTimeOffset,
    Subtitling,
    TerrestrialDeliverySystem,
    MultilingualNetworkName,
    MultilingualBouquetName,
    MultilingualServiceName,
    MultilingualComponent,
    PrivateDataSpecifier,
    ServiceMove,
    ShortSmoothingBuffer,
    FrequencyList,
    PartialTransportStream,
    DataBroadcast,
    Scrambling,
    DataBroadcastId,
    TransportStream,
    DSNG,
    PDC,
    AC3,
    AncillaryData,
    CellList,
    CellFrequencyLink,
    AnnouncementSupport,
    ApplicationSignalling,
    AdaptationFieldData,
    ServiceIdentifier,
    ServiceAvailability,
    DefaultAuthority,
    RelatedContent,
    TVAId,
    ContentIdentifier,
    TimeSliceFecIdentifier,
    ECMRepetitionRate,
    S2SatelliteDeliverySystem,
    EnhancedAC3,
    DTSDescriptor,
    AAC,
    XAITLocation,
    FTAContentManagement,
    Extension,
}

#[derive(Clone, Debug)]
pub enum Tag {
    VH2621381811172,
    A1381811172,
    Hierarchy,
    RegistrationPrivate,
    DataStreamAlignment,
    TargetBackgroundGrid,
    VideoWindow,
    CASEMMECMPID,
    ISO639,
    SystemClockExternalReference,
    MultiplexBufferUtilizationBounds,
    CopyrightIdentificationSystemAndReference,
    MaximumBitRate,
    PrivateDataIndicator,
    SmoothingBuffer,
    STDVideoBufferLeakControl,
    IBPVideoIFrameIndicator,
    DSMCCCarouselIdentifier,
    DSMCCAssociationTag,
    DSMCCDeferredAssociationTag,
    DSMCCReserved,
    DSMCCNPTReference,
    DSMCCNPTEndpoint,
    DSMCCStreamMode,
    DSMCCStreamEvent,
    VideoStreamHeaderParametersMPEG4H263Based,
    AudioStreamHeaderParametersMPEG4LOASMultiFormatFramed,
    IODParametersForISOIEC144961,
    SLParametersForISOIEC144961,
    FMCParametersForISOIEC144961,
    ExternalESIdentifierForISOIEC144961,
    MuxCodeForISOIEC144961,
    FMXBufferSizeForISOIEC144961,
    MultiplexBufferForISOIEC144961,
    ContentLabelingForISOIEC144961,
    MetadataPointer,
    Metadata,
    MetadataSTD,
    VideoStreamHeaderParametersForITUTRecH264AndISOIEC1449610,
    ISOIEC1381811IPMPDRM,
    TimingAndHRDForITUTRecH264andISOIEC1449610,
    AudioStreamHeaderParametersForISOIEC138187ADTSAAC,
    FlexMuxTimingForISOIEC144961,
    TextStreamHeaderParametersForISOIEC14496,
    AudioExtensionStreamHeaderParametersForISOIEC144963MPEG4LOASMultiFormatFramed,
    VideoAuxiliaryStreamHeaderParameters,
    VideoScalableStreamHeaderParameters,
    VideoMultiStreamHeaderParameters,
    VideoStreamHeaderParametersForITUTRecT800AndISOIEC15444,
    VideoMultiOperationPointStreamHeaderParameters,
    VideoStereoscopic3DStreamHeaderParametersForITUTRecH262ISOIEC138182AndISOIEC111722,
    ProgramStereoscopic3DInformation,
    VideoStereoscopic3DInformation,

    VideoLANFourCCVideoSizeAndCodecInitializationData,

    // 0x40...0x7F
    DVB(TagDVB),

    // 0x00...0x01
    // 0x37...0x3F
    Reserved(u8),

    // 0x80...0x9F | 0xA1...0xCF
    ATSC(u8),

    // 0xD0...0xDF
    ISDB(u8),

    // 0xE0...0xE9
    CableLabs(u8),

    // 0xEA...0xFE
    Other(u8),

    // 0xFF
    Forbidden,
}

impl Tag {
    #[inline(always)]
    pub fn is_dvb_service(&self) -> bool {
        match self {
            Tag::DVB(TagDVB::Service) => true,
            _ => false,
        }
    }

    #[inline(always)]
    pub fn is_dvb_short_event(&self) -> bool {
        match self {
            Tag::DVB(TagDVB::ShortEvent) => true,
            _ => false,
        }
    }
}

impl From<u8> for Tag {
    fn from(d: u8) -> Self {
        match d {
            0x02 => Tag::VH2621381811172,
            0x03 => Tag::A1381811172,
            0x04 => Tag::Hierarchy,
            0x05 => Tag::RegistrationPrivate,
            0x06 => Tag::DataStreamAlignment,
            0x07 => Tag::TargetBackgroundGrid,
            0x08 => Tag::VideoWindow,
            0x09 => Tag::CASEMMECMPID,
            0x0A => Tag::ISO639,
            0x0B => Tag::SystemClockExternalReference,
            0x0C => Tag::MultiplexBufferUtilizationBounds,
            0x0D => Tag::CopyrightIdentificationSystemAndReference,
            0x0E => Tag::MaximumBitRate,
            0x0F => Tag::PrivateDataIndicator,
            0x10 => Tag::SmoothingBuffer,
            0x11 => Tag::STDVideoBufferLeakControl,
            0x12 => Tag::IBPVideoIFrameIndicator,
            0x13 => Tag::DSMCCCarouselIdentifier,
            0x14 => Tag::DSMCCAssociationTag,
            0x15 => Tag::DSMCCDeferredAssociationTag,
            0x16 => Tag::DSMCCReserved,
            0x17 => Tag::DSMCCNPTReference,
            0x18 => Tag::DSMCCNPTEndpoint,
            0x19 => Tag::DSMCCStreamMode,
            0x1A => Tag::DSMCCStreamEvent,
            0x1B => Tag::VideoStreamHeaderParametersMPEG4H263Based,
            0x1C => Tag::AudioStreamHeaderParametersMPEG4LOASMultiFormatFramed,
            0x1D => Tag::IODParametersForISOIEC144961,
            0x1E => Tag::SLParametersForISOIEC144961,
            0x1F => Tag::FMCParametersForISOIEC144961,
            0x20 => Tag::ExternalESIdentifierForISOIEC144961,
            0x21 => Tag::MuxCodeForISOIEC144961,
            0x22 => Tag::FMXBufferSizeForISOIEC144961,
            0x23 => Tag::MultiplexBufferForISOIEC144961,
            0x24 => Tag::ContentLabelingForISOIEC144961,
            0x25 => Tag::MetadataPointer,
            0x26 => Tag::Metadata,
            0x27 => Tag::MetadataSTD,
            0x28 => Tag::VideoStreamHeaderParametersForITUTRecH264AndISOIEC1449610,
            0x29 => Tag::ISOIEC1381811IPMPDRM,
            0x2A => Tag::TimingAndHRDForITUTRecH264andISOIEC1449610,
            0x2B => Tag::AudioStreamHeaderParametersForISOIEC138187ADTSAAC,
            0x2C => Tag::FlexMuxTimingForISOIEC144961,
            0x2D => Tag::TextStreamHeaderParametersForISOIEC14496,
            0x2E => Tag::AudioExtensionStreamHeaderParametersForISOIEC144963MPEG4LOASMultiFormatFramed,
            0x2F => Tag::VideoAuxiliaryStreamHeaderParameters,
            0x30 => Tag::VideoScalableStreamHeaderParameters,
            0x31 => Tag::VideoMultiStreamHeaderParameters,
            0x32 => Tag::VideoStreamHeaderParametersForITUTRecT800AndISOIEC15444,
            0x33 => Tag::VideoMultiOperationPointStreamHeaderParameters,
            0x34 => Tag::VideoStereoscopic3DStreamHeaderParametersForITUTRecH262ISOIEC138182AndISOIEC111722,
            0x35 => Tag::ProgramStereoscopic3DInformation,
            0x36 => Tag::VideoStereoscopic3DInformation,

            0xA0 => Tag::VideoLANFourCCVideoSizeAndCodecInitializationData,

            0x40 => Tag::DVB(TagDVB::NetworkName),
            0x41 => Tag::DVB(TagDVB::ServiceList),
            0x42 => Tag::DVB(TagDVB::Stuffing),
            0x43 => Tag::DVB(TagDVB::SatelliteDeliverySystem),
            0x44 => Tag::DVB(TagDVB::CableDeliverySystem),
            0x45 => Tag::DVB(TagDVB::VBIData),
            0x46 => Tag::DVB(TagDVB::VBITeletext),
            0x47 => Tag::DVB(TagDVB::BouquetName),
            0x48 => Tag::DVB(TagDVB::Service),
            0x49 => Tag::DVB(TagDVB::CountryAvailability),
            0x4A => Tag::DVB(TagDVB::Linkage),
            0x4B => Tag::DVB(TagDVB::NVODReference),
            0x4C => Tag::DVB(TagDVB::TimeShiftedService),
            0x4D => Tag::DVB(TagDVB::ShortEvent),
            0x4E => Tag::DVB(TagDVB::ExtendedEvent),
            0x4F => Tag::DVB(TagDVB::TimeShiftedEvent),
            0x50 => Tag::DVB(TagDVB::Component),
            0x51 => Tag::DVB(TagDVB::Mosaic),
            0x52 => Tag::DVB(TagDVB::StreamIdentifier),
            0x53 => Tag::DVB(TagDVB::CAIdentifier),
            0x54 => Tag::DVB(TagDVB::Content),
            0x55 => Tag::DVB(TagDVB::ParentalRating),
            0x56 => Tag::DVB(TagDVB::Teletext),
            0x57 => Tag::DVB(TagDVB::Telephone),
            0x58 => Tag::DVB(TagDVB::LocalTimeOffset),
            0x59 => Tag::DVB(TagDVB::Subtitling),
            0x5A => Tag::DVB(TagDVB::TerrestrialDeliverySystem),
            0x5B => Tag::DVB(TagDVB::MultilingualNetworkName),
            0x5C => Tag::DVB(TagDVB::MultilingualBouquetName),
            0x5D => Tag::DVB(TagDVB::MultilingualServiceName),
            0x5E => Tag::DVB(TagDVB::MultilingualComponent),
            0x5F => Tag::DVB(TagDVB::PrivateDataSpecifier),
            0x60 => Tag::DVB(TagDVB::ServiceMove),
            0x61 => Tag::DVB(TagDVB::ShortSmoothingBuffer),
            0x62 => Tag::DVB(TagDVB::FrequencyList),
            0x63 => Tag::DVB(TagDVB::PartialTransportStream),
            0x64 => Tag::DVB(TagDVB::DataBroadcast),
            0x65 => Tag::DVB(TagDVB::Scrambling),
            0x66 => Tag::DVB(TagDVB::DataBroadcastId),
            0x67 => Tag::DVB(TagDVB::TransportStream),
            0x68 => Tag::DVB(TagDVB::DSNG),
            0x69 => Tag::DVB(TagDVB::PDC),
            0x6A => Tag::DVB(TagDVB::AC3),
            0x6B => Tag::DVB(TagDVB::AncillaryData),
            0x6C => Tag::DVB(TagDVB::CellList),
            0x6D => Tag::DVB(TagDVB::CellFrequencyLink),
            0x6E => Tag::DVB(TagDVB::AnnouncementSupport),
            0x6F => Tag::DVB(TagDVB::ApplicationSignalling),
            0x70 => Tag::DVB(TagDVB::AdaptationFieldData),
            0x71 => Tag::DVB(TagDVB::ServiceIdentifier),
            0x72 => Tag::DVB(TagDVB::ServiceAvailability),
            0x73 => Tag::DVB(TagDVB::DefaultAuthority),
            0x74 => Tag::DVB(TagDVB::RelatedContent),
            0x75 => Tag::DVB(TagDVB::TVAId),
            0x76 => Tag::DVB(TagDVB::ContentIdentifier),
            0x77 => Tag::DVB(TagDVB::TimeSliceFecIdentifier),
            0x78 => Tag::DVB(TagDVB::ECMRepetitionRate),
            0x79 => Tag::DVB(TagDVB::S2SatelliteDeliverySystem),
            0x7A => Tag::DVB(TagDVB::EnhancedAC3),
            0x7B => Tag::DVB(TagDVB::DTSDescriptor),
            0x7C => Tag::DVB(TagDVB::AAC),
            0x7D => Tag::DVB(TagDVB::XAITLocation),
            0x7E => Tag::DVB(TagDVB::FTAContentManagement),
            0x7F => Tag::DVB(TagDVB::Extension),

            0x00..=0x01 | 0x37..=0x3F => Tag::Reserved(d),
            0x80..=0x9F | 0xA1..=0xCF => Tag::ATSC(d),

            0xD0..=0xDF => Tag::ISDB(d),

            0xE0..=0xE9 => Tag::CableLabs(d),

            0xEA..=0xFE => Tag::Other(d),

            0xFF => Tag::Forbidden,
        }
    }
}

impl From<Tag> for u8 {
    fn from(dt: Tag) -> u8 {
        match dt {
            Tag::VH2621381811172 => 0x02,
            Tag::A1381811172 => 0x03,
            Tag::Hierarchy => 0x04,
            Tag::RegistrationPrivate => 0x05,
            Tag::DataStreamAlignment => 0x06,
            Tag::TargetBackgroundGrid => 0x07,
            Tag::VideoWindow => 0x08,
            Tag::CASEMMECMPID => 0x09,
            Tag::ISO639 => 0x0A,
            Tag::SystemClockExternalReference => 0x0B,
            Tag::MultiplexBufferUtilizationBounds => 0x0C,
            Tag::CopyrightIdentificationSystemAndReference => 0x0D,
            Tag::MaximumBitRate => 0x0E,
            Tag::PrivateDataIndicator => 0x0F,
            Tag::SmoothingBuffer => 0x10,
            Tag::STDVideoBufferLeakControl => 0x11,
            Tag::IBPVideoIFrameIndicator => 0x12,
            Tag::DSMCCCarouselIdentifier => 0x13,
            Tag::DSMCCAssociationTag => 0x14,
            Tag::DSMCCDeferredAssociationTag => 0x15,
            Tag::DSMCCReserved => 0x16,
            Tag::DSMCCNPTReference => 0x17,
            Tag::DSMCCNPTEndpoint => 0x18,
            Tag::DSMCCStreamMode => 0x19,
            Tag::DSMCCStreamEvent => 0x1A,
            Tag::VideoStreamHeaderParametersMPEG4H263Based => 0x1B,
            Tag::AudioStreamHeaderParametersMPEG4LOASMultiFormatFramed => 0x1C,
            Tag::IODParametersForISOIEC144961 => 0x1D,
            Tag::SLParametersForISOIEC144961 => 0x1E,
            Tag::FMCParametersForISOIEC144961 => 0x1F,
            Tag::ExternalESIdentifierForISOIEC144961 => 0x20,
            Tag::MuxCodeForISOIEC144961 => 0x21,
            Tag::FMXBufferSizeForISOIEC144961 => 0x22,
            Tag::MultiplexBufferForISOIEC144961 => 0x23,
            Tag::ContentLabelingForISOIEC144961 => 0x24,
            Tag::MetadataPointer => 0x25,
            Tag::Metadata => 0x26,
            Tag::MetadataSTD => 0x27,
            Tag::VideoStreamHeaderParametersForITUTRecH264AndISOIEC1449610 => 0x28,
            Tag::ISOIEC1381811IPMPDRM => 0x29,
            Tag::TimingAndHRDForITUTRecH264andISOIEC1449610 => 0x2A,
            Tag::AudioStreamHeaderParametersForISOIEC138187ADTSAAC => 0x2B,
            Tag::FlexMuxTimingForISOIEC144961 => 0x2C,
            Tag::TextStreamHeaderParametersForISOIEC14496 => 0x2D,
            Tag::AudioExtensionStreamHeaderParametersForISOIEC144963MPEG4LOASMultiFormatFramed => 0x2E,
            Tag::VideoAuxiliaryStreamHeaderParameters => 0x2F,
            Tag::VideoScalableStreamHeaderParameters => 0x30,
            Tag::VideoMultiStreamHeaderParameters => 0x31,
            Tag::VideoStreamHeaderParametersForITUTRecT800AndISOIEC15444 => 0x32,
            Tag::VideoMultiOperationPointStreamHeaderParameters => 0x33,
            Tag::VideoStereoscopic3DStreamHeaderParametersForITUTRecH262ISOIEC138182AndISOIEC111722 => 0x34,
            Tag::ProgramStereoscopic3DInformation => 0x35,
            Tag::VideoStereoscopic3DInformation => 0x36,

            Tag::VideoLANFourCCVideoSizeAndCodecInitializationData => 0xA0,

            Tag::DVB(TagDVB::NetworkName) => 0x40,
            Tag::DVB(TagDVB::ServiceList) => 0x41,
            Tag::DVB(TagDVB::Stuffing) => 0x42,
            Tag::DVB(TagDVB::SatelliteDeliverySystem) => 0x43,
            Tag::DVB(TagDVB::CableDeliverySystem) => 0x44,
            Tag::DVB(TagDVB::VBIData) => 0x45,
            Tag::DVB(TagDVB::VBITeletext) => 0x46,
            Tag::DVB(TagDVB::BouquetName) => 0x47,
            Tag::DVB(TagDVB::Service) => 0x48,
            Tag::DVB(TagDVB::CountryAvailability) => 0x49,
            Tag::DVB(TagDVB::Linkage) => 0x4A,
            Tag::DVB(TagDVB::NVODReference) => 0x4B,
            Tag::DVB(TagDVB::TimeShiftedService) => 0x4C,
            Tag::DVB(TagDVB::ShortEvent) => 0x4D,
            Tag::DVB(TagDVB::ExtendedEvent) => 0x4E,
            Tag::DVB(TagDVB::TimeShiftedEvent) => 0x4F,
            Tag::DVB(TagDVB::Component) => 0x50,
            Tag::DVB(TagDVB::Mosaic) => 0x51,
            Tag::DVB(TagDVB::StreamIdentifier) => 0x52,
            Tag::DVB(TagDVB::CAIdentifier) => 0x53,
            Tag::DVB(TagDVB::Content) => 0x54,
            Tag::DVB(TagDVB::ParentalRating) => 0x55,
            Tag::DVB(TagDVB::Teletext) => 0x56,
            Tag::DVB(TagDVB::Telephone) => 0x57,
            Tag::DVB(TagDVB::LocalTimeOffset) => 0x58,
            Tag::DVB(TagDVB::Subtitling) => 0x59,
            Tag::DVB(TagDVB::TerrestrialDeliverySystem) => 0x5A,
            Tag::DVB(TagDVB::MultilingualNetworkName) => 0x5B,
            Tag::DVB(TagDVB::MultilingualBouquetName) => 0x5C,
            Tag::DVB(TagDVB::MultilingualServiceName) => 0x5D,
            Tag::DVB(TagDVB::MultilingualComponent) => 0x5E,
            Tag::DVB(TagDVB::PrivateDataSpecifier) => 0x5F,
            Tag::DVB(TagDVB::ServiceMove) => 0x60,
            Tag::DVB(TagDVB::ShortSmoothingBuffer) => 0x61,
            Tag::DVB(TagDVB::FrequencyList) => 0x62,
            Tag::DVB(TagDVB::PartialTransportStream) => 0x63,
            Tag::DVB(TagDVB::DataBroadcast) => 0x64,
            Tag::DVB(TagDVB::Scrambling) => 0x65,
            Tag::DVB(TagDVB::DataBroadcastId) => 0x66,
            Tag::DVB(TagDVB::TransportStream) => 0x67,
            Tag::DVB(TagDVB::DSNG) => 0x68,
            Tag::DVB(TagDVB::PDC) => 0x69,
            Tag::DVB(TagDVB::AC3) => 0x6A,
            Tag::DVB(TagDVB::AncillaryData) => 0x6B,
            Tag::DVB(TagDVB::CellList) => 0x6C,
            Tag::DVB(TagDVB::CellFrequencyLink) => 0x6D,
            Tag::DVB(TagDVB::AnnouncementSupport) => 0x6E,
            Tag::DVB(TagDVB::ApplicationSignalling) => 0x6F,
            Tag::DVB(TagDVB::AdaptationFieldData) => 0x70,
            Tag::DVB(TagDVB::ServiceIdentifier) => 0x71,
            Tag::DVB(TagDVB::ServiceAvailability) => 0x72,
            Tag::DVB(TagDVB::DefaultAuthority) => 0x73,
            Tag::DVB(TagDVB::RelatedContent) => 0x74,
            Tag::DVB(TagDVB::TVAId) => 0x75,
            Tag::DVB(TagDVB::ContentIdentifier) => 0x76,
            Tag::DVB(TagDVB::TimeSliceFecIdentifier) => 0x77,
            Tag::DVB(TagDVB::ECMRepetitionRate) => 0x78,
            Tag::DVB(TagDVB::S2SatelliteDeliverySystem) => 0x79,
            Tag::DVB(TagDVB::EnhancedAC3) => 0x7A,
            Tag::DVB(TagDVB::DTSDescriptor) => 0x7B,
            Tag::DVB(TagDVB::AAC) => 0x7C,
            Tag::DVB(TagDVB::XAITLocation) => 0x7D,
            Tag::DVB(TagDVB::FTAContentManagement) => 0x7E,
            Tag::DVB(TagDVB::Extension) => 0x7F,

            Tag::Reserved(d) => d,
            Tag::ATSC(d) => d,

            Tag::ISDB(d) => d,

            Tag::CableLabs(d) => d,

            Tag::Other(d) => d,

            Tag::Forbidden => 0xFF,
        }
    }
}