| 1 | /*************************************************************************** |
|---|
| 2 | * Copyright (c) 2008, Broadcom Corporation |
|---|
| 3 | * All Rights Reserved |
|---|
| 4 | * Confidential Property of Broadcom Corporation |
|---|
| 5 | * |
|---|
| 6 | * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE |
|---|
| 7 | * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR |
|---|
| 8 | * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. |
|---|
| 9 | * |
|---|
| 10 | * $brcm_Workfile: $ |
|---|
| 11 | * $brcm_Revision: $ |
|---|
| 12 | * $brcm_Date: $ |
|---|
| 13 | * |
|---|
| 14 | * Module Description: |
|---|
| 15 | * |
|---|
| 16 | * Revision History: |
|---|
| 17 | * |
|---|
| 18 | * $brcm_Log: $ |
|---|
| 19 | * |
|---|
| 20 | ***************************************************************************/ |
|---|
| 21 | #ifndef SCTE_127_H__ |
|---|
| 22 | #define SCTE_127_H__ |
|---|
| 23 | |
|---|
| 24 | #include "bos.h" |
|---|
| 25 | #include "genericlist.h" |
|---|
| 26 | |
|---|
| 27 | #define SCTE_127_NUM_DATA_BUF 70 /* for amol and gs, 60 for 1 second of data, plus extra buffer for jittering */ |
|---|
| 28 | |
|---|
| 29 | /* Data Service Identifier Extersions defines */ |
|---|
| 30 | #define SCTE_127_DATA_ID 0x99 /* SCTE 127 data id */ |
|---|
| 31 | |
|---|
| 32 | #define SCTE_127_DATA_SERVICE_ID_AMOL 0xFE /* AMOL 48/96 */ |
|---|
| 33 | #define SCTE_127_DATA_SERVICE_ID_NABTS 0xFC /* North American Basic Teletext Specification */ |
|---|
| 34 | #define SCTE_127_DATA_SERVICE_ID_TVG2X 0xFB |
|---|
| 35 | #define SCTE_127_DATA_SERVICE_ID_CP 0xF9 /* copy protection */ |
|---|
| 36 | #define SCTE_127_DATA_SERVICE_ID_VITC 0xF7 /* Vertical Interval Time Code */ |
|---|
| 37 | |
|---|
| 38 | /* Data Unit Identifier defines */ |
|---|
| 39 | #define SCTE_127_DATA_UNIT_ID_AMOL48 0xD0 /* AMOL 48 */ |
|---|
| 40 | #define SCTE_127_DATA_UNIT_ID_AMOL96 0xD1 /* AMOL 96 */ |
|---|
| 41 | #define SCTE_127_DATA_UNIT_ID_NABTS 0xD5 |
|---|
| 42 | #define SCTE_127_DATA_UNIT_ID_TVG2X 0xD6 |
|---|
| 43 | #define SCTE_127_DATA_UNIT_ID_CP 0xD7 /* copy protection */ |
|---|
| 44 | #define SCTE_127_DATA_UNIT_ID_VITC 0xD9 |
|---|
| 45 | |
|---|
| 46 | #define SCTE_127_DATA_UNIT_ID_AMOL48_LEN 7 |
|---|
| 47 | #define SCTE_127_DATA_UNIT_ID_AMOL96_LEN 12 |
|---|
| 48 | #define SCTE_127_DATA_UNIT_ID_NABTS_LEN 35 |
|---|
| 49 | #define SCTE_127_DATA_UNIT_ID_TVG2X_LEN 5 |
|---|
| 50 | #define SCTE_127_DATA_UNIT_ID_CP_LEN 2 |
|---|
| 51 | #define SCTE_127_DATA_UNIT_ID_VITC_LEN 9 |
|---|
| 52 | |
|---|
| 53 | typedef struct { |
|---|
| 54 | LINKS_T links; |
|---|
| 55 | |
|---|
| 56 | unsigned char field_parity; |
|---|
| 57 | unsigned char line_offset; |
|---|
| 58 | |
|---|
| 59 | union { |
|---|
| 60 | unsigned char amol48[6]; /* 41 bits + 7 bits padding (SOM) */ |
|---|
| 61 | unsigned char amol96[12]; /* 88 bits + 8 bits SOM */ |
|---|
| 62 | /* enable it only if we support NABTS, to save space */ |
|---|
| 63 | #ifdef SCTE_127_NABTS |
|---|
| 64 | unsigned char nabts[33]; /* 264 bits = 33 bytes */ |
|---|
| 65 | #endif |
|---|
| 66 | unsigned int tvg2x; /* 32 bits */ |
|---|
| 67 | unsigned char vitc[8]; /* 64 bits */ |
|---|
| 68 | unsigned char cp[1]; /* 2 bits cp_data_block, 6 bits reserved */ |
|---|
| 69 | } u; |
|---|
| 70 | |
|---|
| 71 | int data_unit_type; /* data type, contained in the */ |
|---|
| 72 | int amol_type; /* AMOL TYPE if data_unit_type = AMOL, */ |
|---|
| 73 | } scte_127_data, *pscte_127_data; |
|---|
| 74 | |
|---|
| 75 | #define SCTE_127_DATA_UNIT_FIELD_PARITY(h) (((h) >> 5) & 0x1) |
|---|
| 76 | #define SCTE_127_DATA_UNIT_LINE_OFFSET(h) ((h) & 0x1f) |
|---|
| 77 | |
|---|
| 78 | #define SCTE_127_DATA_NABTS_FRAMING_CODE 0xE7 |
|---|
| 79 | |
|---|
| 80 | #define SCTE_127_MAX_FIELD 2 /* even and odd field */ |
|---|
| 81 | #define SCTE_127_MAX_AMOL_DATA 2 /* 2 lines */ |
|---|
| 82 | #define SCTE_127_MAX_GS_DATA 5 /* 5 lines */ |
|---|
| 83 | |
|---|
| 84 | void scte_bit_swap(unsigned char *pbuf, int size); |
|---|
| 85 | int scte_pes_data_field(unsigned char *packet, int size, scte_127_data *data, int *unit_type); |
|---|
| 86 | |
|---|
| 87 | typedef struct { |
|---|
| 88 | b_mutex_t mutex; /* mutex for list handling */ |
|---|
| 89 | LIST_T amol_list[SCTE_127_MAX_FIELD]; /* amol data list */ |
|---|
| 90 | LIST_T gs_list[SCTE_127_MAX_FIELD]; /* gs data list */ |
|---|
| 91 | LIST_T free_list; /* free data buffer list */ |
|---|
| 92 | int amol_count[SCTE_127_MAX_FIELD]; /* amol data count */ |
|---|
| 93 | int gs_count[SCTE_127_MAX_FIELD]; /* amol data count */ |
|---|
| 94 | scte_127_data data[SCTE_127_NUM_DATA_BUF]; /* total data buffers used for SCTE 127 */ |
|---|
| 95 | } scte_127_handle, *pscte_127_handle; |
|---|
| 96 | |
|---|
| 97 | pscte_127_handle scte_127_get_handle(void); |
|---|
| 98 | pscte_127_handle scte_127_init(void); |
|---|
| 99 | void scte_127_deinit(pscte_127_handle pscte_127); |
|---|
| 100 | void scte_127_enable(pscte_127_handle pscte_127, int enable); |
|---|
| 101 | |
|---|
| 102 | int scte_127_queue_buffer(pscte_127_handle pscte_127, pscte_127_data pdata); |
|---|
| 103 | int scte_127_queue_data(pscte_127_handle pscte_127, pscte_127_data data); |
|---|
| 104 | int scte_127_feed_data_buf(pscte_127_handle pscte_127, int parity); |
|---|
| 105 | int scte_127_pes_data_field_parser(pscte_127_handle pscte_127, unsigned char *pdata_id, int size); |
|---|
| 106 | int scte_127_reset(pscte_127_handle pscte_127); |
|---|
| 107 | int scte_127_has_data(pscte_127_handle pscte_127, int parity); |
|---|
| 108 | |
|---|
| 109 | #ifdef HAS_VBI |
|---|
| 110 | int scte_127_queue_buffer_isr(pscte_127_handle pscte_127, pscte_127_data pdata); |
|---|
| 111 | pscte_127_data scte_127_get_amol_data_buf_isr(pscte_127_handle pscte_127, int parity); |
|---|
| 112 | bool scte_127_get_amol_data_buf_isr_ex(pscte_127_handle pscte_127, int parity, int *type, unsigned char *amol_data); |
|---|
| 113 | int scte_127_get_gs_data_buf_isr(pscte_127_handle pscte_127, int parity, int *line_offset, int *gs_count, uint32_t *gs_data); |
|---|
| 114 | int scte_127_set_gs_line_mask(pscte_127_handle pscte_127, int parity, unsigned int base, unsigned int line_mask); |
|---|
| 115 | #endif // HAS_VBI |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | #endif /* SCTE_127_H__ */ |
|---|