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