1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * The Virtual DVB test driver serves as a reference DVB driver and helps |
4 | * validate the existing APIs in the media subsystem. It can also aid |
5 | * developers working on userspace applications. |
6 | * |
7 | * Copyright (C) 2020 Daniel W. S. Almeida |
8 | */ |
9 | |
10 | #ifndef VIDTV_TS_H |
11 | #define VIDTV_TS_H |
12 | |
13 | #include <linux/types.h> |
14 | |
15 | #define TS_SYNC_BYTE 0x47 |
16 | #define TS_PACKET_LEN 188 |
17 | #define TS_PAYLOAD_LEN 184 |
18 | #define TS_NULL_PACKET_PID 0x1fff |
19 | #define TS_CC_MAX_VAL 0x0f /* 4 bits */ |
20 | #define TS_LAST_VALID_PID 8191 |
21 | #define TS_FILL_BYTE 0xff /* the byte used in packet stuffing */ |
22 | |
23 | struct vidtv_mpeg_ts_adaption { |
24 | u8 length; |
25 | struct { |
26 | u8 extension:1; |
27 | u8 private_data:1; |
28 | u8 splicing_point:1; |
29 | u8 OPCR:1; |
30 | u8 PCR:1; |
31 | u8 priority:1; |
32 | u8 random_access:1; |
33 | u8 discontinued:1; |
34 | } __packed; |
35 | u8 data[]; |
36 | } __packed; |
37 | |
38 | struct vidtv_mpeg_ts { |
39 | u8 sync_byte; |
40 | __be16 bitfield; /* tei: 1, payload_start:1 priority: 1, pid:13 */ |
41 | struct { |
42 | u8 continuity_counter:4; |
43 | u8 payload:1; |
44 | u8 adaptation_field:1; |
45 | u8 scrambling:2; |
46 | } __packed; |
47 | } __packed; |
48 | |
49 | /** |
50 | * struct pcr_write_args - Arguments for the pcr_write_into function. |
51 | * @dest_buf: The buffer to write into. |
52 | * @dest_offset: The byte offset into the buffer. |
53 | * @pid: The TS PID for the PCR packets. |
54 | * @buf_sz: The size of the buffer in bytes. |
55 | * @continuity_counter: The TS continuity_counter. |
56 | * @pcr: A sample from the system clock. |
57 | */ |
58 | struct pcr_write_args { |
59 | void *dest_buf; |
60 | u32 dest_offset; |
61 | u16 pid; |
62 | u32 buf_sz; |
63 | u8 *continuity_counter; |
64 | u64 pcr; |
65 | }; |
66 | |
67 | /** |
68 | * struct null_packet_write_args - Arguments for the null_write_into function |
69 | * @dest_buf: The buffer to write into. |
70 | * @dest_offset: The byte offset into the buffer. |
71 | * @buf_sz: The size of the buffer in bytes. |
72 | * @continuity_counter: The TS continuity_counter. |
73 | */ |
74 | struct null_packet_write_args { |
75 | void *dest_buf; |
76 | u32 dest_offset; |
77 | u32 buf_sz; |
78 | u8 *continuity_counter; |
79 | }; |
80 | |
81 | /* Increment the continuity counter */ |
82 | void vidtv_ts_inc_cc(u8 *continuity_counter); |
83 | |
84 | /** |
85 | * vidtv_ts_null_write_into - Write a TS null packet into a buffer. |
86 | * @args: the arguments to use when writing. |
87 | * |
88 | * This function will write a null packet into a buffer. This is usually used to |
89 | * pad TS streams. |
90 | * |
91 | * Return: The number of bytes written into the buffer. |
92 | */ |
93 | u32 vidtv_ts_null_write_into(struct null_packet_write_args args); |
94 | |
95 | /** |
96 | * vidtv_ts_pcr_write_into - Write a PCR packet into a buffer. |
97 | * @args: the arguments to use when writing. |
98 | * |
99 | * This function will write a PCR packet into a buffer. This is used to |
100 | * synchronize the clocks between encoders and decoders. |
101 | * |
102 | * Return: The number of bytes written into the buffer. |
103 | */ |
104 | u32 vidtv_ts_pcr_write_into(struct pcr_write_args args); |
105 | |
106 | #endif //VIDTV_TS_H |
107 | |