/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
/* 
 | 
 * The Virtual DVB test driver serves as a reference DVB driver and helps 
 | 
 * validate the existing APIs in the media subsystem. It can also aid 
 | 
 * developers working on userspace applications. 
 | 
 * 
 | 
 * Copyright (C) 2020 Daniel W. S. Almeida 
 | 
 */ 
 | 
  
 | 
#ifndef VIDTV_TS_H 
 | 
#define VIDTV_TS_H 
 | 
  
 | 
#include <linux/types.h> 
 | 
  
 | 
#define TS_SYNC_BYTE 0x47 
 | 
#define TS_PACKET_LEN 188 
 | 
#define TS_PAYLOAD_LEN 184 
 | 
#define TS_NULL_PACKET_PID 0x1fff 
 | 
#define TS_CC_MAX_VAL 0x0f /* 4 bits */ 
 | 
#define TS_LAST_VALID_PID 8191 
 | 
#define TS_FILL_BYTE 0xff /* the byte used in packet stuffing */ 
 | 
  
 | 
struct vidtv_mpeg_ts_adaption { 
 | 
    u8 length; 
 | 
    struct { 
 | 
        u8 extension:1; 
 | 
        u8 private_data:1; 
 | 
        u8 splicing_point:1; 
 | 
        u8 OPCR:1; 
 | 
        u8 PCR:1; 
 | 
        u8 priority:1; 
 | 
        u8 random_access:1; 
 | 
        u8 discontinued:1; 
 | 
    } __packed; 
 | 
    u8 data[]; 
 | 
} __packed; 
 | 
  
 | 
struct vidtv_mpeg_ts { 
 | 
    u8 sync_byte; 
 | 
    __be16 bitfield; /* tei: 1, payload_start:1 priority: 1, pid:13 */ 
 | 
    struct { 
 | 
        u8 continuity_counter:4; 
 | 
        u8 payload:1; 
 | 
        u8 adaptation_field:1; 
 | 
        u8 scrambling:2; 
 | 
    } __packed; 
 | 
    struct vidtv_mpeg_ts_adaption *adaption; 
 | 
} __packed; 
 | 
  
 | 
/** 
 | 
 * struct pcr_write_args - Arguments for the pcr_write_into function. 
 | 
 * @dest_buf: The buffer to write into. 
 | 
 * @dest_offset: The byte offset into the buffer. 
 | 
 * @pid: The TS PID for the PCR packets. 
 | 
 * @buf_sz: The size of the buffer in bytes. 
 | 
 * @continuity_counter: The TS continuity_counter. 
 | 
 * @pcr: A sample from the system clock. 
 | 
 */ 
 | 
struct pcr_write_args { 
 | 
    void *dest_buf; 
 | 
    u32 dest_offset; 
 | 
    u16 pid; 
 | 
    u32 buf_sz; 
 | 
    u8 *continuity_counter; 
 | 
    u64 pcr; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct null_packet_write_args - Arguments for the null_write_into function 
 | 
 * @dest_buf: The buffer to write into. 
 | 
 * @dest_offset: The byte offset into the buffer. 
 | 
 * @buf_sz: The size of the buffer in bytes. 
 | 
 * @continuity_counter: The TS continuity_counter. 
 | 
 */ 
 | 
struct null_packet_write_args { 
 | 
    void *dest_buf; 
 | 
    u32 dest_offset; 
 | 
    u32 buf_sz; 
 | 
    u8 *continuity_counter; 
 | 
}; 
 | 
  
 | 
/* Increment the continuity counter */ 
 | 
void vidtv_ts_inc_cc(u8 *continuity_counter); 
 | 
  
 | 
/** 
 | 
 * vidtv_ts_null_write_into - Write a TS null packet into a buffer. 
 | 
 * @args: the arguments to use when writing. 
 | 
 * 
 | 
 * This function will write a null packet into a buffer. This is usually used to 
 | 
 * pad TS streams. 
 | 
 * 
 | 
 * Return: The number of bytes written into the buffer. 
 | 
 */ 
 | 
u32 vidtv_ts_null_write_into(struct null_packet_write_args args); 
 | 
  
 | 
/** 
 | 
 * vidtv_ts_pcr_write_into - Write a PCR  packet into a buffer. 
 | 
 * @args: the arguments to use when writing. 
 | 
 * 
 | 
 * This function will write a PCR packet into a buffer. This is used to 
 | 
 * synchronize the clocks between encoders and decoders. 
 | 
 * 
 | 
 * Return: The number of bytes written into the buffer. 
 | 
 */ 
 | 
u32 vidtv_ts_pcr_write_into(struct pcr_write_args args); 
 | 
  
 | 
#endif //VIDTV_TS_H 
 |