EvaluationTestBench.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * 40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License. 60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at 70c1bc742181ded4930842b46e9507372f0b1b963James Dong * 80c1bc742181ded4930842b46e9507372f0b1b963James Dong * http://www.apache.org/licenses/LICENSE-2.0 90c1bc742181ded4930842b46e9507372f0b1b963James Dong * 100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software 110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS, 120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License. 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "H264SwDecApi.h" 180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include <stdio.h> 190c1bc742181ded4930842b46e9507372f0b1b963James Dong#include <stdlib.h> 200c1bc742181ded4930842b46e9507372f0b1b963James Dong#include <string.h> 210c1bc742181ded4930842b46e9507372f0b1b963James Dong 220c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid WriteOutput(FILE *fid, u8 *data, u32 picSize); 230c1bc742181ded4930842b46e9507372f0b1b963James Dong 240c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 250c1bc742181ded4930842b46e9507372f0b1b963James Dong 260c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: main 270c1bc742181ded4930842b46e9507372f0b1b963James Dong 280c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 290c1bc742181ded4930842b46e9507372f0b1b963James Dong main function. Assuming that executable is named 'decoder' the usage 300c1bc742181ded4930842b46e9507372f0b1b963James Dong is as follows 310c1bc742181ded4930842b46e9507372f0b1b963James Dong 320c1bc742181ded4930842b46e9507372f0b1b963James Dong decoder inputFileName 330c1bc742181ded4930842b46e9507372f0b1b963James Dong 340c1bc742181ded4930842b46e9507372f0b1b963James Dong , where inputFileName shall be name of file containing h264 stream 350c1bc742181ded4930842b46e9507372f0b1b963James Dong data. 360c1bc742181ded4930842b46e9507372f0b1b963James Dong 370c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 380c1bc742181ded4930842b46e9507372f0b1b963James Dongint main(int argc, char **argv) 390c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 400c1bc742181ded4930842b46e9507372f0b1b963James Dong 410c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 *byteStrmStart; 420c1bc742181ded4930842b46e9507372f0b1b963James Dong u8 *byteStrm; 430c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 strmLen; 440c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picSize; 450c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecInst decInst; 460c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecRet ret; 470c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecInput decInput; 480c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecOutput decOutput; 490c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecPicture decPicture; 500c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecInfo decInfo; 510c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picNumber; 520c1bc742181ded4930842b46e9507372f0b1b963James Dong 530c1bc742181ded4930842b46e9507372f0b1b963James Dong FILE *finput; 540c1bc742181ded4930842b46e9507372f0b1b963James Dong FILE *foutput; 550c1bc742181ded4930842b46e9507372f0b1b963James Dong 560c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Check that enough command line arguments given, if not -> print usage 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * information out */ 580c1bc742181ded4930842b46e9507372f0b1b963James Dong if (argc < 2) 590c1bc742181ded4930842b46e9507372f0b1b963James Dong { 600c1bc742181ded4930842b46e9507372f0b1b963James Dong printf( "Usage: %s file.h264\n", argv[0]); 610c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 620c1bc742181ded4930842b46e9507372f0b1b963James Dong } 630c1bc742181ded4930842b46e9507372f0b1b963James Dong 640c1bc742181ded4930842b46e9507372f0b1b963James Dong /* open output file for writing, output file named out.yuv. If file open 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * fails -> exit */ 660c1bc742181ded4930842b46e9507372f0b1b963James Dong foutput = fopen("out.yuv", "wb"); 670c1bc742181ded4930842b46e9507372f0b1b963James Dong if (foutput == NULL) 680c1bc742181ded4930842b46e9507372f0b1b963James Dong { 690c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("UNABLE TO OPEN OUTPUT FILE\n"); 700c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 710c1bc742181ded4930842b46e9507372f0b1b963James Dong } 720c1bc742181ded4930842b46e9507372f0b1b963James Dong 730c1bc742181ded4930842b46e9507372f0b1b963James Dong /* open input file for reading, file name given by user. If file open 740c1bc742181ded4930842b46e9507372f0b1b963James Dong * fails -> exit */ 750c1bc742181ded4930842b46e9507372f0b1b963James Dong finput = fopen(argv[argc-1], "rb"); 760c1bc742181ded4930842b46e9507372f0b1b963James Dong if (finput == NULL) 770c1bc742181ded4930842b46e9507372f0b1b963James Dong { 780c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("UNABLE TO OPEN INPUT FILE\n"); 790c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 800c1bc742181ded4930842b46e9507372f0b1b963James Dong } 810c1bc742181ded4930842b46e9507372f0b1b963James Dong 820c1bc742181ded4930842b46e9507372f0b1b963James Dong /* check size of the input file -> length of the stream in bytes */ 830c1bc742181ded4930842b46e9507372f0b1b963James Dong fseek(finput, 0L, SEEK_END); 840c1bc742181ded4930842b46e9507372f0b1b963James Dong strmLen = (u32)ftell(finput); 850c1bc742181ded4930842b46e9507372f0b1b963James Dong rewind(finput); 860c1bc742181ded4930842b46e9507372f0b1b963James Dong 870c1bc742181ded4930842b46e9507372f0b1b963James Dong /* allocate memory for stream buffer, exit if unsuccessful */ 880c1bc742181ded4930842b46e9507372f0b1b963James Dong byteStrm = byteStrmStart = (u8 *)H264SwDecMalloc(sizeof(u8)*strmLen); 890c1bc742181ded4930842b46e9507372f0b1b963James Dong if (byteStrm == NULL) 900c1bc742181ded4930842b46e9507372f0b1b963James Dong { 910c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("UNABLE TO ALLOCATE MEMORY\n"); 920c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 930c1bc742181ded4930842b46e9507372f0b1b963James Dong } 940c1bc742181ded4930842b46e9507372f0b1b963James Dong 950c1bc742181ded4930842b46e9507372f0b1b963James Dong /* read input stream from file to buffer and close input file */ 960c1bc742181ded4930842b46e9507372f0b1b963James Dong fread(byteStrm, sizeof(u8), strmLen, finput); 970c1bc742181ded4930842b46e9507372f0b1b963James Dong fclose(finput); 980c1bc742181ded4930842b46e9507372f0b1b963James Dong 990c1bc742181ded4930842b46e9507372f0b1b963James Dong /* initialize decoder. If unsuccessful -> exit */ 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong ret = H264SwDecInit(&decInst, 0); 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong if (ret != H264SWDEC_OK) 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("DECODER INITIALIZATION FAILED\n"); 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong /* initialize H264SwDecDecode() input structure */ 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.pStream = byteStrmStart; 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.dataLen = strmLen; 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.intraConcealmentMethod = 0; 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong picNumber = 0; 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong /* For performance measurements, read the start time (in seconds) here. 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong * The decoding time should be measured over several frames and after 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong * that average fps (frames/second) can be calculated. 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong * 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong * startTime = GetTime(); 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong * 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong * To prevent calculating file I/O latensies as a decoding time, 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong * comment out WriteOutput function call. Also prints to stdout might 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong * consume considerable amount of cycles during measurement */ 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong /* main decoding loop */ 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong do 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong /* call API function to perform decoding */ 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong ret = H264SwDecDecode(decInst, &decInput, &decOutput); 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong switch(ret) 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong case H264SWDEC_HDRS_RDY_BUFF_NOT_EMPTY: 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong /* picture dimensions are available for query now */ 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong ret = H264SwDecGetInfo(decInst, &decInfo); 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong if (ret != H264SWDEC_OK) 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong /* picture size in pixels */ 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong picSize = decInfo.picWidth * decInfo.picHeight; 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong /* memory needed for YCbCr 4:2:0 picture in bytes */ 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong picSize = (3 * picSize)/2; 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong /* memory needed for 16-bit RGB picture in bytes 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong * picSize = (decInfo.picWidth * decInfo.picHeight) * 2; */ 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("Width %d Height %d\n", 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong decInfo.picWidth, decInfo.picHeight); 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong /* update H264SwDecDecode() input structure, number of bytes 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong * "consumed" is computed as difference between the new stream 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong * pointer and old stream pointer */ 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.dataLen -= 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong (u32)(decOutput.pStrmCurrPos - decInput.pStream); 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.pStream = decOutput.pStrmCurrPos; 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong case H264SWDEC_PIC_RDY_BUFF_NOT_EMPTY: 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong case H264SWDEC_PIC_RDY: 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong /* update H264SwDecDecode() input structure, number of bytes 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong * "consumed" is computed as difference between the new stream 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong * pointer and old stream pointer */ 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.dataLen -= 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong (u32)(decOutput.pStrmCurrPos - decInput.pStream); 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong decInput.pStream = decOutput.pStrmCurrPos; 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong /* use function H264SwDecNextPicture() to obtain next picture 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong * in display order. Function is called until no more images 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong * are ready for display */ 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong while (H264SwDecNextPicture(decInst, &decPicture, 0) == 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SWDEC_PIC_RDY) { picNumber++; 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("PIC %d, type %s, concealed %d\n", picNumber, 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong decPicture.isIdrPicture ? "IDR" : "NON-IDR", 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong decPicture.nbrOfErrMBs); 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong fflush(stdout); 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Do color conversion if needed to get display image 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong * in RGB-format 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong * 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong * YuvToRgb( decPicture.pOutputPicture, pRgbPicture ); */ 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong /* write next display image to output file */ 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong WriteOutput(foutput, (u8*)decPicture.pOutputPicture, 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong picSize); 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong case H264SWDEC_EVALUATION_LIMIT_EXCEEDED: 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong /* evaluation version of the decoder has limited decoding 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong * capabilities */ 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("EVALUATION LIMIT REACHED\n"); 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong goto end; 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong default: 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("UNRECOVERABLE ERROR\n"); 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong return -1; 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong /* keep decoding until all data from input stream buffer consumed */ 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong } while (decInput.dataLen > 0); 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong 2040c1bc742181ded4930842b46e9507372f0b1b963James Dongend: 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong /* if output in display order is preferred, the decoder shall be forced 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong * to output pictures remaining in decoded picture buffer. Use function 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong * H264SwDecNextPicture() to obtain next picture in display order. Function 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong * is called until no more images are ready for display. Second parameter 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong * for the function is set to '1' to indicate that this is end of the 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong * stream and all pictures shall be output */ 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong while (H264SwDecNextPicture(decInst, &decPicture, 1) == 2130c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SWDEC_PIC_RDY) { 2140c1bc742181ded4930842b46e9507372f0b1b963James Dong 2150c1bc742181ded4930842b46e9507372f0b1b963James Dong picNumber++; 2160c1bc742181ded4930842b46e9507372f0b1b963James Dong 2170c1bc742181ded4930842b46e9507372f0b1b963James Dong printf("PIC %d, type %s, concealed %d\n", picNumber, 2180c1bc742181ded4930842b46e9507372f0b1b963James Dong decPicture.isIdrPicture ? "IDR" : "NON-IDR", 2190c1bc742181ded4930842b46e9507372f0b1b963James Dong decPicture.nbrOfErrMBs); 2200c1bc742181ded4930842b46e9507372f0b1b963James Dong fflush(stdout); 2210c1bc742181ded4930842b46e9507372f0b1b963James Dong 2220c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Do color conversion if needed to get display image 2230c1bc742181ded4930842b46e9507372f0b1b963James Dong * in RGB-format 2240c1bc742181ded4930842b46e9507372f0b1b963James Dong * 2250c1bc742181ded4930842b46e9507372f0b1b963James Dong * YuvToRgb( decPicture.pOutputPicture, pRgbPicture ); */ 2260c1bc742181ded4930842b46e9507372f0b1b963James Dong 2270c1bc742181ded4930842b46e9507372f0b1b963James Dong /* write next display image to output file */ 2280c1bc742181ded4930842b46e9507372f0b1b963James Dong WriteOutput(foutput, (u8*)decPicture.pOutputPicture, picSize); 2290c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2300c1bc742181ded4930842b46e9507372f0b1b963James Dong 2310c1bc742181ded4930842b46e9507372f0b1b963James Dong /* For performance measurements, read the end time (in seconds) here. 2320c1bc742181ded4930842b46e9507372f0b1b963James Dong * 2330c1bc742181ded4930842b46e9507372f0b1b963James Dong * endTime = GetTime(); 2340c1bc742181ded4930842b46e9507372f0b1b963James Dong * 2350c1bc742181ded4930842b46e9507372f0b1b963James Dong * Now the performance can be calculated as frames per second: 2360c1bc742181ded4930842b46e9507372f0b1b963James Dong * fps = picNumber / (endTime - startTime); */ 2370c1bc742181ded4930842b46e9507372f0b1b963James Dong 2380c1bc742181ded4930842b46e9507372f0b1b963James Dong 2390c1bc742181ded4930842b46e9507372f0b1b963James Dong /* release decoder instance */ 2400c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecRelease(decInst); 2410c1bc742181ded4930842b46e9507372f0b1b963James Dong 2420c1bc742181ded4930842b46e9507372f0b1b963James Dong /* close output file */ 2430c1bc742181ded4930842b46e9507372f0b1b963James Dong fclose(foutput); 2440c1bc742181ded4930842b46e9507372f0b1b963James Dong 2450c1bc742181ded4930842b46e9507372f0b1b963James Dong /* free byte stream buffer */ 2460c1bc742181ded4930842b46e9507372f0b1b963James Dong free(byteStrmStart); 2470c1bc742181ded4930842b46e9507372f0b1b963James Dong 2480c1bc742181ded4930842b46e9507372f0b1b963James Dong return 0; 2490c1bc742181ded4930842b46e9507372f0b1b963James Dong 2500c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2510c1bc742181ded4930842b46e9507372f0b1b963James Dong 2520c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 2530c1bc742181ded4930842b46e9507372f0b1b963James Dong 2540c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: WriteOutput 2550c1bc742181ded4930842b46e9507372f0b1b963James Dong 2560c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 2570c1bc742181ded4930842b46e9507372f0b1b963James Dong Write picture pointed by data to file pointed by fid. Size of the 2580c1bc742181ded4930842b46e9507372f0b1b963James Dong picture in pixels is indicated by picSize. 2590c1bc742181ded4930842b46e9507372f0b1b963James Dong 2600c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 2610c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid WriteOutput(FILE *fid, u8 *data, u32 picSize) 2620c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 2630c1bc742181ded4930842b46e9507372f0b1b963James Dong fwrite(data, 1, picSize, fid); 2640c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2650c1bc742181ded4930842b46e9507372f0b1b963James Dong 2660c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 2670c1bc742181ded4930842b46e9507372f0b1b963James Dong 2680c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: H264SwDecTrace 2690c1bc742181ded4930842b46e9507372f0b1b963James Dong 2700c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 2710c1bc742181ded4930842b46e9507372f0b1b963James Dong Example implementation of H264SwDecTrace function. Prototype of this 2720c1bc742181ded4930842b46e9507372f0b1b963James Dong function is given in H264SwDecApi.h. This implementation appends 2730c1bc742181ded4930842b46e9507372f0b1b963James Dong trace messages to file named 'dec_api.trc'. 2740c1bc742181ded4930842b46e9507372f0b1b963James Dong 2750c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 2760c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid H264SwDecTrace(char *string) 2770c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 2780c1bc742181ded4930842b46e9507372f0b1b963James Dong FILE *fp; 2790c1bc742181ded4930842b46e9507372f0b1b963James Dong 2800c1bc742181ded4930842b46e9507372f0b1b963James Dong fp = fopen("dec_api.trc", "at"); 2810c1bc742181ded4930842b46e9507372f0b1b963James Dong 2820c1bc742181ded4930842b46e9507372f0b1b963James Dong if (!fp) 2830c1bc742181ded4930842b46e9507372f0b1b963James Dong return; 2840c1bc742181ded4930842b46e9507372f0b1b963James Dong 2850c1bc742181ded4930842b46e9507372f0b1b963James Dong fwrite(string, 1, strlen(string), fp); 2860c1bc742181ded4930842b46e9507372f0b1b963James Dong fwrite("\n", 1,1, fp); 2870c1bc742181ded4930842b46e9507372f0b1b963James Dong 2880c1bc742181ded4930842b46e9507372f0b1b963James Dong fclose(fp); 2890c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2900c1bc742181ded4930842b46e9507372f0b1b963James Dong 2910c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 2920c1bc742181ded4930842b46e9507372f0b1b963James Dong 2930c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: H264SwDecmalloc 2940c1bc742181ded4930842b46e9507372f0b1b963James Dong 2950c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 2960c1bc742181ded4930842b46e9507372f0b1b963James Dong Example implementation of H264SwDecMalloc function. Prototype of this 2970c1bc742181ded4930842b46e9507372f0b1b963James Dong function is given in H264SwDecApi.h. This implementation uses 2980c1bc742181ded4930842b46e9507372f0b1b963James Dong library function malloc for allocation of memory. 2990c1bc742181ded4930842b46e9507372f0b1b963James Dong 3000c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3010c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid* H264SwDecMalloc(u32 size) 3020c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3030c1bc742181ded4930842b46e9507372f0b1b963James Dong return malloc(size); 3040c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3050c1bc742181ded4930842b46e9507372f0b1b963James Dong 3060c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 3070c1bc742181ded4930842b46e9507372f0b1b963James Dong 3080c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: H264SwDecFree 3090c1bc742181ded4930842b46e9507372f0b1b963James Dong 3100c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 3110c1bc742181ded4930842b46e9507372f0b1b963James Dong Example implementation of H264SwDecFree function. Prototype of this 3120c1bc742181ded4930842b46e9507372f0b1b963James Dong function is given in H264SwDecApi.h. This implementation uses 3130c1bc742181ded4930842b46e9507372f0b1b963James Dong library function free for freeing of memory. 3140c1bc742181ded4930842b46e9507372f0b1b963James Dong 3150c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3160c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid H264SwDecFree(void *ptr) 3170c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3180c1bc742181ded4930842b46e9507372f0b1b963James Dong free(ptr); 3190c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3200c1bc742181ded4930842b46e9507372f0b1b963James Dong 3210c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 3220c1bc742181ded4930842b46e9507372f0b1b963James Dong 3230c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: H264SwDecMemcpy 3240c1bc742181ded4930842b46e9507372f0b1b963James Dong 3250c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 3260c1bc742181ded4930842b46e9507372f0b1b963James Dong Example implementation of H264SwDecMemcpy function. Prototype of this 3270c1bc742181ded4930842b46e9507372f0b1b963James Dong function is given in H264SwDecApi.h. This implementation uses 3280c1bc742181ded4930842b46e9507372f0b1b963James Dong library function memcpy to copy src to dest. 3290c1bc742181ded4930842b46e9507372f0b1b963James Dong 3300c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3310c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid H264SwDecMemcpy(void *dest, void *src, u32 count) 3320c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3330c1bc742181ded4930842b46e9507372f0b1b963James Dong memcpy(dest, src, count); 3340c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3350c1bc742181ded4930842b46e9507372f0b1b963James Dong 3360c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 3370c1bc742181ded4930842b46e9507372f0b1b963James Dong 3380c1bc742181ded4930842b46e9507372f0b1b963James Dong Function name: H264SwDecMemset 3390c1bc742181ded4930842b46e9507372f0b1b963James Dong 3400c1bc742181ded4930842b46e9507372f0b1b963James Dong Purpose: 3410c1bc742181ded4930842b46e9507372f0b1b963James Dong Example implementation of H264SwDecMemset function. Prototype of this 3420c1bc742181ded4930842b46e9507372f0b1b963James Dong function is given in H264SwDecApi.h. This implementation uses 3430c1bc742181ded4930842b46e9507372f0b1b963James Dong library function memset to set content of memory area pointed by ptr. 3440c1bc742181ded4930842b46e9507372f0b1b963James Dong 3450c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3460c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid H264SwDecMemset(void *ptr, i32 value, u32 count) 3470c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3480c1bc742181ded4930842b46e9507372f0b1b963James Dong memset(ptr, value, count); 3490c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3500c1bc742181ded4930842b46e9507372f0b1b963James Dong 351