blob: d9346f23758533029f55354d8a5c9327ed30b266 [file] [log] [blame]
/******************************************************************************
*
* 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 */