This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Fail to call AUDDEC1_process() using aachedec codec

Other Parts Discussed in Thread: OMAP3530

Hello,

       I'm using aachedec codec for aac decoding. I programed with the app offered by the aachedec codec which lies in the following directory: /aachedec/app/Client/Test/src/TestAppDecoder.c. I compiled it successfully. But when run on my OMAP3530 board, it went wrong with error: fail to process. In other words, after setting parameters, it corrupted when calling AUDDEC1_process(). This is my main problem and I am eager to solve it as soon as possible. Please help me check my app to solve it.

     What's more, I found an interesting problem. If I set dec.params.dataEndianness=XDM_BYTE, it works well until calling AUDDEC1_process(). But if I set dec.params.dataEndianness=XDM_LE_16, it went wrong when calling AUDDEC1_create(). I don't know why this happened.

     Does the setting of parameters cause my problem? What should I pay attention to when programming? My app.c is post below.

 

////////////////////////////////////////////////////////////////app.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>
#include <xdc/std.h>
#include <ti/xdais/dm/iauddec1.h>
#include <ti/sdo/ce/audio1/auddec1.h>
#include <ti/sdo/ce/Engine.h>
#include <ti/sdo/ce/CERuntime.h>
#include <ti/sdo/ce/osal/Memory.h>
#include <ti/sdo/ce/trace/gt.h>
#include <ti/sdo/dmai/Dmai.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>

//#include </home/rayn/dvsdk_3_00_02_44/cs1omap3530_1_00_01/packages/ti/sdo/codecs/mp3dec>

#define INPUT_SIZE 2048
#define OUTPUT_SIZE 4096
#define BUFALIGN 128

// input and output data buffer
 XDAS_Int16 *input_buf;
 XDAS_UInt8 *output_buf;


void WriteToFile(FILE *outputFile,XDAS_UInt16 *out, XDAS_Int16 nch,XDAS_Int32 nSamples);
void WriteToFileAudioInterleaved(FILE *outputFile,XDAS_UInt16 *out, XDAS_Int16 nch,XDAS_Int32 nSamples);

int main()
{
 // the variable used by codec engine;
 int8_t         *codec_name = "aachedec";
 XDAS_Int32  ctrl;
 XDAS_Int32  proc;
 Engine_Handle   ce_h = NULL;
 Engine_Error    err;
 AUDDEC1_Handle  aachedec_h = NULL;
 AUDDEC1_Status         status = {0};       /*! status variable               */
 AUDDEC1_Params         dec_params = {0};       /*! variable for initialization    */
 AUDDEC1_DynamicParams  dyn_params = {0};       /*! Dynamic parameter variable     */
 AUDDEC1_InArgs         inargs = {0};       /*! Input Argument for each block  */
 AUDDEC1_OutArgs        outargs = {0};       /*! Output Argument for each block */
 XDM1_BufDesc           inBufDesc = {0};       /*! Input Buffer Descriptor        */
 XDM1_BufDesc           outBufDesc = {0};       /*! Output Buffer Descriptor       */
 
 XDAS_Int32 frameCnt=0,nDecodedSamples = 0;
 XDAS_Int16 nch;
 XDAS_Int32 channelMode;
 XDAS_Int32 error = 0;
 

 /* File I/O variables*/
 FILE   *inputFile= NULL, *outputFile= NULL;
 char outputFileName[]="b.pcm";
 char inputFileName []="b.aac";
 
 // channel mode
 channelMode=1;
       
 /* Open input file */
        inputFile = fopen (inputFileName, "rb");
        if (inputFile == NULL)
        {
  printf("Error opening input file %s.....proceeding to next file.\n",inputFileName);
  exit(1);
        }

        /* Open output/Reference file */
        outputFile = fopen (outputFileName, "wb");
        if (outputFile == NULL)
        {
  printf("Error opening output/reference file %s.....proceeding to next file.\n",outputFileName);
  exit(1);
        }

 // Initialize Codec Engine runtime
 CERuntime_init();
 
 // Initialize Davinci Multimedia Application Interface
 Dmai_init();

 // open an engine
 ce_h=Engine_open("new",NULL,&err);
 if(ce_h==NULL)
  printf("fail to open engine error code: %d\n", err);
       
 // alloc memory for input_buf and output_buf
 input_buf = (XDAS_Int16 *)Memory_contigAlloc(INPUT_SIZE, BUFALIGN);
 output_buf = (XDAS_UInt8 *)Memory_contigAlloc(OUTPUT_SIZE, BUFALIGN);
 
 /* Setting the sizes of Base Class Objects*/
        dec_params.size               = sizeof(AUDDEC1_Params);
        status.size                   = sizeof(AUDDEC1_Status);
        dyn_params.size               = sizeof(AUDDEC1_DynamicParams);
        inargs.size                   = sizeof(AUDDEC1_InArgs);
        outargs.size                  = sizeof(AUDDEC1_OutArgs);


        /*Set creation time params */
        dec_params.outputPCMWidth = 16;
 dec_params.pcmFormat = IAUDIO_INTERLEAVED;
        dec_params.dataEndianness = XDM_BYTE;
 outargs.bytesConsumed = 0;
        outargs.extendedError = XDM_EOK;

 //build algorithm instance
 if((aachedec_h=AUDDEC1_create(ce_h,codec_name,&dec_params))==NULL)
  {
  printf("fail to create AUDDEC1 instance\n");
  exit(1);
  }

 printf ("\nDecoding %s file. Please wait..................\n",inputFileName); 

 // Get Buffer information
 if((ctrl=AUDDEC1_control(aachedec_h,XDM_GETBUFINFO,&dyn_params, &status))!=AUDDEC1_EOK)
 {
  printf("decode control status = %ld\n", ctrl);
  exit(1); 
 }

 /* Input and output buffer information for process API*/

        inBufDesc.numBufs = 1;
  //inBufDesc.descs[0].bufSize = sizeof(input_buf);
 inBufDesc.descs[0].bufSize = INPUT_SIZE;
        outBufDesc.numBufs = 1;
  //outBufDesc.descs[0].bufSize = sizeof(output_buf);
 outBufDesc.descs[0].bufSize =OUTPUT_SIZE;

        inBufDesc.descs[0].buf = (XDAS_Int8*)&input_buf;
  outBufDesc.descs[0].buf = (XDAS_Int8*)&output_buf;
  

    inargs.numBytes = 0;
    inargs.desiredChannelMode = channelMode;
    inargs.lfeFlag = 0;

 error = AUDDEC1_control(aachedec_h, XDM_SETDEFAULT,&dyn_params, &status);
  if(error == AUDDEC1_EFAIL)
    {
   printf("SetDefault command Failed\n");
    }
 dyn_params.downSampleSbrFlag = 0;
  error = AUDDEC1_control(aachedec_h, XDM_SETPARAMS,&dyn_params, &status);

       if(error == AUDDEC1_EFAIL)
    {
   printf("SetParams command Failed\n");
    }
 while (1)
            {
 inargs.numBytes  = inargs.numBytes +fread(input_buf + inargs.numBytes, 1,INPUT_SIZE - inargs.numBytes, inputFile);
         //inargs.numBytes  = inargs.numBytes +fread(input_buf + inargs.numBytes, 1,sizeof(input_buf) - inargs.numBytes, inputFile);
        /* size of input data in bytes in the input buffer */
        if ( inargs.numBytes < 8)
                    break;
printf("inargs.numbBytes:%d\n",inargs.numBytes);
 //if((ctrl=AUDDEC1_control(aaclcdec_h,XDM_SETPARAMS,&dyn_params, &status))!=AUDDEC1_EOK)
 //{
 // printf("decode control status = %ld\n", ctrl);
 // break; 
 //}
 /* Cache Write Back Invalidate after doing fread*/
          Memory_cacheWbInv(input_buf, INPUT_SIZE*2);


          /* Cache Invalidate for Input Buffer*/
          Memory_cacheInv(inBufDesc.descs[0].buf, inBufDesc.descs[0].bufSize);
         

        if((proc=AUDDEC1_process(aachedec_h, &inBufDesc, &outBufDesc,&inargs, &outargs))!=AUDDEC1_EOK);
 {
  printf("fail to process:%d\n",proc);
  break;
 }
  
 if(outargs.extendedError)
 { 
  printf("outargs.extendedError\n");
  break;
 }

        if (XDM_ISFATALERROR(outargs.extendedError))
  if((ctrl=AUDDEC1_control(aachedec_h,XDM_RESET,&dyn_params, &status))!=AUDDEC1_EOK)
  {
   printf("decode control status = %ld\n", ctrl);
   break; 
  }
printf("outargs.bytesConsumed:%d\n", outargs.bytesConsumed);
         /* Cache Writeback Invalidate for Output Buffers*/
         memmove(input_buf, input_buf + outargs.bytesConsumed,
         inargs.numBytes - outargs.bytesConsumed);
         inargs.numBytes -= outargs.bytesConsumed;

 if((ctrl=AUDDEC1_control(aachedec_h,XDM_GETSTATUS,&dyn_params, &status))!=AUDDEC1_EOK)
  {
   printf("decode control status = %ld\n", ctrl);
   break; 
  }
        nDecodedSamples = status.numSamples;
        nch = (short)(status.channelMode);
printf("decoded samples: %d\n", nDecodedSamples);    
        /* Write output to File */
        /* Skip first two blocks so output is time aligned with input */
        if( (outargs.extendedError == XDM_EOK))
                {

                    if(status.pcmFormat == IAUDIO_INTERLEAVED)
                        WriteToFileAudioInterleaved(outputFile,output_buf, nch,nDecodedSamples);
                    else if(status.pcmFormat == IAUDIO_BLOCK)
                        WriteToFile(outputFile,output_buf, nch,nDecodedSamples);
                    else
                        printf("Output format not supported\n");
                }
      
         /* Increment Frame Count */
         frameCnt++;
            }

         printf ("\nCompleted Decoding %d frames of %s file.\n",frameCnt,
                inputFileName);
         frameCnt=0;

         AUDDEC1_delete(aachedec_h);/* delete the algorithm */
 Engine_close(ce_h);

        if (outputFile)
            fclose (outputFile);
        if (inputFile)
            fclose (inputFile);
  
   
 return XDM_EOK;

}


void WriteToFile(FILE *outputFile,XDAS_UInt16 *out, XDAS_Int16 nch,XDAS_Int32 nSamples)
{
    XDAS_Int16 i;
    XDAS_UInt16 c,c1,c2;
    if(nch == IAUDIO_1_0)
    {
        for(i=0;i<nSamples;i++)
        {
            /* Left Channel */
            c    = out[i];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
        }
    }
    else
    {
        for(i=0;i<nSamples;i++)
        {
            /* Left Channel */
            c    = out[i];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
            /* Right Channel  */
            c    = out[i+nSamples];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
        }
    }
} // end function WriteToFile
void WriteToFileAudioInterleaved(FILE *outputFile,XDAS_UInt16 *out, XDAS_Int16 nch,XDAS_Int32 nSamples)
{
    XDAS_Int16 i;
    XDAS_UInt16 c,c1,c2;
    if(nch == IAUDIO_1_0)
    {
        for(i=0;i<nSamples;i=i+1)
        {
            /* Left Channel */
            c    = out[i];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
        }
    }
    else
    {
        for(i=0;i<nSamples*2;i=i+2)
        {
            /* Left Channel */
            c    = out[i];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
            /* Right Channel  */
            c    = out[i+1];
            c1 = (c >> 8) & 0xff;
            c2 = c & 0xff;

            fwrite(&c2,1,1,outputFile);
            fwrite(&c1,1,1,outputFile);
        }
    }
} // end function WriteToFileAudioInterleaved