xref: /OK3568_Linux_fs/kernel/drivers/media/test-drivers/vidtv/vidtv_encoder.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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