162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Vidtv serves as a reference DVB driver and helps validate the existing APIs
462306a36Sopenharmony_ci * in the media subsystem. It can also aid developers working on userspace
562306a36Sopenharmony_ci * applications.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * This file contains a generic encoder type that can provide data for a stream
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Copyright (C) 2020 Daniel W. S. Almeida
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef VIDTV_ENCODER_H
1362306a36Sopenharmony_ci#define VIDTV_ENCODER_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/types.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cienum vidtv_encoder_id {
1862306a36Sopenharmony_ci	/* add IDs here when implementing new encoders */
1962306a36Sopenharmony_ci	S302M,
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct vidtv_access_unit {
2362306a36Sopenharmony_ci	u32 num_samples;
2462306a36Sopenharmony_ci	u64 pts;
2562306a36Sopenharmony_ci	u64 dts;
2662306a36Sopenharmony_ci	u32 nbytes;
2762306a36Sopenharmony_ci	u32 offset;
2862306a36Sopenharmony_ci	struct vidtv_access_unit *next;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* Some musical notes, used by a tone generator. Values are in Hz */
3262306a36Sopenharmony_cienum musical_notes {
3362306a36Sopenharmony_ci	NOTE_SILENT = 0,
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	NOTE_C_2 = 65,
3662306a36Sopenharmony_ci	NOTE_CS_2 = 69,
3762306a36Sopenharmony_ci	NOTE_D_2 = 73,
3862306a36Sopenharmony_ci	NOTE_DS_2 = 78,
3962306a36Sopenharmony_ci	NOTE_E_2 = 82,
4062306a36Sopenharmony_ci	NOTE_F_2 = 87,
4162306a36Sopenharmony_ci	NOTE_FS_2 = 93,
4262306a36Sopenharmony_ci	NOTE_G_2 = 98,
4362306a36Sopenharmony_ci	NOTE_GS_2 = 104,
4462306a36Sopenharmony_ci	NOTE_A_2 = 110,
4562306a36Sopenharmony_ci	NOTE_AS_2 = 117,
4662306a36Sopenharmony_ci	NOTE_B_2 = 123,
4762306a36Sopenharmony_ci	NOTE_C_3 = 131,
4862306a36Sopenharmony_ci	NOTE_CS_3 = 139,
4962306a36Sopenharmony_ci	NOTE_D_3 = 147,
5062306a36Sopenharmony_ci	NOTE_DS_3 = 156,
5162306a36Sopenharmony_ci	NOTE_E_3 = 165,
5262306a36Sopenharmony_ci	NOTE_F_3 = 175,
5362306a36Sopenharmony_ci	NOTE_FS_3 = 185,
5462306a36Sopenharmony_ci	NOTE_G_3 = 196,
5562306a36Sopenharmony_ci	NOTE_GS_3 = 208,
5662306a36Sopenharmony_ci	NOTE_A_3 = 220,
5762306a36Sopenharmony_ci	NOTE_AS_3 = 233,
5862306a36Sopenharmony_ci	NOTE_B_3 = 247,
5962306a36Sopenharmony_ci	NOTE_C_4 = 262,
6062306a36Sopenharmony_ci	NOTE_CS_4 = 277,
6162306a36Sopenharmony_ci	NOTE_D_4 = 294,
6262306a36Sopenharmony_ci	NOTE_DS_4 = 311,
6362306a36Sopenharmony_ci	NOTE_E_4 = 330,
6462306a36Sopenharmony_ci	NOTE_F_4 = 349,
6562306a36Sopenharmony_ci	NOTE_FS_4 = 370,
6662306a36Sopenharmony_ci	NOTE_G_4 = 392,
6762306a36Sopenharmony_ci	NOTE_GS_4 = 415,
6862306a36Sopenharmony_ci	NOTE_A_4 = 440,
6962306a36Sopenharmony_ci	NOTE_AS_4 = 466,
7062306a36Sopenharmony_ci	NOTE_B_4 = 494,
7162306a36Sopenharmony_ci	NOTE_C_5 = 523,
7262306a36Sopenharmony_ci	NOTE_CS_5 = 554,
7362306a36Sopenharmony_ci	NOTE_D_5 = 587,
7462306a36Sopenharmony_ci	NOTE_DS_5 = 622,
7562306a36Sopenharmony_ci	NOTE_E_5 = 659,
7662306a36Sopenharmony_ci	NOTE_F_5 = 698,
7762306a36Sopenharmony_ci	NOTE_FS_5 = 740,
7862306a36Sopenharmony_ci	NOTE_G_5 = 784,
7962306a36Sopenharmony_ci	NOTE_GS_5 = 831,
8062306a36Sopenharmony_ci	NOTE_A_5 = 880,
8162306a36Sopenharmony_ci	NOTE_AS_5 = 932,
8262306a36Sopenharmony_ci	NOTE_B_5 = 988,
8362306a36Sopenharmony_ci	NOTE_C_6 = 1047,
8462306a36Sopenharmony_ci	NOTE_CS_6 = 1109,
8562306a36Sopenharmony_ci	NOTE_D_6 = 1175,
8662306a36Sopenharmony_ci	NOTE_DS_6 = 1245,
8762306a36Sopenharmony_ci	NOTE_E_6 = 1319,
8862306a36Sopenharmony_ci	NOTE_F_6 = 1397,
8962306a36Sopenharmony_ci	NOTE_FS_6 = 1480,
9062306a36Sopenharmony_ci	NOTE_G_6 = 1568,
9162306a36Sopenharmony_ci	NOTE_GS_6 = 1661,
9262306a36Sopenharmony_ci	NOTE_A_6 = 1760,
9362306a36Sopenharmony_ci	NOTE_AS_6 = 1865,
9462306a36Sopenharmony_ci	NOTE_B_6 = 1976,
9562306a36Sopenharmony_ci	NOTE_C_7 = 2093
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/**
9962306a36Sopenharmony_ci * struct vidtv_encoder - A generic encoder type.
10062306a36Sopenharmony_ci * @id: So we can cast to a concrete implementation when needed.
10162306a36Sopenharmony_ci * @name: Usually the same as the stream name.
10262306a36Sopenharmony_ci * @encoder_buf: The encoder internal buffer for the access units.
10362306a36Sopenharmony_ci * @encoder_buf_sz: The encoder buffer size, in bytes
10462306a36Sopenharmony_ci * @encoder_buf_offset: Our byte position in the encoder buffer.
10562306a36Sopenharmony_ci * @sample_count: How many samples we have encoded in total.
10662306a36Sopenharmony_ci * @access_units: encoder payload units, used for clock references
10762306a36Sopenharmony_ci * @src_buf: The source of raw data to be encoded, encoder might set a
10862306a36Sopenharmony_ci * default if null.
10962306a36Sopenharmony_ci * @src_buf_sz: size of @src_buf.
11062306a36Sopenharmony_ci * @src_buf_offset: Our position in the source buffer.
11162306a36Sopenharmony_ci * @is_video_encoder: Whether this a video encoder (as opposed to audio)
11262306a36Sopenharmony_ci * @ctx: Encoder-specific state.
11362306a36Sopenharmony_ci * @stream_id: Examples: Audio streams (0xc0-0xdf), Video streams
11462306a36Sopenharmony_ci * (0xe0-0xef).
11562306a36Sopenharmony_ci * @es_pid: The TS PID to use for the elementary stream in this encoder.
11662306a36Sopenharmony_ci * @encode: Prepare enough AUs for the given amount of time.
11762306a36Sopenharmony_ci * @clear: Clear the encoder output.
11862306a36Sopenharmony_ci * @sync: Attempt to synchronize with this encoder.
11962306a36Sopenharmony_ci * @sampling_rate_hz: The sampling rate (or fps, if video) used.
12062306a36Sopenharmony_ci * @last_sample_cb: Called when the encoder runs out of data.This is
12162306a36Sopenharmony_ci *		    so the source can read data in a
12262306a36Sopenharmony_ci *		    piecemeal fashion instead of having to
12362306a36Sopenharmony_ci *		    provide it all at once.
12462306a36Sopenharmony_ci * @destroy: Destroy this encoder, freeing allocated resources.
12562306a36Sopenharmony_ci * @next: Next in the chain
12662306a36Sopenharmony_ci */
12762306a36Sopenharmony_cistruct vidtv_encoder {
12862306a36Sopenharmony_ci	enum vidtv_encoder_id id;
12962306a36Sopenharmony_ci	char *name;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	u8 *encoder_buf;
13262306a36Sopenharmony_ci	u32 encoder_buf_sz;
13362306a36Sopenharmony_ci	u32 encoder_buf_offset;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	u64 sample_count;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	struct vidtv_access_unit *access_units;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	void *src_buf;
14062306a36Sopenharmony_ci	u32 src_buf_sz;
14162306a36Sopenharmony_ci	u32 src_buf_offset;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	bool is_video_encoder;
14462306a36Sopenharmony_ci	void *ctx;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	__be16 stream_id;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	__be16 es_pid;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	void *(*encode)(struct vidtv_encoder *e);
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	u32 (*clear)(struct vidtv_encoder *e);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	struct vidtv_encoder *sync;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	u32 sampling_rate_hz;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	void (*last_sample_cb)(u32 sample_no);
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	void (*destroy)(struct vidtv_encoder *e);
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	struct vidtv_encoder *next;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#endif /* VIDTV_ENCODER_H */
166