/*
 * Binary License
 *
 * Copyright (c) 2008, Intel Corporation.
 * Portions (c), Imagination Technology, Ltd.
 * All rights reserved.
 * Redistribution and Use.  Redistribution and use in binary form, without
 * modification, of the software code provided with this license ("Software"),
 * are permitted provided that the following conditions are met:
 * 	Redistributions must reproduce the above copyright notice and this
 * license in the documentation and/or other materials provided with the Software.
 * 	Neither the name of Intel Corporation nor the name of Imagination
 * Technology, Ltd may be used to endorse or promote products derived from
 * the Software without specific prior written permission.
 * 	The Software can only be used in connection with the Intel hardware
 * designed to use the Software as outlined in the documentation. No other
 * use is authorized.
 * 	No reverse engineering, decompilation, or disassembly of the Software
 * is permitted.
 * 	The Software may not be distributed under terms different than this license.
 *
 * Limited Patent License.  Intel Corporation grants a world-wide, royalty-free,
 * non-exclusive license under patents it now or hereafter owns or controls to
 * make, have made, use, import, offer to sell and sell ("Utilize") the
 * Software, but solely to the extent that any such patent is necessary to
 * Utilize the Software alone.  The patent license shall not apply to any
 * combinations which include the Software.  No hardware per se is licensed
 * hereunder.
 * Ownership of Software and Copyrights. Title to all copies of the Software
 * remains with the copyright holders. The Software is copyrighted and
 * protected by the laws of the United States and other countries, and
 * international treaty provisions.
 *
 * DISCLAIMER.  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
 * OWNERS 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.
 *
 */
// This file was automatically generated from /img/dev/topazsc_v2/firmware/topaz_sc/bin/H264MasterFirmware.dnl using dnl2c.

extern unsigned int aui32H264_MasterMTXTOPAZFWText[];
extern unsigned int ui32H264_MasterMTXTOPAZFWTextSize;

extern unsigned int aui32H264_MasterMTXTOPAZFWData[];
extern unsigned int ui32H264_MasterMTXTOPAZFWDataSize;

extern unsigned int aui32H264_MasterMTXTOPAZFWTextReloc[];
extern unsigned char aui8H264_MasterMTXTOPAZFWTextRelocType[];
extern unsigned int aui32H264_MasterMTXTOPAZFWTextRelocFullAddr[];

extern unsigned int aui32H264_MasterMTXTOPAZFWDataReloc[];
extern unsigned int ui32H264_MasterMTXTOPAZFWDataRelocSize;

extern unsigned int ui32H264_MasterMTXTOPAZFWTextOrigin;
extern unsigned int ui32H264_MasterMTXTOPAZFWDataOrigin;

