//! analyze frame header. private bool checkID3v1(ref BinaryReader br, ref sMP3Data data, BinaryReader tag_check) { byte[] tag_byte = new byte[3]; tag_check.Read(tag_byte, 0, 3); string tag_name = Encoding.ASCII.GetString(tag_byte); Console.Write("tag:{0}\n", tag_name); //! "TAG" check. if (tag_name == "TAG") { return true; } return false; }
//! analyze ID3v2tag. private bool analyzeID3v2(ref FileStream fs, ref BinaryReader br, ref sMP3Data data) { BinaryReader tag_br = new BinaryReader(fs); byte[] tag_byte = new byte[3]; tag_br.Read(tag_byte, 0, 3); string tag_name = Encoding.ASCII.GetString(tag_byte); Console.Write("tag:{0}\n", tag_name); //! "ID3" check. if (tag_name != "ID3") { data.tag_name = ""; return true; } data.mb_HeaderID3v2 = new byte[10]; br.Read(data.mb_HeaderID3v2, 0, 10); Console.Write("header_byte:0x"); for (int count = 0; count < 10; count++) { Console.Write("{0:x2}", data.mb_HeaderID3v2[count]); } Console.Write("\n"); //! header name. string header_name = Encoding.ASCII.GetString(data.mb_HeaderID3v2, 0, 3); Console.Write("header_name:{0}\n", header_name); //! header version. data.mh_ID3v2Version = BitConverter.ToInt16(data.mb_HeaderID3v2, 3); Console.Write("header_version:0x{0:x8}\n", data.mh_ID3v2Version); if (data.mh_ID3v2Version != 2) { return false; } //! header flag. Console.Write("header_flag:0x{0:x8}\n", data.mb_HeaderID3v2[5]); //! header size. byte[] byte_switch = new byte[4]; byte byte_set_offset = 0; for (int count = 0; count < 4; count++) { byte_switch[count] = (byte)(data.mb_HeaderID3v2[count + 6] & 0x7f); } for (int count = 0; count < 3; count++) { byte_set_offset = (byte)(byte_switch[2-count] << (7-count)); byte_switch[3-count] = (byte)(byte_switch[3-count] | byte_set_offset); byte_switch[2-count] = (byte)(byte_switch[2-count] >> (1+count)); } common_func.converIntValue(ref data.mh_ID3v2Size, byte_switch, 0); Console.Write("header_size:{0}\n", data.mh_ID3v2Size); Console.Write("header_size :0x{0:x2}{1:x2}{2:x2}{3:x2}\n", data.mb_HeaderID3v2[6], data.mb_HeaderID3v2[7], data.mb_HeaderID3v2[8], data.mb_HeaderID3v2[9]); Console.Write("header_switch:0x{0:x2}{1:x2}{2:x2}{3:x2}\n", byte_switch[0], byte_switch[1], byte_switch[2], byte_switch[3]); data.mb_ID3v2TagInfo = new byte[data.mh_ID3v2Size]; br.Read(data.mb_ID3v2TagInfo, 0, data.mh_ID3v2Size); return true; }
//! search ID3v2tag info. public bool searchID3v2(ref byte[] byte_info, ref int info_size, sMP3Data data, string tag) { int frame_check = 0; byte[] byte_frame = new byte[6]; string frame_name; byte[] byte_switch = new byte[4]; int frame_size = 0; int compare = 0; while (true) { //! frame size over break. if (frame_check >= data.mh_ID3v2Size) break; Console.Write("frame_check:{0}\n", frame_check); //! frame name & size check. for (int count = 0; count < 6; count++) { byte_frame[count] = data.mb_ID3v2TagInfo[frame_check + count]; } Console.Write("byte_frame:0x{0:x2}{1:x2}{2:x2}{3:x2}{4:x2}{5:x2}\n", byte_frame[0], byte_frame[1], byte_frame[2], byte_frame[3], byte_frame[4], byte_frame[5]); //! frame name check. frame_name = Encoding.ASCII.GetString(byte_frame, 0, 3); Console.Write("frame_name:{0}\n", frame_name); byte_frame[2] = (byte)(byte_frame[2] & 0x00); for (int count = 0; count < 4; count++) { byte_switch[count] = byte_frame[count + 2]; } common_func.converIntValue(ref frame_size, byte_switch, 0); Console.Write("frame_size:{0}\n", frame_size); compare = string.Compare(tag, frame_name); if (compare == 0) { byte_info = new byte[frame_size]; info_size = frame_size; Array.Copy(data.mb_ID3v2TagInfo, frame_check + 6, byte_info, 0, frame_size); return true; } frame_check += frame_size + 6; } return false; }
//! analyze frame header. private bool analyzeFrameHeader(ref BinaryReader br, ref sMP3Data data) { //! header 4byte. byte[] header_byte = new byte[4]; br.Read(header_byte, 0, 4); common_func.converIntValue(ref data.frame_bit, header_byte, 0); Console.Write("header:0x{0:x8} {1}\n", data.frame_bit, sizeof(int)); //! check first bit. int check_bit = data.frame_bit >> 21; check_bit = check_bit & 0x00000FFF; if (check_bit == 0) { return false; } //! get ID-bit. int mpeg_ver = data.frame_bit >> 19; mpeg_ver = mpeg_ver & 0x00000003; data.mpeg_ver = (eMPEGVer)mpeg_ver; Console.Write("mpeg_ver:0x{0:x8}\n", mpeg_ver); //! get Layer-bit. int layer_bit = data.frame_bit >> 17; layer_bit = layer_bit & 0x00000003; data.layer_bit = (eLayerBit)layer_bit; Console.Write("layer_bit:0x{0:x8}\n", layer_bit); //! Protection-Bit. int protection_bit = data.frame_bit >> 16; protection_bit = protection_bit & 0x00000001; data.protection_bit = (eProtectionBit)protection_bit; Console.Write("protection_bit:0x{0:x8}\n", protection_bit); //! BitRateTable. int bitrate = data.frame_bit >> 12; bitrate = bitrate & 0x0000000F; if (data.mpeg_ver == eMPEGVer.First) { switch (data.layer_bit) { case eLayerBit.Layer1: data.bitrate = m_BitRateTable[0][bitrate]; break; case eLayerBit.Layer2: data.bitrate = m_BitRateTable[1][bitrate]; break; case eLayerBit.Layer3: data.bitrate = m_BitRateTable[2][bitrate]; break; default: Console.Write("Get Bitrate : None Layer\n"); break; } } else if (data.mpeg_ver == eMPEGVer.Second || data.mpeg_ver == eMPEGVer.SecondHalf) { switch (data.layer_bit) { case eLayerBit.Layer1: data.bitrate = m_BitRateTable[3][bitrate]; break; case eLayerBit.Layer2: case eLayerBit.Layer3: data.bitrate = m_BitRateTable[4][bitrate]; break; default: Console.Write("Get Bitrate : None Layer\n"); break; } } else { Console.Write("MPEG ver None BitrateTable\n"); return false; } Console.Write("bitrate:{0}\n", data.bitrate); //! Sampling Frequency. int sampling = data.frame_bit >> 10; sampling = sampling & 0x00000003; switch (data.mpeg_ver) { case eMPEGVer.First: data.samplingrate = m_SamplingRateTable[0][sampling]; break; case eMPEGVer.Second: data.samplingrate = m_SamplingRateTable[1][sampling]; break; case eMPEGVer.SecondHalf: data.samplingrate = m_SamplingRateTable[2][sampling]; break; default: Console.Write("MPEG ver None SamplingRateTable\n"); break; } Console.Write("sampling:{0}\n", data.samplingrate); //! Padding Bit. int padding_bit = data.frame_bit >> 9; padding_bit = padding_bit & 0x00000001; data.padding_bit = padding_bit; Console.Write("padding_bit:0x{0:x8}\n", data.padding_bit); //! Private Bit. int private_bit = data.frame_bit >> 8; private_bit = private_bit & 0x00000001; data.private_bit = private_bit; Console.Write("private_bit:0x{0:x8}\n", data.private_bit); //! Mode Bit. int mode_bit = data.frame_bit >> 6; mode_bit = mode_bit & 0x00000003; data.mode_bit = (eModeBit)mode_bit; Console.Write("mode_bit:0x{0:x8}\n", mode_bit); //! ModeExtension Bit. int modeEx_bit = data.frame_bit >> 4; modeEx_bit = modeEx_bit & 0x00000003; data.modeEx_bit = (eModeExtension)modeEx_bit; Console.Write("modeEx_bit:0x{0:x8}\n", modeEx_bit); //! Copyright. int copyright_bit = data.frame_bit >> 3; copyright_bit = copyright_bit & 0x00000001; data.copyright_bit = copyright_bit; Console.Write("copyright_bit:0x{0:x8}\n", data.copyright_bit); //! Original Check. int original_bit = data.frame_bit >> 2; original_bit = original_bit & 0x00000001; data.original_bit = original_bit; Console.Write("original_bit:0x{0:x8}\n", data.original_bit); //! Emphasis Bit. int emphasis_bit = data.frame_bit & 0x00000003; data.emphasis_bit = (eEmphasis)emphasis_bit; Console.Write("emphasis_bit:0x{0:x8}\n", emphasis_bit); //! Frame Size. switch (data.layer_bit) { case eLayerBit.Layer1: data.frame_size = ((12 * 1000 * data.bitrate / data.samplingrate) + data.padding_bit) * 4; break; case eLayerBit.Layer2: data.frame_size = (144 * 1000 * data.bitrate / data.samplingrate) + data.padding_bit; break; case eLayerBit.Layer3: if (data.mpeg_ver == eMPEGVer.First) { data.frame_size = (144 * 1000 * data.bitrate / data.samplingrate) + data.padding_bit; } else { data.frame_size = (72 * 1000 * data.bitrate / data.samplingrate) + data.padding_bit; } break; default: Console.Write("MPEG ver None Frame Size\n"); break; } Console.Write("frame_size:{0}\n", data.frame_size); byte[] frame_size_byte = new byte[data.frame_size-4]; br.Read(frame_size_byte, 0, data.frame_size-4); return true; #if false //! frame tag checktest. byte[] get_info = null; int info_size = 0; bool ret = searchID3v2(ref get_info, ref info_size, data, "TSS"); if (ret) { string tss_name; tss_name = Encoding.ASCII.GetString(get_info, 1, info_size-1); Console.Write("string_code_bit:0x{0:x2}\n", get_info[0]); Console.Write("tss_name:{0}\n", tss_name); } #endif }
//! analyze start mp3. public void readMp3Data(ref sMP3Data data, string filename) { //! file open. FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Console.Write("mp3 file name:{0}\n", filename); //! analyze ID3v2tag. FileStream tag_fs = new FileStream(filename, FileMode.Open, FileAccess.Read); bool ver_check = analyzeID3v2(ref tag_fs, ref br, ref data); //! mp3 analyze version 2.2 only. if (!ver_check) { return; } //! get header info. while (true) { if (!analyzeFrameHeader(ref br, ref data)) { break; } } }