DSP

H.264与你同行

2019-07-13 20:52发布

在编译videnc_copy的codec例子的时候,EVM包里默认的是既用C64P,也用MVArm9编译,最后生成两个库,一个 是.a64P,一个是.a470MV库。按照例子,在封装成server,最后在应用程序编译,都没有问题。
由于算法最终是在DSP上运行的,所以一开始的算法编译我便取消了MVArm9,选择只用C64P编译。最后codec编译成功, 只有一个.a64P库文件,后面继续封装成.x64P。但是在应用程序编译的时候,却出现了错误,主要提示信息如下:
cd ./ceapp_package; /home/zj/dvevm_1_20/xdc_2_94/xdc XDCPATH="/home/zj/dvevm_1_20/codec_engine_1_10_01/ examples;  /home/zj/dvevm_1_20/codec_engine_1_10_01/packages;   /home/zj/dvevm_1_20/xdais_5_10/packages; /home/zj/dvevm_1_20/dsplink_1_30_08_02/packages;   /home/zj/dvevm_1_20/cmem_1_02/packages/; /home/zj/dvevm_1_20/framework_components_1_10_04/packages;    /home/zj/dvevm_1_20/bios_5_31_01/packages" package/cfg/pkg_x470MV.c
configuring pkg.x470MV from package/cfg/pkg_x470MV.cfg ...
codecs.videnc_copy.close() ...
ti.sdo.ce.osal.close() ...
ti.sdo.ce.utils.trace.close() ...
ti.sdo.ce.bioslog.init() ...
ti.sdo.ce.bioslog.close() ...
ti.sdo.ce.bioslog.validate() ...
WARNING: Can't call useModule() now: ti.sdo.ce.Engine
ti.sdo.ce.osal.validate() ...
    will link with ti.sdo.ce.bioslogb/bioslog.a470MV
    will link with codecs.videnc_copyb/videnc_copy.a470MV
js: "/home/zj/dvevm_1_20/xdc_2_94/packages/xdc/cfg/Main.xs", line 27: XDC runtime error: can't find the library 'lib/videnc_c opy.a470MV' specified by package codecs.videnc_copy. It wasn't found along the  path '/home/zj/dvevm_1_20/codec_engine_1_10_01/examples;/home/zj/dvevm_1_20/codec_engine_1_10_01/packages; /home/zj/dvevm_1_20/xdais_5_10/packages;/home/zj/dvevm_1_20/dsplink_1_30_08_02/packages; /home/zj/dvevm_1_20/cmem_1_02/packages/;/home/zj/dvevm_1_20/framework_components_1_10_04/packages; /home/zj/dvevm_1_20/bios_5_31_01/packages;/home/zj/dvevm_1_20/xdc_2_94/packages; /home/zj/dvevm_1_20/codec_engine_1_10_01/examples/apps/video_copy/dualcpu/ceapp_package/./..;'.
    "/home/zj/dvevm_1_20/xdc_2_94/packages/xdc/cfg/Main.xs", line 172
    "/home/zj/dvevm_1_20/xdc_2_94/packages/xdc/xs.js", line 137
gmake: *** [package/cfg/pkg_x470MV.c] Error 1
gmake: *** Deleting file `package/cfg/pkg_x470MV.c'
gmake: *** [package/cfg/pkg_x470MV.c] Deleting file `package/cfg/pkg_x470MV.xdl'
gmake: *** [package/cfg/pkg_x470MV.c] Deleting file `package/cfg/pkg_x470MV.h'
gmake: *** [ceapp_package/package/cfg/pkg_x470MV.c] 错误 2
我看了看错误信息,都是和a470MV有关的,特别是这一句“XDC runtime error: can't find the library 'lib/videnc_copy.a470MV'”。 我觉得很奇怪,我根本就不需要生成ARM端执行的算法.a470MV,为什么编译的时候会有关于.a470MV有关的错误呢?
只要编译算法的时候用了MVArm9,就会生成.a470MV,只要生成了这个,最后应用程序编译就不会有问题。 但是只要只用C64P来编译,最后应用程序编译就会出现问题。
不知道是哪里设置出了问题,我检查了一些设置都是没有问题的。还希望各位版主和朋友们指点一下。我都弄了好几天了,非常急人。
谢谢!   回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
似乎是工具链本身的问题。我们也碰到过类似的问题,没有必要深究其中的原因。
你编译的时候就加上MVArm9这个目标平台吧,我们试过,对DSP上的算法没有什么影响。     回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点。谢谢。
EVM包里的例子确实没有什么影响,可是我移植的算法,用C64P目标平台就完全没有问题。可是一用上MVArm9平台,就 会出现错误,而且错误非常奇怪,下面是其中一个错误:
ratecontrol.c:62: error: parse error before "sizeof"
这个文件是X264中的文件,我压根就没动过,不知道为什么会出问题。
而且,如果算法里用到了汇编,这些是针对C64平台的,难道用MVArm9的编译也没有问题吗? 
 
回复: 算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
很显然,如果是汇编的话,MVArm9 的编译器肯定是不行的。
这时候你就一定要关掉MVArm9的编译器。
这时候,应该会报你第一次说的错误,
可以这样:
生成.a64P之后,拷贝一个.470MV文件到x64P所在的目录,文件名和a64P文件相同。
这样你再封装server的时候,就不会提示说:XDC runtime error: can't find the library 'lib/videnc_copy.a470MV'”。
这样就能够编译通过了。
你可以试一试这个方法。 
  回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
谢谢kale兄的解答和帮助,谢谢!
"生成.a64P之后,拷贝一个.470MV文件到x64P所在的目录"。这个.470MV文件的来源是哪里呢?我就是因为生成不了.470MV文件,所以影响后面app的编译。而今您提供的方法确实要提供这么一个.470MV文件。
我现在只能关闭MVArm9平台,成功生成.a64P文件。一打开MVArm9就会报奇怪的错误。难道这个.470MV文件可以随便找一个文件,改成算法需要的文件名就行了吗。
谢谢您!
回复 5F davinci? 的帖子 是的,从别的地方找一个.470MV文件,改一下名字就OK.了。。   回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
谢谢kale兄。
按照您的方法,弄了个别的.a470MV,果然app可以编译通过了。 
不过,在下到板子上运行的时候,程序就死掉了。不知道是由于我算法本身有问题,还是使用了这个方法所导致的。搞不清楚。
谢谢您! 
 
算法的问题。。。 
不信你用这个方法测试一个简单的copy算法。。。 
  回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
应该是算法本身的问题,不过我检查测试了几下,程序一运行的时候还是有问题。create和contrl函数都可以调用,只是应用程序在调用process函数的时候就死掉了。应该是算法编写时的错误。可是我只是简单的弄了下,基本上就是把编码一帧的函数放在process,把之前的初始化部分放到initObj函数中,应该没什么问题呀。如果您有空的话,可以帮忙指点一下吗?这里传不了附件,我就直接帖吧,只是一个主程序文件
#include
#include
#include
#include "videnc_copy_ti.h"
#include "videnc_copy_ti_priv.h"
/*c以下添加自X264.c文件中*/
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#include
#include
#include
//#include
#define _GNU_SOURCE
//#include "extras/getopt.h"
#include "getopt.h"
#ifdef _MSC_VER
#include     /* _setmode() */
#include   /* _O_BINARY */
#endif
#ifndef _MSC_VER
//#include "common/config.h"
#include "config.h"
#endif
//#include "common/common.h"
#include "common.h"
#include "x264.h"
#include "muxers.h"
#define DATA_MAX 500000
//static void InitSystemServices(void);
uint8_t data[DATA_MAX];
/* Ctrl-C handler */
static int    b_ctrl_c = 0;
static int    b_exit_on_ctrl_c = 0;
typedef struct {
    int           b_progress;
    int           i_seek;
    hnd_t      hin;
    hnd_t      hout;
    FILE      *qpfile;
} cli_opt_t;
typedef struct {
    FILE *fh;
    int width, height;
    int next_frame;
} yuv_input_t_t;
    
/* input file operation function pointers */
int (*p_open_infile)( char *psz_filename, hnd_t *p_handle, x264_param_t *p_param );
int (*p_get_frame_total)( hnd_t handle );
int (*p_read_frame)( x264_picture_t *p_pic, hnd_t handle, int i_frame );
int (*p_close_infile)( hnd_t handle );
/* output file operation function pointers */
static int (*p_open_outfile)( char *psz_filename, hnd_t *p_handle );
static int (*p_set_outfile_param)( hnd_t handle, x264_param_t *p_param );
static int (*p_write_nalu)( hnd_t handle, uint8_t *p_nal, int i_size );
static int (*p_set_eop)( hnd_t handle, x264_picture_t *p_picture );
static int (*p_close_outfile)( hnd_t handle );
static int  Parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt );
static int  Encode( x264_param_t *param, cli_opt_t *opt );
/*以上添加自x264.c中*/
/* buffer definitions */
#define MININBUFS           1
#define MINOUTBUFS       1
#define MININBUFSIZE      1
#define MINOUTBUFSIZE  1
extern     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,
};
/*
*  ======== VIDENC_TI_IALG ========
*  This structure defines TI's implementation of the IALG interface
*  for the VIDENCCOPY_TI module.
*/
/*
*  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
};
typedef  struct  VIDENCCOPY_TI_Params {
    IVIDENC_Params IVIDENC_params;            /* MUST be first field of all XDAS algs */
    x264_param_t param;
} VIDENCCOPY_TI_Params;
/* typedef struct VIDENCCOPY_TI_Obj {
    IALG_Obj    alg;            
    cli_opt_t  opt;
    x264_t         *h;
    x264_picture_t pic;
   } VIDENCCOPY_TI_Obj;
*/
typedef struct VIDENCCOPY_TI_Obj
{
    IVIDENC_Obj     alg;
    cli_opt_t            opt;
    x264_t               *h;
    x264_picture_t  pic;
} VIDENCCOPY_TI_Obj;
/*****************************************************************************
* Parse:
*****************************************************************************/
static int  Parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt )
{
    char *psz_filename = NULL;
    x264_param_t defaults = *param;
    char *psz;
    int b_avis = 0;
    int b_y4m = 0;
    int b_thread_input = 0;
    memset( opt, 0, sizeof(cli_opt_t) );
    /* Default input file driver */
    p_open_infile = open_file_yuv;
    p_get_frame_total = get_frame_total_yuv;
    p_read_frame = read_frame_yuv;
    p_close_infile = close_file_yuv;
    /* Default output file driver */
    p_open_outfile = open_file_bsf;
    p_set_outfile_param = set_param_bsf;
    p_write_nalu = write_nalu_bsf;
    p_set_eop = set_eop_bsf;
    p_close_outfile = close_file_bsf;
    /* Parse command line options */
    for( ;; )
    {
        int b_error = 0;
        int long_options_index = -1;
#define OPT_FRAMES 256
#define OPT_SEEK 257
#define OPT_QPFILE 258
#define OPT_THREAD_INPUT 259
#define OPT_QUIET 260
#define OPT_PROGRESS 261
#define OPT_VISUALIZE 262
#define OPT_LONGHELP 263
        static struct option long_options[] =
        {
            { "help",    no_argument,      NULL, 'h' },
            { "longhelp",no_argument,      NULL, OPT_LONGHELP },
            { "version", no_argument,      NULL, 'V' },
            { "bitrate", required_argument, NULL, 'B' },
            { "bframes", required_argument, NULL, 'b' },
            { "no-b-adapt", no_argument,    NULL, 0 },
            { "b-bias",  required_argument, NULL, 0 },
            { "b-pyramid", no_argument,    NULL, 0 },
            { "min-keyint",required_argument,NULL,'i' },
            { "keyint",  required_argument, NULL, 'I' },
            { "scenecut",required_argument, NULL, 0 },
            { "nf",      no_argument,      NULL, 0 },
            { "filter",  required_argument, NULL, 'f' },
            { "no-cabac",no_argument,      NULL, 0 },
            { "qp",      required_argument, NULL, 'q' },
            { "qpmin",  required_argument, NULL, 0 },
            { "qpmax",  required_argument, NULL, 0 },
            { "qpstep",  required_argument, NULL, 0 },
            { "crf",    required_argument, NULL, 0 },
            { "ref",    required_argument, NULL, 'r' },
            { "no-asm",  no_argument,      NULL, 0 },
            { "sar",    required_argument, NULL, 0 },
            { "fps",    required_argument, NULL, 0 },
            { "frames",  required_argument, NULL, OPT_FRAMES },
            { "seek",    required_argument, NULL, OPT_SEEK },
            { "output",  required_argument, NULL, 'o' },
            { "analyse", required_argument, NULL, 'A' },
            { "direct",  required_argument, NULL, 0 },
            { "weightb", no_argument,      NULL, 'w' },
            { "me",      required_argument, NULL, 0 },
            { "merange", required_argument, NULL, 0 },
            { "subme",  required_argument, NULL, 'm' },
            { "b-rdo",  no_argument,      NULL, 0 },
            { "mixed-refs", no_argument,    NULL, 0 },
            { "no-chroma-me", no_argument,  NULL, 0 },
            { "bime",    no_argument,      NULL, 0 },
            { "8x8dct",  no_argument,      NULL, '8' },
            { "trellis", required_argument, NULL, 't' },
            { "no-fast-pskip", no_argument, NULL, 0 },
            { "no-dct-decimate", no_argument, NULL, 0 },
            { "level",  required_argument, NULL, 0 },
            { "ratetol", required_argument, NULL, 0 },
            { "vbv-maxrate", required_argument, NULL, 0 },
            { "vbv-bufsize", required_argument, NULL, 0 },
            { "vbv-init", required_argument,NULL,  0 },
            { "ipratio", required_argument, NULL, 0 },
            { "pbratio", required_argument, NULL, 0 },
            { "chroma-qp-offset", required_argument, NULL, 0 },
            { "pass",    required_argument, NULL, 'p' },
            { "stats",  required_argument, NULL, 0 },
            { "rceq",    required_argument, NULL, 0 },
            { "qcomp",  required_argument, NULL, 0 },
            { "qblur",  required_argument, NULL, 0 },
            { "cplxblur",required_argument, NULL, 0 },
            { "zones",  required_argument, NULL, 0 },
            { "qpfile",  required_argument, NULL, OPT_QPFILE },
            { "threads", required_argument, NULL, 0 },
            { "thread-input", no_argument,  NULL, OPT_THREAD_INPUT },
            { "no-psnr", no_argument,      NULL, 0 },
            { "quiet",  no_argument,      NULL, OPT_QUIET },
            { "verbose", no_argument,      NULL, 'v' },
            { "progress",no_argument,      NULL, OPT_PROGRESS },
            { "visualize",no_argument,      NULL, OPT_VISUALIZE },
            { "sps-id",  required_argument, NULL, 0 },
            { "aud",    no_argument,      NULL, 0 },
            { "nr",      required_argument, NULL, 0 },
            { "cqm",    required_argument, NULL, 0 },
            { "cqmfile", required_argument, NULL, 0 },
            { "cqm4",    required_argument, NULL, 0 },
            { "cqm4i",  required_argument, NULL, 0 },
            { "cqm4iy",  required_argument, NULL, 0 },
            { "cqm4ic",  required_argument, NULL, 0 },
            { "cqm4p",  required_argument, NULL, 0 },
            { "cqm4py",  required_argument, NULL, 0 },
            { "cqm4pc",  required_argument, NULL, 0 },
            { "cqm8",    required_argument, NULL, 0 },
            { "cqm8i",  required_argument, NULL, 0 },
            { "cqm8p",  required_argument, NULL, 0 },
            { "overscan", required_argument, NULL, 0 },
            { "videoformat", required_argument, NULL, 0 },
            { "fullrange", required_argument, NULL, 0 },
            { "colorprim", required_argument, NULL, 0 },
            { "transfer", required_argument, NULL, 0 },
            { "colormatrix", required_argument, NULL, 0 },
            { "chromaloc", required_argument, NULL, 0 },
            {0, 0, 0, 0}
        };
        int c = getopt_long( argc, argv, "8A:B:b:hI:i:m:p:q:r:t:Vvw", long_options, &long_options_index);
        if( c == -1 )
        {
            break;
        }
        switch( c )
        {
            case 'V':
#ifdef X264_POINTVER
                printf( "x264 "X264_POINTVER" " );
#else
                printf( "x264 0.%d.X ", X264_BUILD );
#endif
                exit(0);
            case OPT_FRAMES:
                param->i_frame_total = atoi( optarg );
                break;
            case OPT_SEEK:
                opt->i_seek = atoi( optarg );
                break;
            case 'o':
                break;
            case OPT_QPFILE:
                opt->qpfile = fopen( optarg, "r" );
                if( !opt->qpfile )
                {
                    printf("x264 [error]: can't open `%s' ", optarg );
                    return -1;
                }
                param->i_scenecut_threshold = -1;
                param->b_bframe_adaptive = 0;
                break;
            case OPT_THREAD_INPUT:
                b_thread_input = 1;
                break;
            case OPT_QUIET:
                param->i_log_level = X264_LOG_NONE;
                param->analyse.b_psnr = 0;
                break;
            case 'v':
                param->i_log_level = X264_LOG_DEBUG;
                break;
            case OPT_PROGRESS:
                opt->b_progress = 1;
                break;
            case OPT_VISUALIZE:
#ifdef VISUALIZE
                param->b_visualize = 1;
                b_exit_on_ctrl_c = 1;
#else
                printf("x264 [warning]: not compiled with visualization support " );
#endif
                break;
            default:
            {
                int i;
                if( long_options_index < 0 )
                {
                    for( i = 0; long_options.name; i++ )
                        if( long_options.val == c )
                        {
                            long_options_index = i;
                            break;
                        }
                    if( long_options_index < 0 )
                    {
                        // getopt_long already printed an error message 
                        return -1;
                    }
                }
                b_error |= x264_param_parse( param, long_options[long_options_index].name, optarg ? optarg : "true" );
            }
        }
        if( b_error )
        {
            const char *name = long_options_index > 0 ? long_options[long_options_index].name : argv[optind-2];
            printf("x264 [error]: invalid argument: %s = %s ", name, optarg );
            return -1;
        }
    }
    /* Get the file name */
    /* open the input */
    return 0;
}
static char const *strtable_lookup( const char * const table[], int index )
{
    int i = 0; while( table ) i++;
    return ( ( index >= 0 && index < i ) ? table[ index ] : "???" );
}
/*
*  ======== VIDENCCOPY_TI_activate ========
*/
Void VIDENCCOPY_TI_activate(IALG_Handle handle)
{
}
/*
*  ======== VIDENCCOPY_TI_deactivate ========
*/
Void VIDENCCOPY_TI_deactivate(IALG_Handle handle)
{
}
/*
*  ======== VIDENCCOPY_TI_alloc ========
*/
Int VIDENCCOPY_TI_alloc(const IALG_Params   *algParams,   IALG_Fxns   **pf,   IALG_MemRec  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;
    memTab[1].size = 38016;
    memTab[1].alignment = 0;
    memTab[1].space = IALG_EXTERNAL;
    memTab[1].attrs = IALG_PERSIST;
    return (2);
}
/*
*  ======== VIDENCCOPY_TI_free ========
*/
Int VIDENCCOPY_TI_free(IALG_Handle handle, IALG_MemRec memTab[])
{
    VIDENCCOPY_TI_Obj   *inst = (VIDENCCOPY_TI_Obj *)handle;
    x264_encoder_close( inst->h );
    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)
{
    VIDENCCOPY_TI_Obj *inst = (VIDENCCOPY_TI_Obj *)handle;
    VIDENCCOPY_TI_Params *params = (VIDENCCOPY_TI_Params *)algParams;
    char *argv[2];
    int argc = 2;
  
    argv[0] = "x264";
    argv[1] = "--no-cabac";
    x264_param_default( &(params->param));
    Parse( argc, argv, &(params->param), &(inst->opt) );
    inst->h = x264_encoder_open( &(params->param) );
    params->param.i_width = 176;
    params->param.i_height = 144;
    
    inst->pic.i_type = X264_TYPE_AUTO;
    inst->pic.i_qpplus1 = 0;
    inst->pic.img.i_csp = X264_CSP_I420;
    inst->pic.img.i_plane = 3;
    inst->pic.img.i_stride[0] = 176;
    inst->pic.img.i_stride[1] = 88;
    inst->pic.img.i_stride[2] = 88;
    //inst->pic.img.plane[0] = inBufs->bufs[0];
    inst->pic.img.plane[0] = memTab[1].base;
    inst->pic.img.plane[1] = inst->pic.img.plane[0] + 176 * 144;
    inst->pic.img.plane[2] = inst->pic.img.plane[1] + 176 * 144 / 4;
//    x264_picture_alloc( &pic, X264_CSP_I420, xparam.i_width, xparam.i_height );
    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)
{
    x264_picture_t pic_out;    
    x264_nal_t *nal;    
    int i_nal, i;
    int i_file = 0;
    int i_sizeR = 0;
    int i_size;
    XDAS_Int32 curBuf;
    VIDENCCOPY_TI_Obj *inst = (VIDENCCOPY_TI_Obj *)h;
    memcpy(inst->pic.img.plane[0], inBufs->bufs[0], 38016);
    if ((inArgs->size != sizeof(*inArgs)) ||
        (outArgs->size != sizeof(*outArgs))) {
        return (IVIDENC_EFAIL);
    }
    outArgs->bytesGenerated = 0;
        
    memset(&pic_out, 0, sizeof(x264_picture_t));
    memset(nal, 0, sizeof(x264_nal_t));
    if( x264_encoder_encode( inst->h, &nal, &i_nal, &(inst->pic), &pic_out ) < 0 )
    {
        printf("x264 [error]: x264_encoder_encode failed " );
    }
    for( i = 0; i < i_nal; i++ )
    {
        int i_data;
        i_data = DATA_MAX;
        if( ( i_size = x264_nal_encode( data, &i_data, 1, &nal ) ) > 0 )
        {
            //i_file += p_write_nalu( inst->opt.hout, data, i_size );
            memcpy(outBufs->bufs[0] + i_sizeR, data, i_size);
            i_sizeR = i_sizeR + i_size;
        }
/*
        if( ( i_size = x264_nal_encode( outBufs->bufs[0] + i_sizeR, &i_data, 1, &nal ) ) > 0 )
        {
            outArgs->bytesGenerated = outArgs->bytesGenerated + i_size;
            i_sizeR = i_sizeR + i_size;    
        }
*/
        else if( i_size < 0 )
        {
            printf("x264 [error]: need to increase buffer size (size=%d) ", -i_size );
        }
    }
    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;
    /* validate arguments - this codec only supports "base" xDM. */
    if ((params->size != sizeof(*params)) ||
        (status->size != sizeof(*status))) {
        return (IVIDENC_EFAIL);
    }
    switch (id) {
        case XDM_GETSTATUS:
            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;
        default:
            /* unsupported cmd */
            retVal = IVIDENC_EFAIL;
            break;
    }
    return;
  http://www.avsolutiontech.com/bbs/showtopic.aspx?page=end&topicid=27#115   回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
      我遇到了跟搂主一样的问题。目前我正在做毕业设计,在达芬奇上实现一个人脸检测系统。我的整个设计过程是先移植在PC上实现的人脸检测算法,在移植阶段我直接把DVEVM当单核DSP跑代码,用起来就跟EVM642完全一样的。然后我对移植好的算法进行优化,用了pragma,intrinsics和线性汇编等等,优化过程中不停做算法的功能验证,直到算法优化完毕且运行结果完全正确以后我才把算法进行打包准备开始在DaVinci上进行整个系统的开发。我写好ARM端的应用之后,直接使用CE框架写个main.c,配一下DSP Server,并按照XDM标准对算法进行进一步的封装,最后build整个项目产生.a64P,x64P和x470MV,运行程序,ARM程序一跑到VIDENC_process()函数中就无故死机了,只能复位。然后就开始了这个令人讨厌的问题的求解,已经困扰我一个星期了,至今无解,试了好多方法,都不行。
我先把我那个DSP算法包中的核心算法进行替换,换成一个简单的dummy函数,该函数中什么都不干,直接返回固定的结果,程序能正常运行,但是一换成真正的核心算法就马上挂掉了。
      由于我的核心算法是在CCS3.3下用CGT6.0.8编译的,而XDM算法外壳则是在Linux下用CGT6.0.3编译,所以我怀疑是因为工具链不匹配而产生问题,顺着这个思路我把整个算法的源文件放在一起在Linux下用CGT6.0.3进行编译,编译通过,但是在生成.a470MV包时出了一堆warning,并提示这些地方被编译器忽略,这是可以理解的,因为ARM编译器怎么可能懂DSP的指令呢,所以ARM编译器就当那些代码是出来打酱油的,直接忽略。经过上述处理,运行ARM端应用仍旧照挂不误,仍旧在VIDENC_process()处。
上面大家都觉得.a470MV文件没有意义,不过我到不那么认为。 ARM为了要调用程序需要知道DSP端函数的调用接口,所以它必须知道DSP端的函数是怎么定义的,所以.a470MV文件也就成为必须品了,不过我觉得那些使用线性汇编以及DSP特性写的文件即使被ARM编译器忽略也问题不大,因为这些程序在DSP上运行,不需要ARM传参数,所以ARM即使对这些函数产生错误理解也问题不大,这也就是为什么楼上有朋友说随便找一个.a470MV文件都行的原因了,其实不完全如此,为什么我想大家在看到我上述的分析以后应该不难想出来了。 回复:算法如果只用C64P编译,则最后应用程序编译不成功。请教指点
ARM是通过CE的框架调用DSP的函数的,接口和参数也是派生出来的,所以最后一段是否有待商榷?