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