⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app.c

📁 这是达芬奇开发下的一个例程
💻 C
字号:
/* *  Copyright 2008 by Texas Instruments Incorporated. * *  All rights reserved. Property of Texas Instruments Incorporated. *  Restricted rights to use, duplicate or disclose this code are *  granted through contract. * *//* *  ======== app.c ======== * *  Non-Codec-Engine-using part of the Arm-side Linux application, that at *  certain points talks to the Codec-Engine-using part of the Arm-side *  Linux application. The latter module is in file ceapp.c. * *  The call flow is: app.c functions -> ceapp.c functions -> CodecEngine libs */#include <stdio.h>#include <stdlib.h>/*  Definition of buffer sizes for input data, encoded data, output data. * *  Our application reads a raw video file one block at the time at the *  input buffer. It calls ceapp to encodes that from the input buffer into the *  "encoded data" buffer. Then it calls ceapp to decode the video data from *  "encoded data" buffer into the output buffer. Finally it writes the *  output block to another file. This flow is illustrated here: * *  <input file block> ==(app)==>           [inBuf]      ==> *                     ==(ceapp/encoder)==> [encodedBuf] ==> *                     ==(ceapp/decoder)==> [outBuf]     ==> *                     ==(app)==>           <output file block> * *  For simplicity, below we define all blocks to be 1K, but those sizes *  could be arbitrary (though they must match). * *  Note: It is EXTREMELY important that the buffers that hold the data are not *  simply malloc()ed, but are actually physically contiguous. This is so *  because the buffers are passed on to the codecs running on the DSP *  verbatim (there is no buffer copying involved). CodecEngine *  (and the ceapp module) provides and API for allocating such buffers. */#define INFRAMESIZE       (1024 * sizeof(char))  /* raw frame (input) */#define ENCODEDFRAMESIZE  (1024 * sizeof(char))  /* encoded frame */#define OUTFRAMESIZE      (1024 * sizeof(char))  /* decoded frame (output) *//* prototypes of functions defined in ceapp.c: */extern int   ceapp_init();            /* initialize the ceapp module */extern char *ceapp_allocContigBuf(    /* allocate physically contiguous */                int   bufSize,        /*   buffer of given size; description */                char *bufDescription  /*   is used only for print */                );extern int   ceapp_validateBufSizes(  /* confirm that the enc/dec codecs */                int inBufSize,        /*   support these buffer sizes */                int encodedBufSize,   /*   for the raw input video, encoded */                int outBufSize        /*   video data, and decoded output */                );extern int   ceapp_encodeBuf(         /* encode raw video data in inBuf */                char *inBuf,          /*   and store result in encodedBuf */                int   inBufSize,                char *encodedBuf,                int   encodedBufSize                );extern int   ceapp_decodeBuf(        /* decode data from encodedBuf and */                char *encodedBuf,    /*   store resulting raw data in outBuf */                int   encodedBufSize,                char *outBuf,                int   outBufSize                );extern void  ceapp_freeContigBuf(    /* free the contiguous buffer */                char *buf,                int   bufSize                );extern void  ceapp_exit();           /* exit the ceapp module *//* *  ======== encodeDecodeFile ======== *  This function reads blocks of the input file one at the time, encodes *  each block, decodes it, and writes the result to the output file. */static int encodeDecodeFile(char *inFileName, char *outFileName){    /* pointers to contiguous shared data buffers (shared b/w Arm and DSP) */    static char *inBuf      = NULL; /* to contig-alloc for INFRAMESIZE */    static char *encodedBuf = NULL; /* to contig-alloc for ENCODEDFRAMESIZE */    static char *outBuf     = NULL; /* to contig-alloc for OUTFRAMESIZE */    FILE *inFile = NULL, *outFile = NULL;    int  status, n;    /* open file streams for input and output */    if ((inFile = fopen(inFileName, "rb")) == NULL) {        printf("App-> ERROR: can't read file %s\n", inFileName);        exit(1);    }    if ((outFile = fopen(outFileName, "wb")) == NULL) {        printf("App-> ERROR: can't write to file %s\n", outFileName);        exit(1);    }    /* initialize the ceapp which in turns initializes Codec Engine */    status = ceapp_init();    if (status != 0) {        goto end;    }    /*  Allocate the tree contiguous buffers.     *  If we were reading input from the camera device instead of the file,     *  we would mmap() the camera memory to inBuf and use it as such without     *  allocating it. (Driver buffers are contiguous.) Same is true for     *  display device's memory ("framebuffer") being mapped to outBuf.     *  The encodedBuf, however, we would have to contig-allocate in either     *  case, since that buffer holds the data the encoder writes to and     *  decoder reads from.     *  The text description we pass alongside are used only in a printf.     */    inBuf      = ceapp_allocContigBuf(INFRAMESIZE,      "input data");    encodedBuf = ceapp_allocContigBuf(ENCODEDFRAMESIZE, "encoded data");    outBuf     = ceapp_allocContigBuf(OUTFRAMESIZE,     "output data");    if (inBuf == NULL || encodedBuf == NULL || outBuf == NULL) {        printf("App-> Error allocating buffers (%p, %p, %p)!\n",            inBuf, encodedBuf, outBuf);        status = -1;        goto end;    }    /*     *  Optional call: validate that the codecs we'll use really support the     *  sizes we specify here. There's no reason why they shouldn't, in this     *  particular case.     */    status = ceapp_validateBufSizes(INFRAMESIZE, ENCODEDFRAMESIZE,                                     OUTFRAMESIZE);    if (status != 0) {        goto end;    }    /*     * Read complete frames from the speech dev, and write     * encoded data to an output file file     */    for (n = 0 ;; n++) {        printf("App-> Processing frame %d...\n", n);        if (fread(inBuf, INFRAMESIZE, 1, inFile) == 0) { /* until EOF */            break;        }        status = ceapp_encodeBuf(inBuf,       INFRAMESIZE,                                  encodedBuf, ENCODEDFRAMESIZE);        if(status != 0) {            printf("App-> ERROR: Encoding frame %d FAILED\n", n);            goto end;        }        status = ceapp_decodeBuf(encodedBuf,  ENCODEDFRAMESIZE,                                  outBuf,     OUTFRAMESIZE);        if (status != 0) {            printf("App-> ERROR: Decoding frame %d FAILED\n", n);            goto end;        }        /* write to file */        fwrite(outBuf, OUTFRAMESIZE, 1, outFile);    }    printf("App-> Finished encoding and decoding %d frames\n", n);    status = 0;  /* success */end:    /* close the files */    fclose(inFile);    fclose(outFile);    /* free the contiguous buffers */    if (inBuf != NULL) {        ceapp_freeContigBuf(inBuf, INFRAMESIZE);    }    if (encodedBuf != NULL) {        ceapp_freeContigBuf(encodedBuf, ENCODEDFRAMESIZE);    }    if (outBuf != NULL) {        ceapp_freeContigBuf(outBuf, OUTFRAMESIZE);    }    /* quit the CE application */    ceapp_exit();    /* and return success (0) or failure (non-0) */    return status;}/* *  ======== main ======== */int main(int argc, char *argv[]){    char *inFileName, *outFileName;    if (argc <= 1) {        inFileName  = "in.dat";        outFileName = "out.dat";    }    else if (argc != 3 && argc != 4) {        printf("Usage: %s input-file output-file\n", argv[0]);        exit(1);    }    else {        inFileName = argv[1];        outFileName = argv[2];    }    printf("App-> Application started.\n");    if (encodeDecodeFile(inFileName, outFileName) == 0) {        printf("App-> Application finished successfully.\n");    }    else {        printf("App-> Application FAILED.\n");    }    return 0;}/* *  @(#) ti.sdo.ce.examples.apps.video_copy.dualcpu.evmDM6446; 1, 0, 0,55; 1-14-2008 09:51:44; /db/atree/library/trees/ce-g30x/src/ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -