| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Vidtv serves as a reference DVB driver and helps validate the existing APIs |
| * in the media subsystem. It can also aid developers working on userspace |
| * applications. |
| * |
| * This file contains a generic encoder type that can provide data for a stream |
| * |
| * Copyright (C) 2020 Daniel W. S. Almeida |
| */ |
| |
| #ifndef VIDTV_ENCODER_H |
| #define VIDTV_ENCODER_H |
| |
| #include <linux/types.h> |
| |
| enum vidtv_encoder_id { |
| /* add IDs here when implementing new encoders */ |
| S302M, |
| }; |
| |
| struct vidtv_access_unit { |
| u32 num_samples; |
| u64 pts; |
| u64 dts; |
| u32 nbytes; |
| u32 offset; |
| struct vidtv_access_unit *next; |
| }; |
| |
| /* Some musical notes, used by a tone generator */ |
| enum musical_notes { |
| NOTE_SILENT = 0, |
| |
| NOTE_C_2 = 65, |
| NOTE_CS_2 = 69, |
| NOTE_D_2 = 73, |
| NOTE_DS_2 = 78, |
| NOTE_E_2 = 82, |
| NOTE_F_2 = 87, |
| NOTE_FS_2 = 93, |
| NOTE_G_2 = 98, |
| NOTE_GS_2 = 104, |
| NOTE_A_2 = 110, |
| NOTE_AS_2 = 117, |
| NOTE_B_2 = 123, |
| NOTE_C_3 = 131, |
| NOTE_CS_3 = 139, |
| NOTE_D_3 = 147, |
| NOTE_DS_3 = 156, |
| NOTE_E_3 = 165, |
| NOTE_F_3 = 175, |
| NOTE_FS_3 = 185, |
| NOTE_G_3 = 196, |
| NOTE_GS_3 = 208, |
| NOTE_A_3 = 220, |
| NOTE_AS_3 = 233, |
| NOTE_B_3 = 247, |
| NOTE_C_4 = 262, |
| NOTE_CS_4 = 277, |
| NOTE_D_4 = 294, |
| NOTE_DS_4 = 311, |
| NOTE_E_4 = 330, |
| NOTE_F_4 = 349, |
| NOTE_FS_4 = 370, |
| NOTE_G_4 = 392, |
| NOTE_GS_4 = 415, |
| NOTE_A_4 = 440, |
| NOTE_AS_4 = 466, |
| NOTE_B_4 = 494, |
| NOTE_C_5 = 523, |
| NOTE_CS_5 = 554, |
| NOTE_D_5 = 587, |
| NOTE_DS_5 = 622, |
| NOTE_E_5 = 659, |
| NOTE_F_5 = 698, |
| NOTE_FS_5 = 740, |
| NOTE_G_5 = 784, |
| NOTE_GS_5 = 831, |
| NOTE_A_5 = 880, |
| NOTE_AS_5 = 932, |
| NOTE_B_5 = 988, |
| NOTE_C_6 = 1047, |
| NOTE_CS_6 = 1109, |
| NOTE_D_6 = 1175, |
| NOTE_DS_6 = 1245, |
| NOTE_E_6 = 1319, |
| NOTE_F_6 = 1397, |
| NOTE_FS_6 = 1480, |
| NOTE_G_6 = 1568, |
| NOTE_GS_6 = 1661, |
| NOTE_A_6 = 1760, |
| NOTE_AS_6 = 1865, |
| NOTE_B_6 = 1976, |
| NOTE_C_7 = 2093 |
| }; |
| |
| /** |
| * struct vidtv_encoder - A generic encoder type. |
| * @id: So we can cast to a concrete implementation when needed. |
| * @name: Usually the same as the stream name. |
| * @encoder_buf: The encoder internal buffer for the access units. |
| * @encoder_buf_sz: The encoder buffer size, in bytes |
| * @encoder_buf_offset: Our byte position in the encoder buffer. |
| * @sample_count: How many samples we have encoded in total. |
| * @src_buf: The source of raw data to be encoded, encoder might set a |
| * default if null. |
| * @src_buf_offset: Our position in the source buffer. |
| * @is_video_encoder: Whether this a video encoder (as opposed to audio) |
| * @ctx: Encoder-specific state. |
| * @stream_id: Examples: Audio streams (0xc0-0xdf), Video streams |
| * (0xe0-0xef). |
| * @es_id: The TS PID to use for the elementary stream in this encoder. |
| * @encode: Prepare enough AUs for the given amount of time. |
| * @clear: Clear the encoder output. |
| * @sync: Attempt to synchronize with this encoder. |
| * @sampling_rate_hz: The sampling rate (or fps, if video) used. |
| * @last_sample_cb: Called when the encoder runs out of data.This is |
| * so the source can read data in a |
| * piecemeal fashion instead of having to |
| * provide it all at once. |
| * @destroy: Destroy this encoder, freeing allocated resources. |
| * @next: Next in the chain |
| */ |
| struct vidtv_encoder { |
| enum vidtv_encoder_id id; |
| char *name; |
| |
| u8 *encoder_buf; |
| u32 encoder_buf_sz; |
| u32 encoder_buf_offset; |
| |
| u64 sample_count; |
| int last_duration; |
| int note_offset; |
| enum musical_notes last_tone; |
| |
| struct vidtv_access_unit *access_units; |
| |
| void *src_buf; |
| u32 src_buf_sz; |
| u32 src_buf_offset; |
| |
| bool is_video_encoder; |
| void *ctx; |
| |
| __be16 stream_id; |
| |
| __be16 es_pid; |
| |
| void *(*encode)(struct vidtv_encoder *e); |
| |
| u32 (*clear)(struct vidtv_encoder *e); |
| |
| struct vidtv_encoder *sync; |
| |
| u32 sampling_rate_hz; |
| |
| void (*last_sample_cb)(u32 sample_no); |
| |
| void (*destroy)(struct vidtv_encoder *e); |
| |
| struct vidtv_encoder *next; |
| }; |
| |
| #endif /* VIDTV_ENCODER_H */ |