[Mplayer-cvslog] CVS: main/libaf af.h,1.11,1.12 af_format.c,1.7,1.8
Anders Johansson CVS
anders at mplayerhq.hu
Wed Nov 13 10:10:10 CET 2002
Update of /cvsroot/mplayer/main/libaf
In directory mail:/var/tmp.root/cvs-serv17501/libaf
Modified Files:
af.h af_format.c
Log Message:
Fixing segfault bug and addnig support for lrintf() in format conversion
Index: af.h
===================================================================
RCS file: /cvsroot/mplayer/main/libaf/af.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- af.h 12 Nov 2002 12:33:54 -0000 1.11
+++ af.h 13 Nov 2002 09:09:50 -0000 1.12
@@ -1,9 +1,9 @@
#include <stdio.h>
+#include "af_mp.h"
#include "config.h"
#include "control.h"
#include "af_format.h"
-#include "af_mp.h"
#ifndef __aop_h__
#define __aop_h__
Index: af_format.c
===================================================================
RCS file: /cvsroot/mplayer/main/libaf/af_format.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- af_format.c 12 Nov 2002 12:33:54 -0000 1.7
+++ af_format.c 13 Nov 2002 09:09:50 -0000 1.8
@@ -12,6 +12,13 @@
#include "af.h"
+// Integer to float conversion through lrintf()
+#ifdef HAVE_LRINTF
+#define __USE_ISOC99 1
+#include <math.h>
+#else
+#define lrintf(x) ((int)(x))
+#endif
/* Functions used by play to convert the input audio to the correct
format */
@@ -119,6 +126,27 @@
return str;
}
+// Helper function to check sanity for input arguments
+int check_sanity(af_data_t* data)
+{
+ char buf[256];
+ // Sanity check for bytes per sample
+ if(data->bps != 4 && data->bps != 2 && data->bps != 1){
+ af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample must be 1, 2 or 4. Current value is %i \n",data->bps);
+ return AF_ERROR;
+ }
+
+ // Check for unsupported formats
+ switch(data->format & AF_FORMAT_SPECIAL_MASK){
+ case(AF_FORMAT_MPEG2):
+ case(AF_FORMAT_AC3):
+ af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n",
+ fmt2str(data->format,buf,255));
+ return AF_ERROR;
+ }
+ return AF_OK;
+}
+
// Initialization and runtime control
static int control(struct af_instance_s* af, int cmd, void* arg)
{
@@ -131,24 +159,14 @@
af->data->bps == ((af_data_t*)arg)->bps)
return AF_DETACH;
- // Sanity check for bytes per sample
- if(((af_data_t*)arg)->bps != 4 && ((af_data_t*)arg)->bps != 2 &&
- ((af_data_t*)arg)->bps != 1){
- af_msg(AF_MSG_ERROR,"[format] The number of output bytes per sample must be 1, 2 or 4. Current value is %i \n",((af_data_t*)arg)->bps);
+ // Check for errors in configuraton
+ if(AF_OK != check_sanity((af_data_t*)arg) ||
+ AF_OK != check_sanity(af->data))
return AF_ERROR;
- }
-
- // Check for unsupported formats
- switch(((af_data_t*)arg)->format & AF_FORMAT_SPECIAL_MASK){
- case(AF_FORMAT_MPEG2):
- case(AF_FORMAT_AC3):
- af_msg(AF_MSG_ERROR,"[format] Sample format not yet supported \n");
- return AF_ERROR;
- }
af_msg(AF_MSG_VERBOSE,"[format] Changing sample format from %ibit %sto %ibit %s \n",
- ((af_data_t*)arg)->bps*8,fmt2str(((af_data_t*)arg)->format,buf1,256),
- af->data->bps*8,fmt2str(af->data->format,buf2,256));
+ ((af_data_t*)arg)->bps*8,fmt2str(((af_data_t*)arg)->format,buf1,255),
+ af->data->bps*8,fmt2str(af->data->format,buf2,255));
af->data->rate = ((af_data_t*)arg)->rate;
af->data->nch = ((af_data_t*)arg)->nch;
@@ -159,9 +177,11 @@
case AF_CONTROL_COMMAND_LINE:{
af_data_t d={NULL,0,0,0,0,2};
char str[256];
+ str[0] = '\0';
sscanf((char*)arg,"%i:%s",&(d.bps),str);
// Convert string to format
d.format = str2fmt(str);
+
// Automatic correction of errors
switch(d.format & AF_FORMAT_SPECIAL_MASK){
case(AF_FORMAT_A_LAW):
@@ -178,13 +198,9 @@
case AF_CONTROL_FORMAT:
// Reinit must be called after this function has been called
- // Check for unsupported formats
- switch(((af_data_t*)arg)->format & AF_FORMAT_SPECIAL_MASK){
- case(AF_FORMAT_MPEG2):
- case(AF_FORMAT_AC3):
- af_msg(AF_MSG_ERROR,"[format] Sample format not yet supported \n");
+ // Check for errors in configuraton
+ if(AF_OK != check_sanity((af_data_t*)arg))
return AF_ERROR;
- }
af->data->format = ((af_data_t*)arg)->format;
af->data->bps=((af_data_t*)arg)->bps;
@@ -232,7 +248,6 @@
si2us(l->audio,l->audio,len,l->bps);
break;
case(AF_FORMAT_F):
- float2int(c->audio, l->audio, len, l->bps);
switch(l->format&AF_FORMAT_SPECIAL_MASK){
case(AF_FORMAT_MU_LAW):
to_ulaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
@@ -240,9 +255,12 @@
case(AF_FORMAT_A_LAW):
to_alaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
break;
+ default:
+ float2int(c->audio, l->audio, len, l->bps);
+ if((l->format&AF_FORMAT_SIGN_MASK) == AF_FORMAT_US)
+ si2us(l->audio,l->audio,len,l->bps);
+ break;
}
- if((l->format&AF_FORMAT_SIGN_MASK) == AF_FORMAT_US)
- si2us(l->audio,l->audio,len,l->bps);
break;
default:
// Input must be int
@@ -255,26 +273,25 @@
si2us(c->audio,c->audio,len,c->bps);
}
// Convert to special formats
- switch(l->format&AF_FORMAT_SPECIAL_MASK){
+ switch(l->format&(AF_FORMAT_SPECIAL_MASK|AF_FORMAT_POINT_MASK)){
case(AF_FORMAT_MU_LAW):
to_ulaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
break;
case(AF_FORMAT_A_LAW):
to_alaw(c->audio, l->audio, len, c->bps, c->format&AF_FORMAT_POINT_MASK);
break;
+ case(AF_FORMAT_F):
+ int2float(c->audio, l->audio, len, c->bps);
+ break;
default:
- // Change to float
- if(AF_FORMAT_F == (l->format&AF_FORMAT_POINT_MASK))
- int2float(c->audio, l->audio, len, c->bps);
- else{
- // Change the number of bits
- if(c->bps != l->bps)
- change_bps(c->audio,l->audio,len,c->bps,l->bps);
- else
- c->audio = l->audio;
- }
+ // Change the number of bits
+ if(c->bps != l->bps)
+ change_bps(c->audio,l->audio,len,c->bps,l->bps);
+ else
+ memcpy(l->audio,c->audio,len*c->len);
break;
}
+ break;
}
// Switch from cpu native endian to the correct endianess
@@ -299,7 +316,6 @@
af->data=calloc(1,sizeof(af_data_t));
if(af->data == NULL)
return AF_ERROR;
- (int)af->setup = 0;
return AF_OK;
}
@@ -427,15 +443,15 @@
switch(bps){
case(1):
for(i=0;i<len;i++)
- ((int8_t*)out)[i]=(int8_t)(SCHAR_MAX*((float*)in)[i]);
+ ((int8_t*)out)[i]=(int8_t)lrintf(SCHAR_MAX*((float*)in)[i]);
break;
case(2):
for(i=0;i<len;i++)
- ((int16_t*)out)[i]=(int16_t)(SHRT_MAX*((float*)in)[i]);
+ ((int16_t*)out)[i]=(int16_t)lrintf(SHRT_MAX*((float*)in)[i]);
break;
case(4):
for(i=0;i<len;i++)
- ((int32_t*)out)[i]=(int32_t)(INT_MAX*((float*)in)[i]);
+ ((int32_t*)out)[i]=(int32_t)lrintf(INT_MAX*((float*)in)[i]);
break;
}
}
More information about the MPlayer-cvslog
mailing list