Browse Source

SMPTE 291: rewrite for 16 bit

master
Christophe Massiot 8 years ago
parent
commit
a23cd7525e
1 changed files with 41 additions and 27 deletions
  1. +41
    -27
      smpte/291.h

+ 41
- 27
smpte/291.h View File

@ -43,14 +43,14 @@ extern "C"
#endif
/*****************************************************************************
* SMPTE 291 ancillary data (8-bit mode only)
* SMPTE 291 ancillary data
*****************************************************************************/
#define S291_HEADER_SIZE 6
#define S291_FOOTER_SIZE 1
#define S291_ADF1 0x00
#define S291_ADF2 0xff
#define S291_ADF3 0xff
#define S291_ADF1 0x0000
#define S291_ADF2 0x03ff
#define S291_ADF3 0x03ff
/* SMPTE 2016 */
#define S291_AFD_DID 0x41
@ -90,58 +90,72 @@ extern "C"
#define S291_SMPTEVBI_DID 0x62
#define S291_SMPTEVBI_SDID 0x03
static inline void s291_set_did(uint8_t *p_s291, uint8_t i_did)
static inline uint16_t s291_parity(uint8_t i_val)
{
p_s291[3] = i_did;
uint8_t i_parity =
(((i_val * 0x0101010101010101ULL) & 0x8040201008040201ULL) % 0x1FF) & 1;
return (uint16_t)i_parity << 8 | ((uint16_t)(i_parity ^ 1) << 9);
}
static inline uint8_t s291_get_did(const uint8_t *p_s291)
static inline void s291_set_did(uint16_t *p_s291, uint8_t i_did)
{
return p_s291[3];
p_s291[3] = i_did | s291_parity(i_did);
}
static inline void s291_set_sdid(uint8_t *p_s291, uint8_t i_sdid)
static inline uint8_t s291_get_did(const uint16_t *p_s291)
{
p_s291[4] = i_sdid;
return p_s291[3] & 0xff;
}
static inline uint8_t s291_get_sdid(const uint8_t *p_s291)
static inline void s291_set_sdid(uint16_t *p_s291, uint8_t i_sdid)
{
return p_s291[4];
p_s291[4] = i_sdid | s291_parity(i_sdid);
}
static inline void s291_set_data_mode(uint8_t *p_s291, uint8_t i_data_mode)
static inline uint8_t s291_get_sdid(const uint16_t *p_s291)
{
p_s291[5] &= ~0x60;
p_s291[5] |= (i_data_mode << 5) & 0x60;
return p_s291[4] & 0xff;
}
#define s291_set_dbn s291_set_sdid
#define s291_get_dbn s291_get_sdid
static inline void s291_set_dc(uint8_t *p_s291, uint8_t i_dc)
static inline void s291_set_dc(uint16_t *p_s291, uint8_t i_dc)
{
p_s291[5] = i_dc;
p_s291[5] = i_dc | s291_parity(i_dc);
}
static inline uint8_t s291_get_dc(const uint8_t *p_s291)
static inline uint8_t s291_get_dc(const uint16_t *p_s291)
{
return p_s291[5];
return p_s291[5] & 0xff;
}
static inline uint8_t *s291_get_udw(const uint8_t *p_s291)
static inline uint16_t *s291_get_udw(const uint16_t *p_s291)
{
return (uint8_t *)&p_s291[6];
return (uint16_t *)&p_s291[6];
}
static inline bool s291_check_crc(const uint8_t *p_s291)
static inline uint16_t s291_compute_cs(const uint16_t *p_s291)
{
uint8_t i_crc = 0;
uint16_t i_cs = 0;
uint8_t i_dc = s291_get_dc(p_s291);
int i;
for (i = 3; i < i_dc + S291_HEADER_SIZE; i++)
i_crc += p_s291[i];
return i_crc == p_s291[i];
unsigned int i;
for (i = 3; i < i_dc + S291_HEADER_SIZE; i++) {
i_cs += p_s291[i] & 0x1ff;
i_cs &= 0x1ff;
}
return i_cs | (~i_cs & 0x100) << 1;
}
static inline void s291_set_cs(uint16_t *p_s291)
{
p_s291[S291_HEADER_SIZE + s291_get_dc(p_s291)] = s291_compute_cs(p_s291);
}
static inline bool s291_check_cs(const uint16_t *p_s291)
{
return p_s291[S291_HEADER_SIZE + s291_get_dc(p_s291)] ==
s291_compute_cs(p_s291);
}
#ifdef __cplusplus

Loading…
Cancel
Save