1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Vidtv serves as a reference DVB driver and helps validate the existing APIs 4*4882a593Smuzhiyun * in the media subsystem. It can also aid developers working on userspace 5*4882a593Smuzhiyun * applications. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This file contains a generic encoder type that can provide data for a stream 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Copyright (C) 2020 Daniel W. S. Almeida 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef VIDTV_ENCODER_H 13*4882a593Smuzhiyun #define VIDTV_ENCODER_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum vidtv_encoder_id { 18*4882a593Smuzhiyun /* add IDs here when implementing new encoders */ 19*4882a593Smuzhiyun S302M, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct vidtv_access_unit { 23*4882a593Smuzhiyun u32 num_samples; 24*4882a593Smuzhiyun u64 pts; 25*4882a593Smuzhiyun u64 dts; 26*4882a593Smuzhiyun u32 nbytes; 27*4882a593Smuzhiyun u32 offset; 28*4882a593Smuzhiyun struct vidtv_access_unit *next; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Some musical notes, used by a tone generator. Values are in Hz */ 32*4882a593Smuzhiyun enum musical_notes { 33*4882a593Smuzhiyun NOTE_SILENT = 0, 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun NOTE_C_2 = 65, 36*4882a593Smuzhiyun NOTE_CS_2 = 69, 37*4882a593Smuzhiyun NOTE_D_2 = 73, 38*4882a593Smuzhiyun NOTE_DS_2 = 78, 39*4882a593Smuzhiyun NOTE_E_2 = 82, 40*4882a593Smuzhiyun NOTE_F_2 = 87, 41*4882a593Smuzhiyun NOTE_FS_2 = 93, 42*4882a593Smuzhiyun NOTE_G_2 = 98, 43*4882a593Smuzhiyun NOTE_GS_2 = 104, 44*4882a593Smuzhiyun NOTE_A_2 = 110, 45*4882a593Smuzhiyun NOTE_AS_2 = 117, 46*4882a593Smuzhiyun NOTE_B_2 = 123, 47*4882a593Smuzhiyun NOTE_C_3 = 131, 48*4882a593Smuzhiyun NOTE_CS_3 = 139, 49*4882a593Smuzhiyun NOTE_D_3 = 147, 50*4882a593Smuzhiyun NOTE_DS_3 = 156, 51*4882a593Smuzhiyun NOTE_E_3 = 165, 52*4882a593Smuzhiyun NOTE_F_3 = 175, 53*4882a593Smuzhiyun NOTE_FS_3 = 185, 54*4882a593Smuzhiyun NOTE_G_3 = 196, 55*4882a593Smuzhiyun NOTE_GS_3 = 208, 56*4882a593Smuzhiyun NOTE_A_3 = 220, 57*4882a593Smuzhiyun NOTE_AS_3 = 233, 58*4882a593Smuzhiyun NOTE_B_3 = 247, 59*4882a593Smuzhiyun NOTE_C_4 = 262, 60*4882a593Smuzhiyun NOTE_CS_4 = 277, 61*4882a593Smuzhiyun NOTE_D_4 = 294, 62*4882a593Smuzhiyun NOTE_DS_4 = 311, 63*4882a593Smuzhiyun NOTE_E_4 = 330, 64*4882a593Smuzhiyun NOTE_F_4 = 349, 65*4882a593Smuzhiyun NOTE_FS_4 = 370, 66*4882a593Smuzhiyun NOTE_G_4 = 392, 67*4882a593Smuzhiyun NOTE_GS_4 = 415, 68*4882a593Smuzhiyun NOTE_A_4 = 440, 69*4882a593Smuzhiyun NOTE_AS_4 = 466, 70*4882a593Smuzhiyun NOTE_B_4 = 494, 71*4882a593Smuzhiyun NOTE_C_5 = 523, 72*4882a593Smuzhiyun NOTE_CS_5 = 554, 73*4882a593Smuzhiyun NOTE_D_5 = 587, 74*4882a593Smuzhiyun NOTE_DS_5 = 622, 75*4882a593Smuzhiyun NOTE_E_5 = 659, 76*4882a593Smuzhiyun NOTE_F_5 = 698, 77*4882a593Smuzhiyun NOTE_FS_5 = 740, 78*4882a593Smuzhiyun NOTE_G_5 = 784, 79*4882a593Smuzhiyun NOTE_GS_5 = 831, 80*4882a593Smuzhiyun NOTE_A_5 = 880, 81*4882a593Smuzhiyun NOTE_AS_5 = 932, 82*4882a593Smuzhiyun NOTE_B_5 = 988, 83*4882a593Smuzhiyun NOTE_C_6 = 1047, 84*4882a593Smuzhiyun NOTE_CS_6 = 1109, 85*4882a593Smuzhiyun NOTE_D_6 = 1175, 86*4882a593Smuzhiyun NOTE_DS_6 = 1245, 87*4882a593Smuzhiyun NOTE_E_6 = 1319, 88*4882a593Smuzhiyun NOTE_F_6 = 1397, 89*4882a593Smuzhiyun NOTE_FS_6 = 1480, 90*4882a593Smuzhiyun NOTE_G_6 = 1568, 91*4882a593Smuzhiyun NOTE_GS_6 = 1661, 92*4882a593Smuzhiyun NOTE_A_6 = 1760, 93*4882a593Smuzhiyun NOTE_AS_6 = 1865, 94*4882a593Smuzhiyun NOTE_B_6 = 1976, 95*4882a593Smuzhiyun NOTE_C_7 = 2093 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /** 99*4882a593Smuzhiyun * struct vidtv_encoder - A generic encoder type. 100*4882a593Smuzhiyun * @id: So we can cast to a concrete implementation when needed. 101*4882a593Smuzhiyun * @name: Usually the same as the stream name. 102*4882a593Smuzhiyun * @encoder_buf: The encoder internal buffer for the access units. 103*4882a593Smuzhiyun * @encoder_buf_sz: The encoder buffer size, in bytes 104*4882a593Smuzhiyun * @encoder_buf_offset: Our byte position in the encoder buffer. 105*4882a593Smuzhiyun * @sample_count: How many samples we have encoded in total. 106*4882a593Smuzhiyun * @access_units: encoder payload units, used for clock references 107*4882a593Smuzhiyun * @src_buf: The source of raw data to be encoded, encoder might set a 108*4882a593Smuzhiyun * default if null. 109*4882a593Smuzhiyun * @src_buf_sz: size of @src_buf. 110*4882a593Smuzhiyun * @src_buf_offset: Our position in the source buffer. 111*4882a593Smuzhiyun * @is_video_encoder: Whether this a video encoder (as opposed to audio) 112*4882a593Smuzhiyun * @ctx: Encoder-specific state. 113*4882a593Smuzhiyun * @stream_id: Examples: Audio streams (0xc0-0xdf), Video streams 114*4882a593Smuzhiyun * (0xe0-0xef). 115*4882a593Smuzhiyun * @es_pid: The TS PID to use for the elementary stream in this encoder. 116*4882a593Smuzhiyun * @encode: Prepare enough AUs for the given amount of time. 117*4882a593Smuzhiyun * @clear: Clear the encoder output. 118*4882a593Smuzhiyun * @sync: Attempt to synchronize with this encoder. 119*4882a593Smuzhiyun * @sampling_rate_hz: The sampling rate (or fps, if video) used. 120*4882a593Smuzhiyun * @last_sample_cb: Called when the encoder runs out of data.This is 121*4882a593Smuzhiyun * so the source can read data in a 122*4882a593Smuzhiyun * piecemeal fashion instead of having to 123*4882a593Smuzhiyun * provide it all at once. 124*4882a593Smuzhiyun * @destroy: Destroy this encoder, freeing allocated resources. 125*4882a593Smuzhiyun * @next: Next in the chain 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun struct vidtv_encoder { 128*4882a593Smuzhiyun enum vidtv_encoder_id id; 129*4882a593Smuzhiyun char *name; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun u8 *encoder_buf; 132*4882a593Smuzhiyun u32 encoder_buf_sz; 133*4882a593Smuzhiyun u32 encoder_buf_offset; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun u64 sample_count; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct vidtv_access_unit *access_units; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun void *src_buf; 140*4882a593Smuzhiyun u32 src_buf_sz; 141*4882a593Smuzhiyun u32 src_buf_offset; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun bool is_video_encoder; 144*4882a593Smuzhiyun void *ctx; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun __be16 stream_id; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun __be16 es_pid; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun void *(*encode)(struct vidtv_encoder *e); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun u32 (*clear)(struct vidtv_encoder *e); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun struct vidtv_encoder *sync; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun u32 sampling_rate_hz; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun void (*last_sample_cb)(u32 sample_no); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun void (*destroy)(struct vidtv_encoder *e); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct vidtv_encoder *next; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #endif /* VIDTV_ENCODER_H */ 166