xref: /openbmc/linux/drivers/media/test-drivers/vidtv/vidtv_encoder.h (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
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