18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Vidtv serves as a reference DVB driver and helps validate the existing APIs
48c2ecf20Sopenharmony_ci * in the media subsystem. It can also aid developers working on userspace
58c2ecf20Sopenharmony_ci * applications.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This file contains a generic encoder type that can provide data for a stream
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * Copyright (C) 2020 Daniel W. S. Almeida
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#ifndef VIDTV_ENCODER_H
138c2ecf20Sopenharmony_ci#define VIDTV_ENCODER_H
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <linux/types.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cienum vidtv_encoder_id {
188c2ecf20Sopenharmony_ci	/* add IDs here when implementing new encoders */
198c2ecf20Sopenharmony_ci	S302M,
208c2ecf20Sopenharmony_ci};
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistruct vidtv_access_unit {
238c2ecf20Sopenharmony_ci	u32 num_samples;
248c2ecf20Sopenharmony_ci	u64 pts;
258c2ecf20Sopenharmony_ci	u64 dts;
268c2ecf20Sopenharmony_ci	u32 nbytes;
278c2ecf20Sopenharmony_ci	u32 offset;
288c2ecf20Sopenharmony_ci	struct vidtv_access_unit *next;
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/* Some musical notes, used by a tone generator. Values are in Hz */
328c2ecf20Sopenharmony_cienum musical_notes {
338c2ecf20Sopenharmony_ci	NOTE_SILENT = 0,
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	NOTE_C_2 = 65,
368c2ecf20Sopenharmony_ci	NOTE_CS_2 = 69,
378c2ecf20Sopenharmony_ci	NOTE_D_2 = 73,
388c2ecf20Sopenharmony_ci	NOTE_DS_2 = 78,
398c2ecf20Sopenharmony_ci	NOTE_E_2 = 82,
408c2ecf20Sopenharmony_ci	NOTE_F_2 = 87,
418c2ecf20Sopenharmony_ci	NOTE_FS_2 = 93,
428c2ecf20Sopenharmony_ci	NOTE_G_2 = 98,
438c2ecf20Sopenharmony_ci	NOTE_GS_2 = 104,
448c2ecf20Sopenharmony_ci	NOTE_A_2 = 110,
458c2ecf20Sopenharmony_ci	NOTE_AS_2 = 117,
468c2ecf20Sopenharmony_ci	NOTE_B_2 = 123,
478c2ecf20Sopenharmony_ci	NOTE_C_3 = 131,
488c2ecf20Sopenharmony_ci	NOTE_CS_3 = 139,
498c2ecf20Sopenharmony_ci	NOTE_D_3 = 147,
508c2ecf20Sopenharmony_ci	NOTE_DS_3 = 156,
518c2ecf20Sopenharmony_ci	NOTE_E_3 = 165,
528c2ecf20Sopenharmony_ci	NOTE_F_3 = 175,
538c2ecf20Sopenharmony_ci	NOTE_FS_3 = 185,
548c2ecf20Sopenharmony_ci	NOTE_G_3 = 196,
558c2ecf20Sopenharmony_ci	NOTE_GS_3 = 208,
568c2ecf20Sopenharmony_ci	NOTE_A_3 = 220,
578c2ecf20Sopenharmony_ci	NOTE_AS_3 = 233,
588c2ecf20Sopenharmony_ci	NOTE_B_3 = 247,
598c2ecf20Sopenharmony_ci	NOTE_C_4 = 262,
608c2ecf20Sopenharmony_ci	NOTE_CS_4 = 277,
618c2ecf20Sopenharmony_ci	NOTE_D_4 = 294,
628c2ecf20Sopenharmony_ci	NOTE_DS_4 = 311,
638c2ecf20Sopenharmony_ci	NOTE_E_4 = 330,
648c2ecf20Sopenharmony_ci	NOTE_F_4 = 349,
658c2ecf20Sopenharmony_ci	NOTE_FS_4 = 370,
668c2ecf20Sopenharmony_ci	NOTE_G_4 = 392,
678c2ecf20Sopenharmony_ci	NOTE_GS_4 = 415,
688c2ecf20Sopenharmony_ci	NOTE_A_4 = 440,
698c2ecf20Sopenharmony_ci	NOTE_AS_4 = 466,
708c2ecf20Sopenharmony_ci	NOTE_B_4 = 494,
718c2ecf20Sopenharmony_ci	NOTE_C_5 = 523,
728c2ecf20Sopenharmony_ci	NOTE_CS_5 = 554,
738c2ecf20Sopenharmony_ci	NOTE_D_5 = 587,
748c2ecf20Sopenharmony_ci	NOTE_DS_5 = 622,
758c2ecf20Sopenharmony_ci	NOTE_E_5 = 659,
768c2ecf20Sopenharmony_ci	NOTE_F_5 = 698,
778c2ecf20Sopenharmony_ci	NOTE_FS_5 = 740,
788c2ecf20Sopenharmony_ci	NOTE_G_5 = 784,
798c2ecf20Sopenharmony_ci	NOTE_GS_5 = 831,
808c2ecf20Sopenharmony_ci	NOTE_A_5 = 880,
818c2ecf20Sopenharmony_ci	NOTE_AS_5 = 932,
828c2ecf20Sopenharmony_ci	NOTE_B_5 = 988,
838c2ecf20Sopenharmony_ci	NOTE_C_6 = 1047,
848c2ecf20Sopenharmony_ci	NOTE_CS_6 = 1109,
858c2ecf20Sopenharmony_ci	NOTE_D_6 = 1175,
868c2ecf20Sopenharmony_ci	NOTE_DS_6 = 1245,
878c2ecf20Sopenharmony_ci	NOTE_E_6 = 1319,
888c2ecf20Sopenharmony_ci	NOTE_F_6 = 1397,
898c2ecf20Sopenharmony_ci	NOTE_FS_6 = 1480,
908c2ecf20Sopenharmony_ci	NOTE_G_6 = 1568,
918c2ecf20Sopenharmony_ci	NOTE_GS_6 = 1661,
928c2ecf20Sopenharmony_ci	NOTE_A_6 = 1760,
938c2ecf20Sopenharmony_ci	NOTE_AS_6 = 1865,
948c2ecf20Sopenharmony_ci	NOTE_B_6 = 1976,
958c2ecf20Sopenharmony_ci	NOTE_C_7 = 2093
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci/**
998c2ecf20Sopenharmony_ci * struct vidtv_encoder - A generic encoder type.
1008c2ecf20Sopenharmony_ci * @id: So we can cast to a concrete implementation when needed.
1018c2ecf20Sopenharmony_ci * @name: Usually the same as the stream name.
1028c2ecf20Sopenharmony_ci * @encoder_buf: The encoder internal buffer for the access units.
1038c2ecf20Sopenharmony_ci * @encoder_buf_sz: The encoder buffer size, in bytes
1048c2ecf20Sopenharmony_ci * @encoder_buf_offset: Our byte position in the encoder buffer.
1058c2ecf20Sopenharmony_ci * @sample_count: How many samples we have encoded in total.
1068c2ecf20Sopenharmony_ci * @access_units: encoder payload units, used for clock references
1078c2ecf20Sopenharmony_ci * @src_buf: The source of raw data to be encoded, encoder might set a
1088c2ecf20Sopenharmony_ci * default if null.
1098c2ecf20Sopenharmony_ci * @src_buf_sz: size of @src_buf.
1108c2ecf20Sopenharmony_ci * @src_buf_offset: Our position in the source buffer.
1118c2ecf20Sopenharmony_ci * @is_video_encoder: Whether this a video encoder (as opposed to audio)
1128c2ecf20Sopenharmony_ci * @ctx: Encoder-specific state.
1138c2ecf20Sopenharmony_ci * @stream_id: Examples: Audio streams (0xc0-0xdf), Video streams
1148c2ecf20Sopenharmony_ci * (0xe0-0xef).
1158c2ecf20Sopenharmony_ci * @es_pid: The TS PID to use for the elementary stream in this encoder.
1168c2ecf20Sopenharmony_ci * @encode: Prepare enough AUs for the given amount of time.
1178c2ecf20Sopenharmony_ci * @clear: Clear the encoder output.
1188c2ecf20Sopenharmony_ci * @sync: Attempt to synchronize with this encoder.
1198c2ecf20Sopenharmony_ci * @sampling_rate_hz: The sampling rate (or fps, if video) used.
1208c2ecf20Sopenharmony_ci * @last_sample_cb: Called when the encoder runs out of data.This is
1218c2ecf20Sopenharmony_ci *		    so the source can read data in a
1228c2ecf20Sopenharmony_ci *		    piecemeal fashion instead of having to
1238c2ecf20Sopenharmony_ci *		    provide it all at once.
1248c2ecf20Sopenharmony_ci * @destroy: Destroy this encoder, freeing allocated resources.
1258c2ecf20Sopenharmony_ci * @next: Next in the chain
1268c2ecf20Sopenharmony_ci */
1278c2ecf20Sopenharmony_cistruct vidtv_encoder {
1288c2ecf20Sopenharmony_ci	enum vidtv_encoder_id id;
1298c2ecf20Sopenharmony_ci	char *name;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	u8 *encoder_buf;
1328c2ecf20Sopenharmony_ci	u32 encoder_buf_sz;
1338c2ecf20Sopenharmony_ci	u32 encoder_buf_offset;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	u64 sample_count;
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	struct vidtv_access_unit *access_units;
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci	void *src_buf;
1408c2ecf20Sopenharmony_ci	u32 src_buf_sz;
1418c2ecf20Sopenharmony_ci	u32 src_buf_offset;
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	bool is_video_encoder;
1448c2ecf20Sopenharmony_ci	void *ctx;
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	__be16 stream_id;
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci	__be16 es_pid;
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci	void *(*encode)(struct vidtv_encoder *e);
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	u32 (*clear)(struct vidtv_encoder *e);
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	struct vidtv_encoder *sync;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	u32 sampling_rate_hz;
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci	void (*last_sample_cb)(u32 sample_no);
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	void (*destroy)(struct vidtv_encoder *e);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci	struct vidtv_encoder *next;
1638c2ecf20Sopenharmony_ci};
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci#endif /* VIDTV_ENCODER_H */
166