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