/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.container.wav.adpcm.test; /** * adpcm original format. * @author taktod */ public class AdpcmTakTest { /** logger * / private Logger logger = Logger.getLogger(AdpcmTakTest.class); private Integer[] order = { 0x0, 0x8, 0x9, 0x1, 0x2, 0xA, 0xB, 0x3, 0x4, 0x5, 0xC, 0xD, 0x6, 0x7, 0xE, 0xF }; private Integer[][] table = { {0x0, 6}, {0x8, 6}, {0x9, 3}, {0x1, 3}, {0x2, 3}, {0xA, 3}, {0xB, 3}, {0x3, 2}, {0x4, 2}, {0x5, 2}, {0xC, 2}, {0xD, 2}, {0x6, 1}, {0x7, 1}, {0xE, 1}, {0xF, 1} }; /** * read test * / @Test public void test() { IFileReadChannel source = null; try { source = FileReadChannel.openFileReadChannel( Thread.currentThread().getContextClassLoader().getResource("test.adpcm_ima_wav.wav") ); IReader reader = new RiffUnitReader(); IContainer container = null; RangeCoder coder = new RangeCoder(); coder.setupTable(table); while((container = reader.read(source)) != null) { logger.info(container); if(container instanceof Data) { Data data = (Data) container; data.analyzeFrame(source, new IFrameEventListener() { @Override public void onNewFrame(IFrame frame) { if(frame instanceof AudioFrame) { AudioFrame aFrame = (AudioFrame)frame; // フレームが取得できたので圧縮かけてみる。 try { ByteBuffer orgBuffer = aFrame.getData(); // まず上位2つの一番良く出てくる符号を調べる ByteBuffer targetBuffer = orgBuffer.duplicate(); int[] rank = new int[16]; while(targetBuffer.remaining() > 0) { byte b = targetBuffer.get(); rank[(b >>> 4) & 0x0F] ++; rank[b & 0xF] ++; } int first = 0; int second = 0; for(int i = 0;i < rank.length;i ++) { if(rank[first] < rank[i]) { first = i; } // logger.info(i + ":" + rank[i]); } for(int i = 0;i < rank.length;i ++) { if(i == first) { continue; } if(rank[second] < rank[i]) { second = i; } } // このタイミングでcoderのtableを更新する必要がある。 table[0][0] = first; table[1][0] = second; int j = 2; for(int i = 0;i < 16;i ++) { if(order[i] == first || order[i] == second) { continue; } table[j ++][0] = order[i]; } RangeCoder coder = new RangeCoder(); coder.setupTable(table); // データをいれてセットアップする。 targetBuffer.position(0); // もとに戻す while(targetBuffer.remaining() > 0) { byte b = targetBuffer.get(); coder.encodeData((b >>> 4) & 0x0F); coder.encodeData(b & 0x0F); } ByteBuffer result = coder.getEncodeResult(); logger.info("org:" + orgBuffer.remaining() + " codered:" + result.remaining() + " rate:" + (int)(result.remaining() * 100 / orgBuffer.remaining())); } catch(Exception e) { e.printStackTrace(); } } } }); } } } catch(Exception e) { logger.warn(e); } finally { if(source != null) { try { source.close(); } catch(Exception e) { } source = null; } } }// */ }