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 the code for an AES3 (also known as AES/EBU) encoder. 862306a36Sopenharmony_ci * It is based on EBU Tech 3250 and SMPTE 302M technical documents. 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * This encoder currently supports 16bit AES3 subframes using 16bit signed 1162306a36Sopenharmony_ci * integers. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Note: AU stands for Access Unit, and AAU stands for Audio Access Unit 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * Copyright (C) 2020 Daniel W. S. Almeida 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef VIDTV_S302M_H 1962306a36Sopenharmony_ci#define VIDTV_S302M_H 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/types.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include "vidtv_encoder.h" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* see SMPTE 302M 2007 clause 7.3 */ 2662306a36Sopenharmony_ci#define VIDTV_S302M_BUF_SZ 65024 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* see ETSI TS 102 154 v.1.2.1 clause 7.3.5 */ 2962306a36Sopenharmony_ci#define VIDTV_S302M_FORMAT_IDENTIFIER 0x42535344 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/** 3262306a36Sopenharmony_ci * struct vidtv_s302m_ctx - s302m encoder context. 3362306a36Sopenharmony_ci * @enc: A pointer to the containing encoder structure. 3462306a36Sopenharmony_ci * @frame_index: The current frame in a block 3562306a36Sopenharmony_ci * @au_count: The total number of access units encoded up to now 3662306a36Sopenharmony_ci * @last_duration: Duration of the tone currently being played 3762306a36Sopenharmony_ci * @note_offset: Position at the music tone array 3862306a36Sopenharmony_ci * @last_tone: Tone currently being played 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct vidtv_s302m_ctx { 4162306a36Sopenharmony_ci struct vidtv_encoder *enc; 4262306a36Sopenharmony_ci u32 frame_index; 4362306a36Sopenharmony_ci u32 au_count; 4462306a36Sopenharmony_ci int last_duration; 4562306a36Sopenharmony_ci unsigned int note_offset; 4662306a36Sopenharmony_ci enum musical_notes last_tone; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * struct vidtv_smpte_s302m_es - s302m MPEG Elementary Stream header. 5162306a36Sopenharmony_ci * 5262306a36Sopenharmony_ci * See SMPTE 302M 2007 table 1. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_cistruct vidtv_smpte_s302m_es { 5562306a36Sopenharmony_ci /* 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * audio_packet_size:16; 5862306a36Sopenharmony_ci * num_channels:2; 5962306a36Sopenharmony_ci * channel_identification:8; 6062306a36Sopenharmony_ci * bits_per_sample:2; // 0x0 for 16bits 6162306a36Sopenharmony_ci * zero:4; 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_ci __be32 bitfield; 6462306a36Sopenharmony_ci} __packed; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct vidtv_s302m_frame_16 { 6762306a36Sopenharmony_ci u8 data[5]; 6862306a36Sopenharmony_ci} __packed; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/** 7162306a36Sopenharmony_ci * struct vidtv_s302m_encoder_init_args - Args for the s302m encoder. 7262306a36Sopenharmony_ci * 7362306a36Sopenharmony_ci * @name: A name to identify this particular instance 7462306a36Sopenharmony_ci * @src_buf: The source buffer, encoder will default to a sine wave if this is NULL. 7562306a36Sopenharmony_ci * @src_buf_sz: The size of the source buffer. 7662306a36Sopenharmony_ci * @es_pid: The MPEG Elementary Stream PID to use. 7762306a36Sopenharmony_ci * @sync: Attempt to synchronize audio with this video encoder, if not NULL. 7862306a36Sopenharmony_ci * @last_sample_cb: A callback called when the encoder runs out of data. 7962306a36Sopenharmony_ci * @head: Add to this chain 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_cistruct vidtv_s302m_encoder_init_args { 8262306a36Sopenharmony_ci char *name; 8362306a36Sopenharmony_ci void *src_buf; 8462306a36Sopenharmony_ci u32 src_buf_sz; 8562306a36Sopenharmony_ci u16 es_pid; 8662306a36Sopenharmony_ci struct vidtv_encoder *sync; 8762306a36Sopenharmony_ci void (*last_sample_cb)(u32 sample_no); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci struct vidtv_encoder *head; 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistruct vidtv_encoder 9362306a36Sopenharmony_ci*vidtv_s302m_encoder_init(struct vidtv_s302m_encoder_init_args args); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_civoid vidtv_s302m_encoder_destroy(struct vidtv_encoder *encoder); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#endif /* VIDTV_S302M_H */ 98