-
Notifications
You must be signed in to change notification settings - Fork 0
/
ts_packet.h
128 lines (122 loc) · 2.55 KB
/
ts_packet.h
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
#ifndef _INC_TS_PACKET_H_
#define _INC_TS_PACKET_H_
// TSパケットのヘッダ
class CHeader
{
public:
CHeader(){}
CHeader(UINT8 val[])
{
SetData(val);
}
public:
int sync;
int trans_error;
int payload_start;
int element_priority;
int pid;
int scambling;
int has_adaptation;
int has_payload;
int index;
public:
int SetData(UINT8 val[])
{
sync = val[0];
trans_error = (val[1] & 0x80) >> 7;
payload_start = (val[1] & 0x40) >> 6;
element_priority = (val[1] & 0x20) >> 5;
pid = ((val[1] & 0x1F) << 8) | val[2];
scambling = (val[3] & 0xC0) >> 6;
has_adaptation = (val[3] & 0x20) >> 5;
has_payload = (val[3] & 0x10) >> 4;
index = (val[3] & 0x0F);
return 4;
}
};
// TSパケットのアダプテーションヘッダ
class CAdaptation
{
public:
int length;
int discontinuity;
int random_access;
int priority;
int has_pcr;
int has_opcr;
int splicing_point;
int transport_private;
int extension;
public:
// 返り値 Adaptationフィールドのバイト数
int SetData(UINT8 buf[])
{
length = buf[0];
int val = buf[1];
discontinuity = (val & 0x80) >> 7;
random_access = (val & 0x40) >> 6;
priority = (val & 0x20) >> 5;
has_pcr = (val & 0x10) >> 4;
has_opcr = (val & 0x08) >> 3;
splicing_point = (val & 0x04) >> 2;
transport_private = (val & 0x02) >> 1;
extension = val & 0x01;
return length;
}
};
// TSパケットのデータ
class CPacket
{
public:
CPacket(){}
CPacket(UINT8 val[], bool has_payload)
{
SetData(val, has_payload);
}
private:
VECT_UINT8 payload;
public:
CHeader header;
CAdaptation adaptation;
UINT8 *p_start_payload;
UINT8 *p_end_payload;
public:
void SetData(UINT8 val[], bool has_payload)
{
UINT8 *p = val;
int size;
size = header.SetData( p );
p += size;
if ( header.has_adaptation )
{
size = adaptation.SetData( p );
p += size;
}
else
adaptation.length = 0;
if ( !header.has_payload )
{
p_start_payload = NULL;
p_end_payload = NULL;
}
else
{
if ( has_payload )
{
payload.clear();
// 残りをpayloadに入れとく
std::copy( p, &val[TS_PACKET_SIZE], back_inserter( payload ) );
p_start_payload = &payload[0];
p_end_payload = p_start_payload + payload.size();
}
else
{
// 引数の配列のポインタをそのまま使用。
// 配列が解放されないこと前提
p_start_payload = p;
p_end_payload = &val[TS_PACKET_SIZE];
}
}
}
};
#endif