1 /* ///////////////////////////////////////////////////////////////////////
7 * Brief: the opcr class - the original program clock reference
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
13 #ifndef EXTL_MEDIA_TS_OPCR_H
14 #define EXTL_MEDIA_TS_OPCR_H
17 * \brief the opcr class - program clock reference
20 # error opcr.h need be supported by c++.
23 /* ///////////////////////////////////////////////////////////////////////
28 /* ///////////////////////////////////////////////////////////////////////
29 * ::extl::media::ts namespace
31 EXTL_MEDIA_TS_BEGIN_WHOLE_NAMESPACE
33 /*!brief the program clock reference
35 * \ingroup extl_group_media
38 * // original program clock reference
47 * \param Ada the adaptation field type
49 template<typename_param_k Ada
>
52 /// \name Public Types
55 typedef Ada adaptation_type
;
56 typedef opcr class_type
;
57 typedef e_byte_t byte_type
;
58 typedef e_uint16_t word_type
;
59 typedef e_uint32_t dword_type
;
60 typedef e_uint64_t qword_type
;
61 typedef byte_type
* pointer
;
62 typedef byte_type
const* const_pointer
;
63 typedef e_size_t size_type
;
64 typedef size_type index_type
;
65 typedef e_bool_t bool_type
;
71 // program_clock_reference
72 // base + base1 + reseved + opcr_extension
76 // 32(base) + 1(base1)
79 // \note defined in reverse order by word_type
80 word_type extension
: 9 ; //< low bit
81 word_type reseved
: 6 ;
82 word_type base1
: 1 ; //< high bit
89 enum { en_opcr_size
= 6 };
92 /// \name Private Accessors
95 adaptation_type
& adaptation() { return static_cast<adaptation_type
&>(*this); }
96 adaptation_type
const& adaptation() const { return static_cast<adaptation_type
const&>(*this); }
98 members_type
& members() { return *reinterpret_cast<members_type
*>(data()); }
99 members_type
const& members() const { return *reinterpret_cast<members_type
const*>(data()); }
102 /// \name Public Accessors
105 pointer
data() { return (adaptation().packet().data() + offset()); }
106 const_pointer
data() const { return (adaptation().packet().data() + offset()); }
108 qword_type
value() const { return (base() * 300 + extension()); }
110 qword_type
base() const { return ((static_cast<qword_type
>(members().base
) << 1) | members().base1
); }
111 void base(qword_type value
) { members().base
= static_cast<dword_type
>(value
>> 1); members().base1
= static_cast<word_type
>(value
& 0x1); }
113 size_type
extension() const { return static_cast<size_type
>(members().extension
); }
114 void extension(size_type value
) { members().extension
= static_cast<word_type
>(value
); }
121 size_type
size() const { return en_opcr_size
; }
123 /// return the offset at the packet
124 size_type
offset() const { return (adaptation().pcr().offset() + (exists()? adaptation().pcr().size() : 0)); }
126 /// return \true if exists opcr
127 bool_type
exists() const { return (1 == adaptation().header().opcr_flag()); }
129 /// return \true if the packet is valid
130 bool_type
is_valid() const { return e_true_v
; }
133 /// \name Attach & Detach
136 /// decodes packet packet_header
141 adaptation().packet().buffer().reverse(offset(), 4);
142 adaptation().packet().buffer().reverse(offset() + 4, 2);
145 /// encodes packet packet_header
150 adaptation().packet().buffer().reverse(offset(), 4);
151 adaptation().packet().buffer().reverse(offset() + 4, 2);
157 /* ///////////////////////////////////////////////////////////////////////
158 * ::extl::media::ts namespace
160 EXTL_MEDIA_TS_END_WHOLE_NAMESPACE
162 /* //////////////////////////////////////////////////////////////////// */
163 #endif /* EXTL_MEDIA_TS_OPCR_H */
164 /* //////////////////////////////////////////////////////////////////// */