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