| /****************************************************************************** |
| * |
| * Copyright (C) 2016-2017 Cadence Design Systems, Inc. |
| * All rights reserved worldwide. |
| * |
| * Copyright 2017-2018 NXP |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3. Neither the name of the copyright holder nor the names of its contributors |
| * may be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE SOFTWARE IS PROVIDED "AS IS", |
| * WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
| * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE |
| * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE |
| * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| * |
| ****************************************************************************** |
| * |
| * API_AVI.c |
| * |
| ****************************************************************************** |
| */ |
| |
| #include "API_AVI.h" |
| #include "API_Infoframe.h" |
| |
| CDN_API_STATUS cdn_api_set_avi(VIC_MODES vic_mode, |
| VIC_PXL_ENCODING_FORMAT color_mode, |
| BT_TYPE itu_ver) |
| { |
| unsigned int active_slot = vic_table[vic_mode][H_BLANK]; |
| unsigned int line_width = vic_table[vic_mode][H_TOTAL]; |
| unsigned int hactive = line_width - active_slot + 1; |
| unsigned int vactive = vic_table[vic_mode][V_ACTIVE] + 1; |
| |
| unsigned int hactive_l = hactive - 256 * ((unsigned int)hactive / 256); |
| unsigned int hactive_h = hactive / 256; |
| unsigned int vactive_l = vactive - 256 * ((unsigned int)vactive / 256); |
| unsigned int vactive_h = vactive / 256; |
| |
| /* unsigned int packet; */ |
| |
| unsigned int packet_type = 0x82; |
| unsigned int packet_version = 0x2; |
| unsigned int packet_len = 0xd; |
| unsigned int packet_y = 0; |
| unsigned int packet_c = 0; |
| unsigned int packet_r = 0; |
| unsigned int packet_vic = 0; |
| unsigned int packet_pr = 0; |
| unsigned int packet_buf[18 / sizeof(unsigned int)]; |
| unsigned char *packet = (unsigned char *)&packet_buf[0]; |
| unsigned int packet_hb0 = 0; |
| unsigned int packet_hb1 = 0; |
| unsigned int packet_hb2 = 0; |
| unsigned int packet_pb0 = 0; |
| unsigned int packet_pb1 = 0; |
| unsigned int packet_pb2 = 0; |
| unsigned int packet_pb3 = 0; |
| unsigned int packet_pb4 = 0; |
| unsigned int packet_pb5 = 0; |
| unsigned int packet_pb6 = 0; |
| unsigned int packet_pb7 = 0; |
| unsigned int packet_pb8 = 0; |
| unsigned int packet_pb9 = 0; |
| unsigned int packet_pb10 = 0; |
| unsigned int packet_pb11 = 0; |
| unsigned int packet_pb12 = 0; |
| unsigned int packet_pb13 = 0; |
| unsigned int pb1_13_chksum = 0; |
| unsigned int packet_chksum = 0; |
| |
| if (color_mode == PXL_RGB) |
| packet_y = 0; |
| else if (color_mode == YCBCR_4_4_4) |
| packet_y = 2; |
| else if (color_mode == YCBCR_4_2_2) |
| packet_y = 1; |
| else if (color_mode == YCBCR_4_2_0) |
| packet_y = 3; |
| |
| /* Colorimetry: Nodata=0 IT601=1 ITU709=2 */ |
| if (itu_ver == BT_601) |
| packet_c = 1; |
| else if (itu_ver == BT_709) |
| packet_c = 2; |
| else |
| packet_c = 0; |
| |
| unsigned int packet_a0 = 1; |
| unsigned int packet_b = 0; |
| unsigned int packet_s = 0; |
| unsigned int packet_sc = 0; /* Picture Scaling */ |
| |
| /* Active Format Aspec Ratio: Same As Picture = 0x8 4:3(Center)=0x9 |
| 16:9=0xA 14:9=0xB */ |
| packet_r = vic_table[vic_mode][VIC_R3_0]; |
| /* Aspect Ratio: Nodata=0 4:3=1 16:9=2 */ |
| unsigned int packet_m = 0; |
| /* Quantization Range Default=0 Limited Range=0x1 FullRange=0x2 |
| Reserved 0x3 */ |
| unsigned int packet_q = 0; |
| /* Quantization Range 0=Limited Range FullRange=0x1 Reserved 0x3/2 */ |
| unsigned int packet_yq = 0; |
| /* Extended Colorimetry xvYCC601=0x0 xvYCC709=1 All other Reserved */ |
| unsigned int packet_ec = 0; |
| /*IT content nodata=0 ITcontent=1 */ |
| unsigned int packet_it = 0; |
| /* Video Code (CEA) */ |
| packet_vic = vic_table[vic_mode][VIC]; |
| /* Pixel Repetition 0 ... 9 (1-10) */ |
| packet_pr = vic_table[vic_mode][VIC_PR]; |
| /* Content Type */ |
| unsigned int packet_cn = 0; |
| |
| packet_hb0 = packet_type; |
| packet_hb1 = packet_version; |
| packet_hb2 = packet_len; |
| |
| packet_pb1 = 32 * packet_y + 16 * packet_a0 + 4 * packet_b + packet_s; |
| packet_pb2 = 64 * packet_c + 16 * packet_m + packet_r; |
| packet_pb3 = |
| 128 * packet_it + 16 * packet_ec + 4 * packet_q + packet_sc; |
| packet_pb4 = packet_vic; |
| packet_pb5 = 64 * packet_yq + 16 * packet_cn + packet_pr; |
| packet_pb6 = 0; |
| packet_pb7 = 0; |
| packet_pb8 = vactive_l; |
| packet_pb9 = vactive_h; |
| packet_pb10 = 0; |
| packet_pb11 = 0; |
| packet_pb12 = hactive_l; |
| packet_pb13 = hactive_h; |
| |
| pb1_13_chksum = |
| (packet_hb0 + packet_hb1 + packet_hb2 + packet_pb1 + |
| packet_pb2 + packet_pb3 + packet_pb4 + packet_pb5 + |
| packet_pb6 + packet_pb7 + packet_pb8 + packet_pb9 + |
| packet_pb10 + packet_pb11 + packet_pb12 + packet_pb13); |
| packet_chksum = |
| 256 - (pb1_13_chksum - |
| 256 * ((unsigned int)pb1_13_chksum / 256)); |
| packet_pb0 = packet_chksum; |
| |
| packet[0] = 0; |
| packet[1] = packet_hb0; |
| packet[2] = packet_hb1; |
| packet[3] = packet_hb2; |
| packet[4] = packet_pb0; |
| packet[5] = packet_pb1; |
| packet[6] = packet_pb2; |
| packet[7] = packet_pb3; |
| packet[8] = packet_pb4; |
| packet[9] = packet_pb5; |
| packet[10] = packet_pb6; |
| packet[11] = packet_pb7; |
| packet[12] = packet_pb8; |
| packet[13] = packet_pb9; |
| packet[14] = packet_pb10; |
| packet[15] = packet_pb11; |
| packet[16] = packet_pb12; |
| packet[17] = packet_pb13; |
| |
| cdn_api_infoframeset(0, packet_len, |
| (unsigned int *)&packet[0], packet_type); |
| |
| return CDN_OK; |
| } /* End API */ |