From ab8a9a1e36c9d6d043d646efd4473bb8e04142f0 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 17 Jun 2017 17:42:53 +0900 Subject: [PATCH] audio/mp3: Move t_mpeg1_header to Go --- audio/mp3/decode_notjs.go | 6 ++--- audio/mp3/l3.go | 20 ++++++++-------- audio/mp3/maindata.go | 12 ++++------ audio/mp3/pdmp3.c | 2 -- audio/mp3/pdmp3.h | 32 -------------------------- audio/mp3/read.go | 48 +++++++++++++++++++-------------------- audio/mp3/sideinfo.go | 14 +++++------- 7 files changed, 45 insertions(+), 89 deletions(-) diff --git a/audio/mp3/decode_notjs.go b/audio/mp3/decode_notjs.go index 3cd0ccef3..a93e2f72b 100644 --- a/audio/mp3/decode_notjs.go +++ b/audio/mp3/decode_notjs.go @@ -17,8 +17,6 @@ package mp3 // #include "pdmp3.h" -// -// extern t_mpeg1_header g_frame_header; import "C" import ( @@ -37,7 +35,7 @@ func decodeL3() error { out := make([]uint32, 576) // Number of channels(1 for mono and 2 for stereo) nch := 2 - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { nch = 1 } for gr := 0; gr < 2; gr++ { @@ -64,7 +62,7 @@ func decodeL3() error { func audioWriteRaw(samples []uint32) error { nch := 2 - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { nch = 1 } s := make([]uint8, len(samples)*2*nch) diff --git a/audio/mp3/l3.go b/audio/mp3/l3.go index dc7af0cea..80462f4ba 100644 --- a/audio/mp3/l3.go +++ b/audio/mp3/l3.go @@ -17,8 +17,6 @@ package mp3 // #include "pdmp3.h" -// -// extern t_mpeg1_header g_frame_header; import "C" import ( @@ -102,7 +100,7 @@ var ( func l3Requantize(gr int, ch int) { /* Setup sampling frequency index */ - sfreq := C.g_frame_header.sampling_frequency + sfreq := theMPEG1FrameHeader.sampling_frequency /* Determine type of block to process */ if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) && (theMPEG1SideInfo.block_type[gr][ch] == 2) { /* Short blocks */ /* Check if the first two subbands @@ -177,7 +175,7 @@ func l3Requantize(gr int, ch int) { func l3Reorder(gr int, ch int) { re := make([]float32, 576) - sfreq := C.g_frame_header.sampling_frequency /* Setup sampling freq index */ + sfreq := theMPEG1FrameHeader.sampling_frequency /* Setup sampling freq index */ /* Only reorder short blocks */ if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) && (theMPEG1SideInfo.block_type[gr][ch] == 2) { /* Short blocks */ /* Check if the first two subbands @@ -232,7 +230,7 @@ func stereoProcessIntensityLong(gr int, sfb int) { /* Check that((is_pos[sfb]=scalefac) != 7) => no intensity stereo */ is_pos := theMPEG1MainData.scalefac_l[gr][0][sfb] if is_pos != 7 { - sfreq := C.g_frame_header.sampling_frequency /* Setup sampling freq index */ + sfreq := theMPEG1FrameHeader.sampling_frequency /* Setup sampling freq index */ sfb_start := sfBandIndicesSet[sfreq].l[sfb] sfb_stop := sfBandIndicesSet[sfreq].l[sfb+1] if is_pos == 6 { /* tan((6*PI)/12 = PI/2) needs special treatment! */ @@ -253,7 +251,7 @@ func stereoProcessIntensityLong(gr int, sfb int) { func stereoProcessIntensityShort(gr int, sfb int) { is_ratio_l := float32(0) is_ratio_r := float32(0) - sfreq := C.g_frame_header.sampling_frequency /* Setup sampling freq index */ + sfreq := theMPEG1FrameHeader.sampling_frequency /* Setup sampling freq index */ /* The window length */ win_len := sfBandIndicesSet[sfreq].s[sfb+1] - sfBandIndicesSet[sfreq].s[sfb] /* The three windows within the band has different scalefactors */ @@ -282,11 +280,11 @@ func stereoProcessIntensityShort(gr int, sfb int) { func l3Stereo(gr int) { /* Do nothing if joint stereo is not enabled */ - if (C.g_frame_header.mode != 1) || (C.g_frame_header.mode_extension == 0) { + if (theMPEG1FrameHeader.mode != 1) || (theMPEG1FrameHeader.mode_extension == 0) { return } /* Do Middle/Side("normal") stereo processing */ - if (C.g_frame_header.mode_extension & 0x2) != 0 { + if (theMPEG1FrameHeader.mode_extension & 0x2) != 0 { /* Determine how many frequency lines to transform */ i := 0 if theMPEG1SideInfo.count1[gr][0] > theMPEG1SideInfo.count1[gr][1] { @@ -303,9 +301,9 @@ func l3Stereo(gr int) { } } /* Do intensity stereo processing */ - if (C.g_frame_header.mode_extension & 0x1) != 0 { + if (theMPEG1FrameHeader.mode_extension & 0x1) != 0 { /* Setup sampling frequency index */ - sfreq := C.g_frame_header.sampling_frequency + sfreq := theMPEG1FrameHeader.sampling_frequency /* First band that is intensity stereo encoded is first band scale factor * band on or above count1 frequency line. N.B.: Intensity stereo coding is * only done for higher subbands, but logic is here for lower subbands. */ @@ -562,7 +560,7 @@ func l3SubbandSynthesis(gr int, ch int, out []uint32) { /* Number of channels(1 for mono and 2 for stereo) */ nch := 2 - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { nch = 1 } /* Setup the n_win windowing vector and the v_vec intermediate vector */ diff --git a/audio/mp3/maindata.go b/audio/mp3/maindata.go index eac84be93..2c52d586d 100644 --- a/audio/mp3/maindata.go +++ b/audio/mp3/maindata.go @@ -17,8 +17,6 @@ package mp3 // #include "pdmp3.h" -// -// extern t_mpeg1_header g_frame_header; import "C" import ( @@ -34,15 +32,15 @@ var mpeg1_scalefac_sizes = [16][2]int{ func readMainL3() error { /* Number of channels(1 for mono and 2 for stereo) */ nch := 2 - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { nch = 1 } /* Calculate header audio data size */ framesize := (144* - g_mpeg1_bitrates[C.g_frame_header.layer-1][C.g_frame_header.bitrate_index])/ - g_sampling_frequency[C.g_frame_header.sampling_frequency] + - int(C.g_frame_header.padding_bit) + g_mpeg1_bitrates[theMPEG1FrameHeader.layer-1][theMPEG1FrameHeader.bitrate_index])/ + g_sampling_frequency[theMPEG1FrameHeader.sampling_frequency] + + int(theMPEG1FrameHeader.padding_bit) if framesize > 2000 { return fmt.Errorf("mp3: framesize = %d", framesize) @@ -55,7 +53,7 @@ func readMainL3() error { /* Main data size is the rest of the frame,including ancillary data */ main_data_size := framesize - sideinfo_size - 4 /* sync+header */ /* CRC is 2 bytes */ - if C.g_frame_header.protection_bit == 0 { + if theMPEG1FrameHeader.protection_bit == 0 { main_data_size -= 2 } /* Assemble main data buffer with data from this frame and the previous diff --git a/audio/mp3/pdmp3.c b/audio/mp3/pdmp3.c index b1ceb5688..16315561d 100644 --- a/audio/mp3/pdmp3.c +++ b/audio/mp3/pdmp3.c @@ -59,8 +59,6 @@ g_sampling_frequency[3] = { 44100 * Hz,48000 * Hz,32000 * Hz }; unsigned synth_init = 1; -t_mpeg1_header g_frame_header; - #ifdef DEBUG static void dmp_fr(t_mpeg1_header *hdr){ printf("rate %d,sfreq %d,pad %d,mod %d,modext %d,emph %d\n", diff --git a/audio/mp3/pdmp3.h b/audio/mp3/pdmp3.h index 13b72c082..428912fa1 100644 --- a/audio/mp3/pdmp3.h +++ b/audio/mp3/pdmp3.h @@ -16,36 +16,4 @@ #define TRUE 1 #define FALSE 0 -/* Types used in the frame header */ -typedef enum { /* Layer number */ - mpeg1_layer_reserved = 0, - mpeg1_layer_3 = 1, - mpeg1_layer_2 = 2, - mpeg1_layer_1 = 3 -} -t_mpeg1_layer; -typedef enum { /* Modes */ - mpeg1_mode_stereo = 0, - mpeg1_mode_joint_stereo, - mpeg1_mode_dual_channel, - mpeg1_mode_single_channel -} -t_mpeg1_mode; - -typedef struct { /* MPEG1 Layer 1-3 frame header */ - unsigned id; /* 1 bit */ - t_mpeg1_layer layer; /* 2 bits */ - unsigned protection_bit; /* 1 bit */ - unsigned bitrate_index; /* 4 bits */ - unsigned sampling_frequency; /* 2 bits */ - unsigned padding_bit; /* 1 bit */ - unsigned private_bit; /* 1 bit */ - t_mpeg1_mode mode; /* 2 bits */ - unsigned mode_extension; /* 2 bits */ - unsigned copyright; /* 1 bit */ - unsigned original_or_copy; /* 1 bit */ - unsigned emphasis; /* 2 bits */ -} -t_mpeg1_header; - #endif diff --git a/audio/mp3/read.go b/audio/mp3/read.go index 1cac4de7b..3376426ba 100644 --- a/audio/mp3/read.go +++ b/audio/mp3/read.go @@ -17,8 +17,6 @@ package mp3 // #include "pdmp3.h" -// -// extern t_mpeg1_header g_frame_header; import "C" import ( @@ -52,14 +50,14 @@ func readFrame() error { return err } // Get CRC word if present - if C.g_frame_header.protection_bit == 0 { + if theMPEG1FrameHeader.protection_bit == 0 { if err := readCRC(); err != nil { return err } } - if C.g_frame_header.layer != 3 { - return fmt.Errorf("mp3: Only layer 3(!= %d) is supported!", C.g_frame_header.layer) + if theMPEG1FrameHeader.layer != 3 { + return fmt.Errorf("mp3: Only layer 3(!= %d) is supported!", theMPEG1FrameHeader.layer) } // Get side info if err := readAudioL3(); err != nil { @@ -131,40 +129,40 @@ func readHeader() error { /* If we get here we've found the sync word,and can decode the header * which is in the low 20 bits of the 32-bit sync+header word. */ /* Decode the header */ - C.g_frame_header.id = C.uint((header & 0x00180000) >> 19) - C.g_frame_header.layer = C.t_mpeg1_layer((header & 0x00060000) >> 17) - C.g_frame_header.protection_bit = C.uint((header & 0x00010000) >> 16) - C.g_frame_header.bitrate_index = C.uint((header & 0x0000f000) >> 12) - C.g_frame_header.sampling_frequency = C.uint((header & 0x00000c00) >> 10) - C.g_frame_header.padding_bit = C.uint((header & 0x00000200) >> 9) - C.g_frame_header.private_bit = C.uint((header & 0x00000100) >> 8) - C.g_frame_header.mode = C.t_mpeg1_mode((header & 0x000000c0) >> 6) - C.g_frame_header.mode_extension = C.uint((header & 0x00000030) >> 4) - C.g_frame_header.copyright = C.uint((header & 0x00000008) >> 3) - C.g_frame_header.original_or_copy = C.uint((header & 0x00000004) >> 2) - C.g_frame_header.emphasis = C.uint((header & 0x00000003) >> 0) + theMPEG1FrameHeader.id = int((header & 0x00180000) >> 19) + theMPEG1FrameHeader.layer = mpeg1Layer((header & 0x00060000) >> 17) + theMPEG1FrameHeader.protection_bit = int((header & 0x00010000) >> 16) + theMPEG1FrameHeader.bitrate_index = int((header & 0x0000f000) >> 12) + theMPEG1FrameHeader.sampling_frequency = int((header & 0x00000c00) >> 10) + theMPEG1FrameHeader.padding_bit = int((header & 0x00000200) >> 9) + theMPEG1FrameHeader.private_bit = int((header & 0x00000100) >> 8) + theMPEG1FrameHeader.mode = mpeg1Mode((header & 0x000000c0) >> 6) + theMPEG1FrameHeader.mode_extension = int((header & 0x00000030) >> 4) + theMPEG1FrameHeader.copyright = int((header & 0x00000008) >> 3) + theMPEG1FrameHeader.original_or_copy = int((header & 0x00000004) >> 2) + theMPEG1FrameHeader.emphasis = int((header & 0x00000003) >> 0) /* Check for invalid values and impossible combinations */ - if C.g_frame_header.id != 3 { + if theMPEG1FrameHeader.id != 3 { return fmt.Errorf("mp3: ID must be 3\nHeader word is 0x%08x at file pos %d", header, getFilepos()) } - if C.g_frame_header.bitrate_index == 0 { + if theMPEG1FrameHeader.bitrate_index == 0 { return fmt.Errorf("mp3: Free bitrate format NIY!\nHeader word is 0x%08x at file pos %d", header, getFilepos()) } - if C.g_frame_header.bitrate_index == 15 { + if theMPEG1FrameHeader.bitrate_index == 15 { return fmt.Errorf("mp3: bitrate_index = 15 is invalid!\nHeader word is 0x%08x at file pos %d", header, getFilepos()) } - if C.g_frame_header.sampling_frequency == 3 { + if theMPEG1FrameHeader.sampling_frequency == 3 { return fmt.Errorf("mp3: sampling_frequency = 3 is invalid! Header word is 0x%08x at file pos %d", header, getFilepos()) } - if C.g_frame_header.layer == 0 { + if theMPEG1FrameHeader.layer == 0 { return fmt.Errorf("mp3: layer = 0 is invalid! Header word is 0x%08x at file pos %d", header, getFilepos()) } - C.g_frame_header.layer = 4 - C.g_frame_header.layer + theMPEG1FrameHeader.layer = 4 - theMPEG1FrameHeader.layer return nil } @@ -185,7 +183,7 @@ func readHuffman(part_2_start, gr, ch int) error { region_1_start = 36 /* sfb[9/3]*3=36 */ region_2_start = 576 /* No Region2 for short block case. */ } else { - sfreq := C.g_frame_header.sampling_frequency + sfreq := theMPEG1FrameHeader.sampling_frequency region_1_start = sfBandIndicesSet[sfreq].l[theMPEG1SideInfo.region0_count[gr][ch]+1] region_2_start = @@ -193,7 +191,7 @@ func readHuffman(part_2_start, gr, ch int) error { theMPEG1SideInfo.region1_count[gr][ch]+2] } /* Read big_values using tables according to region_x_start */ - for is_pos := 0; is_pos < int(theMPEG1SideInfo.big_values[gr][ch])*2; is_pos++ { + for is_pos := 0; is_pos < theMPEG1SideInfo.big_values[gr][ch]*2; is_pos++ { table_num := 0 if is_pos < region_1_start { table_num = int(theMPEG1SideInfo.table_select[gr][ch][0]) diff --git a/audio/mp3/sideinfo.go b/audio/mp3/sideinfo.go index f6635a5dc..6dcbf3a92 100644 --- a/audio/mp3/sideinfo.go +++ b/audio/mp3/sideinfo.go @@ -17,8 +17,6 @@ package mp3 // #include "pdmp3.h" -// -// extern t_mpeg1_header g_frame_header; import "C" import ( @@ -45,14 +43,14 @@ var g_sampling_frequency = [3]int{44100, 48000, 32000} func readAudioL3() error { nch := 2 - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { nch = 1 } /* Calculate header audio data size */ framesize := (144* - g_mpeg1_bitrates[C.g_frame_header.layer-1][C.g_frame_header.bitrate_index])/ - g_sampling_frequency[C.g_frame_header.sampling_frequency] + - int(C.g_frame_header.padding_bit) + g_mpeg1_bitrates[theMPEG1FrameHeader.layer-1][theMPEG1FrameHeader.bitrate_index])/ + g_sampling_frequency[theMPEG1FrameHeader.sampling_frequency] + + int(theMPEG1FrameHeader.padding_bit) if framesize > 2000 { return fmt.Errorf("mp3: framesize = %d\n", framesize) } @@ -64,7 +62,7 @@ func readAudioL3() error { /* Main data size is the rest of the frame,including ancillary data */ main_data_size := framesize - sideinfo_size - 4 /* sync+header */ /* CRC is 2 bytes */ - if C.g_frame_header.protection_bit == 0 { + if theMPEG1FrameHeader.protection_bit == 0 { main_data_size -= 2 } /* Read sideinfo from bitstream into buffer used by getSideBits() */ @@ -75,7 +73,7 @@ func readAudioL3() error { /* Pointer to where we should start reading main data */ theMPEG1SideInfo.main_data_begin = getSideBits(9) /* Get private bits. Not used for anything. */ - if C.g_frame_header.mode == C.mpeg1_mode_single_channel { + if theMPEG1FrameHeader.mode == mpeg1ModeSingleChannel { theMPEG1SideInfo.private_bits = getSideBits(5) } else { theMPEG1SideInfo.private_bits = getSideBits(3)