Linux Audio

Check our new training course

Loading...
  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
 17enum vidtv_encoder_id {
 18	/* add IDs here when implementing new encoders */
 19	S302M,
 20};
 21
 22struct 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 */
 32enum 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 */
127struct 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 */