hsdaoh-rp2350/libpicohsdaoh/data_packet.h
2024-11-18 00:06:59 +01:00

97 lines
2.6 KiB
C

#ifndef DATA_PACKET_H
#define DATA_PACKET_H
#include "pico.h"
#define TMDS_CHANNELS 3
#define N_LINE_PER_DATA 2
#define W_GUARDBAND 2
#define W_PREAMBLE 8
#define W_DATA_PACKET 32
#ifndef DVI_SYMBOLS_PER_WORD
#define DVI_SYMBOLS_PER_WORD 2
#endif
#if DVI_SYMBOLS_PER_WORD != 1 && DVI_SYMBOLS_PER_WORD !=2
#error "Unsupported value for DVI_SYMBOLS_PER_WORD"
#endif
#define W_DATA_ISLAND (W_GUARDBAND * 2 + W_DATA_PACKET)
#define N_DATA_ISLAND_WORDS (W_DATA_ISLAND / DVI_SYMBOLS_PER_WORD)
typedef enum {
SCAN_INFO_NO_DATA,
OVERSCAN,
UNDERSCAN
} scan_info;
typedef enum {
RGB,
YCBCR422,
YCBCR444
} pixel_format;
typedef enum {
COLORIMETRY_NO_DATA,
ITU601,
ITU709,
EXTENDED
} colorimetry;
typedef enum {
PIC_ASPECT_RATIO_NO_DATA,
PIC_ASPECT_RATIO_4_3,
PIC_ASPECT_RATIO_16_9
} picture_aspect_ratio;
typedef enum {
ACTIVE_FORMAT_ASPECT_RATIO_NO_DATA = -1,
SAME_AS_PAR = 8,
ACTIVE_FORMAT_ASPECT_RATIO_4_3,
ACTIVE_FORMAT_ASPECT_RATIO_16_9,
ACTIVE_FORMAT_ASPECT_RATIO_14_9
} active_format_aspect_ratio;
typedef enum {
DEFAULT,
LIMITED,
FULL
} RGB_quantization_range;
typedef enum {
_640x480P60 = 1,
_720x480P60 = 2,
_1280x720P60 = 4,
_1920x1080I60 = 5,
_1920x1080P60 = 16,
} video_code;
typedef struct data_packet {
uint8_t header[4];
uint8_t subpacket[4][8];
} data_packet_t;
typedef struct data_island_stream {
uint32_t data[TMDS_CHANNELS][N_DATA_ISLAND_WORDS];
} data_island_stream_t;
// Functions related to the data_packet (requires a data_packet instance)
void compute_header_parity(data_packet_t *data_packet);
void compute_subpacket_parity(data_packet_t *data_packet, int i);
void compute_parity(data_packet_t *data_packet);
void compute_info_frame_checkSum(data_packet_t *data_packet);
void encode_header(const data_packet_t *data_packet, uint32_t *dst, int hv, bool firstPacket);
void encode_subpacket(const data_packet_t *data_packet, uint32_t *dst1, uint32_t *dst2);
void set_null(data_packet_t *data_packet);
void set_AVI_info_frame(data_packet_t *data_packet, scan_info s, pixel_format y, colorimetry c, picture_aspect_ratio m,
active_format_aspect_ratio r, RGB_quantization_range q, video_code vic);
// Public Functions
extern uint32_t defaultDataPacket12_[N_DATA_ISLAND_WORDS];
inline uint32_t *getDefaultDataPacket12() {
return defaultDataPacket12_;
}
uint32_t *getDefaultDataPacket0(bool vsync, bool hsync);
void encode_data_island(data_island_stream_t *dst, const data_packet_t *packet, bool vsync, bool hsync);
#endif