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