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
23struct 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
38struct 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	struct vidtv_mpeg_ts_adaption *adaption;
48} __packed;
49
50/**
51 * struct pcr_write_args - Arguments for the pcr_write_into function.
52 * @dest_buf: The buffer to write into.
53 * @dest_offset: The byte offset into the buffer.
54 * @pid: The TS PID for the PCR packets.
55 * @buf_sz: The size of the buffer in bytes.
56 * @continuity_counter: The TS continuity_counter.
57 * @pcr: A sample from the system clock.
58 */
59struct pcr_write_args {
60	void *dest_buf;
61	u32 dest_offset;
62	u16 pid;
63	u32 buf_sz;
64	u8 *continuity_counter;
65	u64 pcr;
66};
67
68/**
69 * struct null_packet_write_args - Arguments for the null_write_into function
70 * @dest_buf: The buffer to write into.
71 * @dest_offset: The byte offset into the buffer.
72 * @buf_sz: The size of the buffer in bytes.
73 * @continuity_counter: The TS continuity_counter.
74 */
75struct null_packet_write_args {
76	void *dest_buf;
77	u32 dest_offset;
78	u32 buf_sz;
79	u8 *continuity_counter;
80};
81
82/* Increment the continuity counter */
83void vidtv_ts_inc_cc(u8 *continuity_counter);
84
85/**
86 * vidtv_ts_null_write_into - Write a TS null packet into a buffer.
87 * @args: the arguments to use when writing.
88 *
89 * This function will write a null packet into a buffer. This is usually used to
90 * pad TS streams.
91 *
92 * Return: The number of bytes written into the buffer.
93 */
94u32 vidtv_ts_null_write_into(struct null_packet_write_args args);
95
96/**
97 * vidtv_ts_pcr_write_into - Write a PCR  packet into a buffer.
98 * @args: the arguments to use when writing.
99 *
100 * This function will write a PCR packet into a buffer. This is used to
101 * synchronize the clocks between encoders and decoders.
102 *
103 * Return: The number of bytes written into the buffer.
104 */
105u32 vidtv_ts_pcr_write_into(struct pcr_write_args args);
106
107#endif //VIDTV_TS_H
108