videnc_copy.c

来自「这是达芬奇开发下的一个例程」· C语言 代码 · 共 430 行

C
430
字号
/*  *  Copyright 2008 *  Texas Instruments Incorporated * *  All rights reserved.  Property of Texas Instruments Incorporated *  Restricted rights to use, duplicate or disclose this code are *  granted through contract. *  *//* *  ======== videnc_copy.c ======== *  Video Encoder "copy" algorithm. * *  This file contains an implementation of the deprecated IVIDENC interface *  as defined by xDM 0.9. */#include <xdc/std.h>#include <string.h>#include <ti/xdais/dm/ividenc.h>#include <ti/sdo/ce/trace/gt.h>#include "videnc_copy_ti.h"#include "videnc_copy_ti_priv.h"/* buffer definitions */#define MININBUFS       1#define MINOUTBUFS      1#define MININBUFSIZE    1#define MINOUTBUFSIZE   1extern IALG_Fxns VIDENCCOPY_TI_IALG;#define IALGFXNS  \    &VIDENCCOPY_TI_IALG,        /* module ID */                         \    VIDENCCOPY_TI_activate,     /* activate */                          \    VIDENCCOPY_TI_alloc,        /* alloc */                             \    NULL,                       /* control (NULL => no control ops) */  \    VIDENCCOPY_TI_deactivate,   /* deactivate */                        \    VIDENCCOPY_TI_free,         /* free */                              \    VIDENCCOPY_TI_initObj,      /* init */                              \    NULL,                       /* moved */                             \    NULL                        /* numAlloc (NULL => IALG_MAXMEMRECS) *//* *  ======== VIDENCCOPY_TI_IVIDENC ======== *  This structure defines TI's implementation of the IVIDENC interface *  for the VIDENCCOPY_TI module. */IVIDENC_Fxns VIDENCCOPY_TI_VIDENCCOPY = {    /* module_vendor_interface */    {IALGFXNS},    VIDENCCOPY_TI_process,    VIDENCCOPY_TI_control,};/* *  ======== VIDENCCOPY_TI_IALG ======== *  This structure defines TI's implementation of the IALG interface *  for the VIDENCCOPY_TI module. */#ifdef _TI_/* satisfy xDAIS symbol requirement without any overhead */asm("_VIDENCCOPY_TI_IALG .set _VIDENCCOPY_TI_VIDENCCOPY");#else/* *  We duplicate the structure here to allow this code to be compiled and *  run non-DSP platforms at the expense of unnecessary data space *  consumed by the definition below. */IALG_Fxns VIDENCCOPY_TI_IALG = {      /* module_vendor_interface */    IALGFXNS};#endif/* tracing information */#define GTNAME "ti.sdo.ce.examples.codecs.videnc_copy"static GT_Mask curTrace = {NULL,NULL};#ifdef USE_ACPY3/* Implementation of IDMA3 interface functions & IDMA3_Fxns vtable */#include <ti/bios/include/std.h>#include <ti/xdais/idma3.h>#include <ti/sdo/fc/acpy3/acpy3.h>#define NUM_LOGICAL_CH 1/* *  ======== VIDENCCOPY_TI_dmaChangeChannels ======== *  Update instance object with new logical channel. */Void VIDENCCOPY_TI_dmaChangeChannels(IALG_Handle handle,    IDMA3_ChannelRec dmaTab[]){    VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;    GT_2trace(curTrace, GT_ENTER,        "VIDENCCOPY_TI_dmaChangeChannels(0x%x, 0x%x)\n", handle, dmaTab);    videncObj->dmaHandle1D1D8B = dmaTab[0].handle;}/* *  ======== VIDENCCOPY_TI_dmaGetChannelCnt ======== *  Return max number of logical channels requested. */Uns VIDENCCOPY_TI_dmaGetChannelCnt(Void){    GT_0trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaGetChannelCnt()\n");    return (NUM_LOGICAL_CH);}/* *  ======== VIDENCCOPY_TI_dmaGetChannels ======== *  Declare DMA resource requirement/holdings. */Uns VIDENCCOPY_TI_dmaGetChannels(IALG_Handle handle, IDMA3_ChannelRec dmaTab[]){    VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;    int i;    GT_2trace(curTrace, GT_ENTER,        "VIDENCCOPY_TI_dmaGetChannels(0x%x, 0x%x)\n", handle, dmaTab);    /* Initial values on logical channels */    dmaTab[0].handle = videncObj->dmaHandle1D1D8B;    dmaTab[0].numTransfers = 1;    dmaTab[0].numWaits = 1;    /*     * Request logical DMA channels for use with ACPY3     * AND with environment size obtained from ACPY3 implementation     * AND with low priority.     */    for (i = 0; i < NUM_LOGICAL_CH; i++) {        dmaTab[i].priority = IDMA3_PRIORITY_LOW;        dmaTab[i].persistent = FALSE;        dmaTab[i].protocol = &ACPY3_PROTOCOL;    }    return (NUM_LOGICAL_CH);}/* *  ======== VIDENCCOPY_TI_dmaInit ======== *  Initialize instance object with granted logical channel. */Int VIDENCCOPY_TI_dmaInit(IALG_Handle handle, IDMA3_ChannelRec dmaTab[]){    VIDENCCOPY_TI_Obj *videncObj = (Void *)handle;    GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_dmaInit(0x%x, 0x%x)\n",        handle, dmaTab);    videncObj->dmaHandle1D1D8B = dmaTab[0].handle;    return (IALG_EOK);}/* *  ======== VIDENCCOPY_TI_IDMA3 ======== *  This structure defines TI's implementation of the IDMA3 interface *  for the VIDENCCOPY_TI module. */IDMA3_Fxns VIDENCCOPY_TI_IDMA3 = {      /* module_vendor_interface */    &VIDENCCOPY_TI_IALG,              /* IALG functions */    VIDENCCOPY_TI_dmaChangeChannels,  /* ChangeChannels */    VIDENCCOPY_TI_dmaGetChannelCnt,   /* GetChannelCnt */    VIDENCCOPY_TI_dmaGetChannels,     /* GetChannels */    VIDENCCOPY_TI_dmaInit             /* initialize logical channels */};#endif/* *  ======== VIDENCCOPY_TI_activate ======== */Void VIDENCCOPY_TI_activate(IALG_Handle handle){    GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_activate(0x%x)\n", handle);}/* *  ======== VIDENCCOPY_TI_deactivate ======== */Void VIDENCCOPY_TI_deactivate(IALG_Handle handle){    GT_1trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_deactivate(0x%x)\n", handle);}/* *  ======== VIDENCCOPY_TI_alloc ======== */Int VIDENCCOPY_TI_alloc(const IALG_Params *algParams,    IALG_Fxns **pf, IALG_MemRec memTab[]){    if (curTrace.modName == NULL) {   /* initialize GT (tracing) */        GT_create(&curTrace, GTNAME);    }    GT_3trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_alloc(0x%x, 0x%x, 0x%x)\n",        algParams, pf, memTab);    /* Request memory for my object */    memTab[0].size = sizeof(VIDENCCOPY_TI_Obj);    memTab[0].alignment = 0;    memTab[0].space = IALG_EXTERNAL;    memTab[0].attrs = IALG_PERSIST;    return (1);}/* *  ======== VIDENCCOPY_TI_free ======== */Int VIDENCCOPY_TI_free(IALG_Handle handle, IALG_MemRec memTab[]){    GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_free(0x%lx, 0x%lx)\n",        handle, memTab);    VIDENCCOPY_TI_alloc(NULL, NULL, memTab);    return (1);}/* *  ======== VIDENCCOPY_TI_initObj ======== */Int VIDENCCOPY_TI_initObj(IALG_Handle handle,    const IALG_MemRec memTab[], IALG_Handle p,    const IALG_Params *algParams){    GT_4trace(curTrace, GT_ENTER,        "VIDENCCOPY_TI_initObj(0x%x, 0x%x, 0x%x, 0x%x)\n", handle, memTab,        p, algParams);    return (IALG_EOK);}/* *  ======== VIDENCCOPY_TI_process ======== */XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs,    XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs){    XDAS_Int32 curBuf;    XDAS_UInt32 minSamples;#ifdef USE_ACPY3    const Uint32 maxTransferChunkSize       = 0xffff;    Uint32       thisTransferChunkSize      = 0x0;    Uint32       remainingTransferChunkSize;    Uint32       thisTransferSrcAddr, thisTransferDstAddr;    ACPY3_Params params;    VIDENCCOPY_TI_Obj *videncObj = (VIDENCCOPY_TI_Obj *)h;#endif    GT_5trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_process(0x%x, 0x%x, 0x%x, "        "0x%x, 0x%x)\n", h, inBufs, outBufs, inArgs, outArgs);    /* validate arguments - this codec only supports "base" xDM. */    if ((inArgs->size != sizeof(*inArgs)) ||        (outArgs->size != sizeof(*outArgs))) {        GT_2trace(curTrace, GT_ENTER,            "VIDENCCOPY_TI_process, unsupported size "            "(0x%x, 0x%x)\n", inArgs->size, outArgs->size);        return (IVIDENC_EFAIL);    }#ifdef USE_ACPY3    /*     * Activate Channel  scratch DMA channels.     */    ACPY3_activate(videncObj->dmaHandle1D1D8B);#endif    /* outArgs->bytesGenerated reports the total number of bytes generated */    outArgs->bytesGenerated = 0;    /*     * A couple constraints for this simple "copy" codec:     *    - Video encoding presumes a single input buffer, so only one input     *      buffer will be encoded, regardless of inBufs->numBufs.     *    - Given a different size of an input and output buffers, only     *      encode (i.e., copy) the lesser of the sizes.     */    for (curBuf = 0; (curBuf < inBufs->numBufs) &&        (curBuf < outBufs->numBufs); curBuf++) {        /* there's an available in and out buffer, how many samples? */        minSamples = inBufs->bufSizes[curBuf] < outBufs->bufSizes[curBuf] ?            inBufs->bufSizes[curBuf] : outBufs->bufSizes[curBuf];#ifdef USE_ACPY3        thisTransferSrcAddr        = (Uint32)inBufs->bufs[curBuf];        thisTransferDstAddr        = (Uint32)outBufs->bufs[curBuf];        remainingTransferChunkSize = minSamples;        while (remainingTransferChunkSize > 0) {            if (remainingTransferChunkSize > maxTransferChunkSize) {               thisTransferChunkSize = maxTransferChunkSize;            }            else {               thisTransferChunkSize = remainingTransferChunkSize;            }            /* Configure the logical channel */            params.transferType = ACPY3_1D1D;            params.srcAddr      = (void *)thisTransferSrcAddr;            params.dstAddr      = (void *)thisTransferDstAddr;            params.elementSize  = thisTransferChunkSize;            params.numElements  = 1;            params.waitId       = 0;            params.numFrames    = 1;            remainingTransferChunkSize -= thisTransferChunkSize;            thisTransferSrcAddr += thisTransferChunkSize;            thisTransferDstAddr += thisTransferChunkSize;            /* Configure logical dma channel */            ACPY3_configure(videncObj->dmaHandle1D1D8B, &params, 0);            /* Use DMA to copy data */            ACPY3_start(videncObj->dmaHandle1D1D8B);            /* wait for transfer to finish  */            ACPY3_wait(videncObj->dmaHandle1D1D8B);        }        GT_1trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "               "ACPY3 Processed %d bytes.\n", minSamples);#else        GT_3trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "               "memcpy (0x%x, 0x%x, %d)\n",               outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);        /* process the data: read input, produce output */        memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);#endif        outArgs->bytesGenerated += minSamples;    }    /* Fill out the rest of the outArgs struct */    outArgs->extendedError = 0;    outArgs->encodedFrameType = 0;    /* TODO */    outArgs->inputFrameSkip = IVIDEO_FRAME_ENCODED;    outArgs->reconBufs.numBufs = 0;   /* important: indicate no reconBufs */    return (IVIDENC_EOK);}/* *  ======== VIDENCCOPY_TI_control ======== */XDAS_Int32 VIDENCCOPY_TI_control(IVIDENC_Handle handle, IVIDENC_Cmd id,    IVIDENC_DynamicParams *params, IVIDENC_Status *status){    XDAS_Int32 retVal;    GT_4trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control(0x%x, 0x%x, 0x%x, "        "0x%x)\n", handle, id, params, status);    /* validate arguments - this codec only supports "base" xDM. */    if ((params->size != sizeof(*params)) ||        (status->size != sizeof(*status))) {        GT_2trace(curTrace, GT_ENTER,            "VIDENCCOPY_TI_control, unsupported size "            "(0x%x, 0x%x)\n", params->size, status->size);        return (IVIDENC_EFAIL);    }    switch (id) {        case XDM_GETSTATUS:        case XDM_GETBUFINFO:            status->extendedError = 0;            status->bufInfo.minNumInBufs = MININBUFS;            status->bufInfo.minNumOutBufs = MINOUTBUFS;            status->bufInfo.minInBufSize[0] = MININBUFSIZE;            status->bufInfo.minOutBufSize[0] = MINOUTBUFSIZE;            retVal = IVIDENC_EOK;            break;        case XDM_SETPARAMS:        case XDM_SETDEFAULT:        case XDM_RESET:        case XDM_FLUSH:            /* TODO - for now just return success. */            retVal = IVIDENC_EOK;            break;        default:            /* unsupported cmd */            retVal = IVIDENC_EFAIL;            break;    }    return (retVal);}/* *  @(#) ti.sdo.ce.examples.codecs.videnc_copy; 1,0,0,105; 1-14-2008 09:54:15; /db/atree/library/trees/ce-g30x/src/ */

⌨️ 快捷键说明

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