Skip to content

Commit

Permalink
resampling/converting: Use the same code-paths for 8-bit input samples.
Browse files Browse the repository at this point in the history
Previously, for 8-bit inputs, a special code-path was used for resampling and format conversion. Now all input sample formats are converted to floating point and processed within the same code-paths.
  • Loading branch information
maikmerten committed May 20, 2024
1 parent d581e89 commit a07d35c
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 789 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ AR=ar

# source files for encoder library within SRC_PREFIX
SRC_LIB_C=amodini2.c cnts.c detect.c emap.c l3init.c l3pack.c mhead.c pcmhpm.c setup.c spdsmr.c xhead.c cnt.c emdct.c filter2.c hwin.c l3math.c pow34.c sbt.c xhwin.c xsbt.c
SRC_LIB_CPP=bitallo.cpp bitallo1.cpp bitallo3.cpp bitalloc.cpp bitallos.cpp bitallosc.cpp mp3enc.cpp srcc.cpp srccf.cpp srccfb.cpp
SRC_LIB_CPP=bitallo.cpp bitallo1.cpp bitallo3.cpp bitalloc.cpp bitallos.cpp bitallosc.cpp mp3enc.cpp srcc.cpp srccf.cpp

# source files for encoder application
SRC_APP=test/tomp3.cpp
Expand Down
1 change: 0 additions & 1 deletion hmp3/mp3enc_asm.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@
<ClCompile Include="src\spdsmr.c" />
<ClCompile Include="src\srcc.cpp" />
<ClCompile Include="src\srccf.cpp" />
<ClCompile Include="src\srccfb.cpp" />
<ClCompile Include="src\test\tomp3.cpp" />
<ClCompile Include="src\xhead.c" />
</ItemGroup>
Expand Down
25 changes: 1 addition & 24 deletions hmp3/src/pub/srcc.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* ***** BEGIN LICENSE BLOCK *****
* Source last modified: 2024-05-19, Case
* Source last modified: 2024-05-20, Maik Merten
*
* Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved.
*
Expand Down Expand Up @@ -125,33 +125,10 @@ class Csrc
int src_filter_to_mono_case3 ( float x[][2], float y[] );
int src_filter_to_mono_case4 ( float x[][2], float y[] );

// 8 bit input
int src_bfilter_mono_case0 ( unsigned char x[], float y[] );
int src_bfilter_mono_case1 ( unsigned char x[], float y[] );
int src_bfilter_mono_case2 ( unsigned char x[], float y[] );
int src_bfilter_mono_case3 ( unsigned char x[], float y[] );
int src_bfilter_mono_case4 ( unsigned char x[], float y[] );

int src_bfilter_dual_case0 ( unsigned char x[][2], float y[][2] );
int src_bfilter_dual_case1 ( unsigned char x[][2], float y[][2] );
int src_bfilter_dual_case2 ( unsigned char x[][2], float y[][2] );
int src_bfilter_dual_case3 ( unsigned char x[][2], float y[][2] );
int src_bfilter_dual_case4 ( unsigned char x[][2], float y[][2] );

int src_bfilter_to_mono_case0 ( unsigned char x[][2], float y[] );
int src_bfilter_to_mono_case1 ( unsigned char x[][2], float y[] );
int src_bfilter_to_mono_case2 ( unsigned char x[][2], float y[] );
int src_bfilter_to_mono_case3 ( unsigned char x[][2], float y[] );
int src_bfilter_to_mono_case4 ( unsigned char x[][2], float y[] );

int stage1_mono ( float x[] );
int stage1_dual ( float x[][2] );
int stage1_to_mono ( float x[][2] );

int stage1b_mono ( unsigned char x[] );
int stage1b_dual ( unsigned char x[][2] );
int stage1b_to_mono ( unsigned char x[][2] );

};

#endif // _SRCC_H_
128 changes: 35 additions & 93 deletions hmp3/src/srcc.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* ***** BEGIN LICENSE BLOCK *****
* Source last modified: 2024-05-19, Case
* Source last modified: 2024-05-20, Maik Merten
*
* Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved.
*
Expand Down Expand Up @@ -765,9 +765,6 @@ Csrc::sr_convert_init ( int source, int channels, int bits, int is_float,
if ( ( channels == 2 ) && ( target_channels == 1 ) )
kfilter = 2;

byte_input = 0;
if ( bits == 8 )
byte_input = 1;

min_samps = gen_src_filter ( source, target ); // return 0 if can't handle
if ( min_samps <= 0 )
Expand All @@ -778,7 +775,7 @@ Csrc::sr_convert_init ( int source, int channels, int bits, int is_float,
src_bytes_out = sizeof ( float) * target_channels * 1152;

//src_filter = src_filter_table[byte_input][kfilter][src.ncase];
src_filter = ( 3 * 5 ) * byte_input + 5 * kfilter + src.ncase;
src_filter = 5 * kfilter + src.ncase;

/* return cutoff frequency for encoder */
*encode_cutoff_freq = ( int ) ( 0.90f * HX_MIN ( target, source ) / 2 );
Expand All @@ -800,40 +797,43 @@ Csrc::sr_convert ( unsigned char xin[], float yout[] )
IN_OUT x;

float *in_ptr = (float *)xin;
if (m_bits != 8) {
float *dst = (float *)itof_buf;
in_ptr = itof_buf;

if (m_bits == 32) {
if (m_is_float) {
float *src = (float *)xin;
for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (float)(*src++) * 32768.0f;
}
} else {
int *src = (int *)xin;

for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (float)( (*src++) / 65536.0f );
}
}
} else if (m_bits == 24) {
unsigned char *src = (unsigned char *)xin;
for (int i = 0; i < m_frames_to_convert * m_channels; ++i) {
int s = ( ( src[2] << 24 ) | ( src[1] << 16 ) | ( src[0] << 8 ) ) >> 8;
*dst++ = (float)( (float)s / 256.0f );
src += 3;
}
} else if (m_bits == 16) {
short *src = (short *)xin;
float *dst = (float *)itof_buf;
in_ptr = itof_buf;

if (m_bits == 32) {
if (m_is_float) {
float *src = (float *)xin;
for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (float)*src++;
*dst++ = (float)(*src++) * 32768.0f;
}
} else {
int *src = (int *)xin;

for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (float)( (*src++) / 65536.0f );
}
}
} else if (m_bits == 24) {
unsigned char *src = (unsigned char *)xin;
for (int i = 0; i < m_frames_to_convert * m_channels; ++i) {
int s = ( ( src[2] << 24 ) | ( src[1] << 16 ) | ( src[0] << 8 ) ) >> 8;
*dst++ = (float)( (float)s / 256.0f );
src += 3;
}
} else if (m_bits == 16) {
short *src = (short *)xin;
for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (float)*src++;
}
} else if (m_bits == 8) {
unsigned char *src = (unsigned char*)xin;
for ( int i = 0; i < m_frames_to_convert * m_channels; ++i ) {
*dst++ = (((float)*src++) - 127.0f) * (255.0f);
}
}

typedef float float_pair[2];
typedef unsigned char uchar_pair[2];

//x.in_bytes = src_filter(xin, yout);

Expand Down Expand Up @@ -894,69 +894,11 @@ Csrc::sr_convert ( unsigned char xin[], float yout[] )
case 14:
x.in_bytes = src_filter_to_mono_case4 ( ( float_pair * ) in_ptr, yout );
break;

// 8 bit input
case 15:
x.in_bytes = src_bfilter_mono_case0 ( ( unsigned char * ) xin, yout );
break;
case 16:
x.in_bytes = src_bfilter_mono_case1 ( ( unsigned char * ) xin, yout );
break;
case 17:
x.in_bytes = src_bfilter_mono_case2 ( ( unsigned char * ) xin, yout );
break;
case 18:
x.in_bytes = src_bfilter_mono_case3 ( ( unsigned char * ) xin, yout );
break;
case 19:
x.in_bytes = src_bfilter_mono_case4 ( ( unsigned char * ) xin, yout );
break;
//---
case 20:
x.in_bytes =
src_bfilter_dual_case0 ( ( uchar_pair * ) xin,
( float_pair * ) yout );
break;
case 21:
x.in_bytes =
src_bfilter_dual_case1 ( ( uchar_pair * ) xin,
( float_pair * ) yout );
break;
case 22:
x.in_bytes =
src_bfilter_dual_case2 ( ( uchar_pair * ) xin,
( float_pair * ) yout );
break;
case 23:
x.in_bytes =
src_bfilter_dual_case3 ( ( uchar_pair * ) xin,
( float_pair * ) yout );
break;
case 24:
x.in_bytes =
src_bfilter_dual_case4 ( ( uchar_pair * ) xin,
( float_pair * ) yout );
break;
//---
case 25:
x.in_bytes = src_bfilter_to_mono_case0 ( ( uchar_pair * ) xin, yout );
break;
case 26:
x.in_bytes = src_bfilter_to_mono_case1 ( ( uchar_pair * ) xin, yout );
break;
case 27:
x.in_bytes = src_bfilter_to_mono_case2 ( ( uchar_pair * ) xin, yout );
break;
case 28:
x.in_bytes = src_bfilter_to_mono_case3 ( ( uchar_pair * ) xin, yout );
break;
case 29:
x.in_bytes = src_bfilter_to_mono_case4 ( ( uchar_pair * ) xin, yout );
break;

}

if (m_bits == 16) {
if (m_bits == 8) {
x.in_bytes /= 4;
} if (m_bits == 16) {
x.in_bytes /= 2;
} else if (m_bits == 24) {
x.in_bytes = x.in_bytes * 3 / 4;
Expand Down

0 comments on commit a07d35c

Please sign in to comment.