/* * Copyright (C) 2012 Texas Instruments * Author: Ramprasad(x0038811@ti.com) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include "util.h" #define MAX_IO_BUFS 16 /* omap drm device handle */ struct omap_device *dev = NULL; extern void *dsp_dce_alloc(int sz); extern void dsp_dce_free(void *ptr); struct decoder { Engine_Handle engine; VIDDEC2_Handle codec; VIDDEC2_Params *params; VIDDEC2_DynamicParams *dynParams; VIDDEC2_Status *status; XDM1_BufDesc *inBufs; XDM_BufDesc *outBufs; VIDDEC2_InArgs *inArgs; VIDDEC2_OutArgs *outArgs; char *input; char *output; struct omap_bo *input_bo; struct omap_bo *output_bo; int input_sz, output_sz; XDAS_Int8 **outBuffer; XDAS_Int32 *outBufSizes; }; static void decoder_close(struct decoder *decoder) { if(!decoder) goto bailout; if (decoder->params) dsp_dce_free(decoder->params); if (decoder->dynParams) dsp_dce_free(decoder->dynParams); if (decoder->status) dsp_dce_free(decoder->status); if (decoder->inBufs) { dsp_dce_buf_unlock(1, &(decoder->inBufs->descs[0].buf)); close(decoder->inBufs->descs[0].buf); dsp_dce_free(decoder->inBufs); } if (decoder->outBufs) dsp_dce_free(decoder->outBufs); if (decoder->inArgs) dsp_dce_free(decoder->inArgs); if (decoder->outArgs) dsp_dce_free(decoder->outArgs); if (decoder->input_bo) omap_bo_del(decoder->input_bo); if (decoder->output_bo) omap_bo_del(decoder->output_bo); if (decoder->outBuffer) { close(decoder->outBuffer[0]); dsp_dce_free(decoder->outBuffer); } if (decoder->outBufSizes) dsp_dce_free(decoder->outBufSizes); if (decoder->codec) VIDDEC2_delete(decoder->codec); if (decoder->engine) Engine_close(decoder->engine); free(decoder); bailout: if (dev) dce_deinit(dev); } static struct decoder * decoder_open(int pattern) { struct decoder *decoder; int i; int width = 176, height = 144; Engine_Error ec; XDAS_Int32 err; decoder = calloc(1, sizeof(*decoder)); if (!decoder) return NULL; MSG("%p: Opening Engine..", decoder); dev = dce_init(); if(dev == NULL) { ERROR("%p: dce init failed", dev); goto fail; } decoder->engine = Engine_open("dsp_vidsvr", NULL, &ec); if (!decoder->engine) { ERROR("%p: could not open engine", decoder); goto fail; } decoder->input_sz = width * height; decoder->input_bo = omap_bo_new(dev, decoder->input_sz, OMAP_BO_WC); decoder->input = omap_bo_map(decoder->input_bo); decoder->output_sz = width * height; decoder->output_bo = omap_bo_new(dev, decoder->output_sz, OMAP_BO_WC); decoder->output = omap_bo_map(decoder->output_bo); decoder->params = dsp_dce_alloc(sizeof(IVIDDEC2_Params)); decoder->params->size = sizeof(IVIDDEC2_Params); decoder->codec = VIDDEC2_create(decoder->engine, "dsp_universalCopy", decoder->params); if (!decoder->codec) { ERROR("%p: could not create codec", decoder); goto fail; } MSG("Created dsp_universalCopy \n"); decoder->dynParams = dsp_dce_alloc(sizeof(IVIDDEC2_DynamicParams)); decoder->dynParams->size = sizeof(IVIDDEC2_DynamicParams); decoder->status = dsp_dce_alloc(sizeof(IVIDDEC2_Status)); decoder->status->size = sizeof(IVIDDEC2_Status); err = VIDDEC2_control(decoder->codec, XDM_SETPARAMS, decoder->dynParams, decoder->status); if (err) { ERROR("%p: fail: %d", decoder, err); goto fail; } /* not entirely sure why we need to call this here.. just copying omx.. */ err = VIDDEC2_control(decoder->codec, XDM_GETBUFINFO, decoder->dynParams, decoder->status); if (err) { ERROR("%p: fail: %d", decoder, err); goto fail; } decoder->outBuffer = dsp_dce_alloc(sizeof(XDAS_Int8*) * MAX_IO_BUFS); decoder->outBufSizes = dsp_dce_alloc(sizeof(XDAS_Int32)* MAX_IO_BUFS); decoder->inBufs = dsp_dce_alloc(sizeof(XDM1_BufDesc)); decoder->inBufs->numBufs = 1; decoder->inBufs->descs[0].buf = (XDAS_Int8 *)omap_bo_dmabuf((struct omap_bo*) decoder->input_bo); decoder->inBufs->descs[0].bufSize = width * height; dsp_dce_buf_lock(1, &(decoder->inBufs->descs[0].buf)); decoder->outBuffer[0] = (XDAS_Int8*)omap_bo_dmabuf((struct omap_bo*) decoder->output_bo); decoder->outBuffer[1] = decoder->outBuffer[0]; decoder->outBufSizes[0] = width * height; decoder->outBufSizes[1] = decoder->outBufSizes[0]; decoder->outBufs = dsp_dce_alloc(sizeof(XDM_BufDesc)); decoder->outBufs->numBufs = 2; decoder->outBufs->bufs = (XDAS_Int8**)decoder->outBuffer; decoder->outBufs->bufSizes = &decoder->outBufSizes[0]; dsp_dce_buf_lock(1, &decoder->outBuffer[0]); decoder->inArgs = dsp_dce_alloc(sizeof(IVIDDEC2_InArgs)); decoder->inArgs->size = sizeof(IVIDDEC2_InArgs); decoder->outArgs = dsp_dce_alloc(sizeof(IVIDDEC2_OutArgs)); decoder->outArgs->size = sizeof(IVIDDEC2_OutArgs); // Fill input buffer with a pattern for testing */ MSG("Fill input buffer with pattern %d\n", pattern); for(i = 0; i < decoder->input_sz ; i++) decoder->input[i] = pattern; return decoder; usage: MSG("Fail\n"); fail: if (decoder) decoder_close(decoder); return NULL; } static int decoder_process(struct decoder *decoder) { XDM1_BufDesc *inBufs = decoder->inBufs; XDM_BufDesc *outBufs = decoder->outBufs; VIDDEC2_InArgs *inArgs = decoder->inArgs; VIDDEC2_OutArgs *outArgs = decoder->outArgs; XDAS_Int32 err = XDM_EOK, j,success = XDAS_TRUE; char *src,*dst; err = VIDDEC2_process(decoder->codec, inBufs, outBufs, inArgs, outArgs); if (err) { ERROR("%p: process returned error: %d", decoder, err); return -1; } dsp_dce_buf_unlock(1, &decoder->outBuffer[0]); MSG("Verifing the UniversalCopy algorithm\n"); src = (char*)decoder->input; dst = (char*)decoder->output; for(j= 0 ; j < decoder->input_sz ; j++){ if(*src != *dst){ MSG("copycodectest failed at %d, 0x%x, 0x%x\n", j, *src, *dst); success = XDAS_FALSE; break; } src++; dst++; } if(success ==XDAS_TRUE) MSG("copycodectest executed successfully\n"); return 0; } int main(int argc, char **argv) { struct decoder *decoder = NULL; int pattern; if(argc != 2){ MSG("Usage: copycodectest pattern(0 to 255) \t"); MSG("Example: copycodectest 100\n"); exit(0); } pattern = atoi(argv[1]); decoder = decoder_open(pattern); if(decoder) decoder_process(decoder); if(decoder) decoder_close(decoder); return 0; }