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