public void LoadTest() { var pmf = new Pmf(); //Pmf.Load(File.OpenRead("../../../TestInput/test.pmf")); //Pmf.Load(File.OpenRead("../../../TestInput/sample.pmf")); pmf.Load(File.OpenRead("c:/isos/psp/op.pmf")); //Console.WriteLine(Pmf.InfoHeader.ToStringDefault()); //Assert.Equal(0x800, Pmf.Header.StreamOffset); //Assert.Equal(137216, Pmf.Header.StreamSize); //Assert.Equal(144, Pmf.InfoHeader.Width); //Assert.Equal(80, Pmf.InfoHeader.Height); var mpegPs = pmf.GetMpegPs(); // ReSharper disable once UnusedVariable var pmfWidth = pmf.InfoHeader.Width; // ReSharper disable once UnusedVariable var pmfHeight = pmf.InfoHeader.Height; var videoOutStream = new ProduceConsumerBufferStream(); var audioOutStream = new ProduceConsumerBufferStream(); try { while (mpegPs.HasMorePackets) { var packet = mpegPs.ReadPacketizedElementaryStreamHeader(); var info = mpegPs.ParsePacketizedStream(packet.Stream); if (packet.Type == MpegPsDemuxer.ChunkType.ST_Video1) { info.Stream.CopyToFast(videoOutStream); } if (packet.Type == MpegPsDemuxer.ChunkType.ST_Private1) { //Console.WriteLine(Info.dts); //Info var channel = info.Stream.ReadByte(); info.Stream.Skip(3); if (channel >= 0xB0 && channel <= 0xBF) { info.Stream.Skip(1); } //Info.Stream.Skip(8); info.Stream.CopyToFast(audioOutStream); } //if (VideoOutStream.Length >= 1 * 1024 * 1024) break; //Console.WriteLine(Packet.Type); } } catch (EndOfStreamException) { } var at3Data = audioOutStream.ReadAll(); File.WriteAllBytes(@"c:\isos\psp\out\audio.raw", at3Data); fixed(byte *at3DataPtr = at3Data) { var at3Ptr = at3DataPtr; // ReSharper disable once UnusedVariable var at3End = &at3DataPtr[at3Data.Length]; var maiAt3PlusFrameDecoder = new MaiAt3PlusFrameDecoder(); var frame = 0; for (int n = 0; n < 1000; n++, frame++) { var frameSize = (*(UshortBe *)&at3Ptr[2] & 0x3FF) * 8 + 8; at3Ptr += 8; //Console.WriteLine(FrameSize); var channels = 0; short[] samplesData; File.WriteAllBytes(@"c:\isos\psp\out\samples" + frame + ".in", new MemoryStream().WriteBytes(PointerUtils.PointerToByteArray(at3Ptr, frameSize)).ToArray()); Console.WriteLine("{0}, {1}, {2}", 0, channels, frameSize); // ReSharper disable once UnusedVariable var Out = maiAt3PlusFrameDecoder.DecodeFrame(at3Ptr, frameSize, out channels, out samplesData); //Console.WriteLine("{0}, {1}, {2}", Out, channels, FrameSize); File.WriteAllBytes(@"c:\isos\psp\out\samples" + frame + ".out", new MemoryStream().WriteStructVector(samplesData).ToArray()); at3Ptr += frameSize; } } /* * return; * * //FileUtils.CreateAndAppendStream(@"c:/isos/psp/out/opening.h264", VideoOutStream.Slice()); * //FileUtils.CreateAndAppendStream(@"c:/isos/psp/out/opening.at3", AudioOutStream.Slice()); * * //return; * // * //VideoOutStream.Slice().CopyToFile(@"c:/isos/psp/opening.h264"); * //AudioOutStream.Slice().CopyToFile(@"c:/isos/psp/opening.at3"); * // * * //var AudioDecoder = new At3pFrameDecoder(AudioOutStream.Slice()); * //FrameNumber = 0; * //while (AudioDecoder.HasMorePackets) * //{ * // var AudioFrame = AudioDecoder.DecodeFrame(); * // var Stream = new MemoryStream(); * // Stream.WriteStructVector(AudioFrame); * // File.WriteAllBytes(@"c:\isos\psp\samples" + (FrameNumber++) + ".raw", Stream.ToArray()); * // //Console.WriteLine(AudioFrame); * //} * * //var Data = AudioOutStream2.ReadBytes((int)2048); * //int BlockSize = Data.Length; * //short[] buf; * //int channels; * //fixed (byte* DataPtr = Data) * //{ * // int Decoded = MaiAT3PlusFrameDecoder.decodeFrame(DataPtr, BlockSize, out channels, out buf); * // Console.WriteLine("[1] : {0} : {1} : {2}", channels, BlockSize, Decoded); * //} * * * //return; * * var sample5Reference = new Bitmap(Image.FromFile("../../../TestInput/sample_5.png")); * * var frameDecoder = new H264FrameDecoder(videoOutStream); * frameNumber = 0; * while (frameDecoder.HasMorePackets) * { * var frame = frameDecoder.DecodeFrame(); * //Console.WriteLine(Frame.imageWidth); * //Console.WriteLine(Frame.imageWidthWOEdge); * //Console.WriteLine(Frame.imageHeight); * //Console.WriteLine(Frame.imageHeightWOEdge); * if (frameNumber <= 70) * { * if (frameNumber == 70) * { * var sample5Output = FrameUtils.imageFromFrameWithoutEdges(frame, pmfWidth, pmfHeight); * sample5Output.Save(@"c:\isos\psp\out\frame_" + (frameNumber) + ".png"); * var compareResult = BitmapUtils.CompareBitmaps(sample5Reference, sample5Output); * } * } * else * { * break; * } * frameNumber++; * } */ }
public static int Play(Stream stream, Stream outStream) { var strt = stream.ReadString(3); stream.Position = 0; ushort bztmp; if (strt == "ea3") { //we get ea3 header Console.WriteLine("ea3 header\n"); stream.Position = 0x6; var tmp = stream.ReadBytes(4); var skipbytes = 0; for (var a0 = 0; a0 < 4; a0++) { skipbytes <<= 7; skipbytes += tmp[a0] & 0x7F; } stream.Skip(skipbytes); } if (strt == "RIF") //RIFF { //we get RIFF header Console.WriteLine("RIFF header\n"); stream.Position = 0x10; var fmtSize = stream.ReadStruct <int>(); var fmt = stream.ReadStruct <ushort>(); if (fmt != 0xFFFE) { Console.WriteLine("RIFF File fmt error\n"); return(-1); } stream.Skip(0x28); bztmp = stream.ReadStruct <UshortBe>(); stream.Skip(fmtSize - 0x2c); //search the data chunk for (var a0 = 0; a0 < 0x100; a0++) { if (stream.ReadString(4) == "atad") { break; } } // ReSharper disable once UnusedVariable var tmpr = stream.ReadStruct <int>(); } else { //EA3 block that contains at3+ stream Console.WriteLine("EA3 header"); stream.Skip(0x22); Console.WriteLine("{0:X}", stream.Position); bztmp = stream.ReadStruct <UshortBe>(); stream.Skip(0x3c); } var blocksz = bztmp & 0x3FF; var buf0 = new byte[0x3000]; var chns = 0; fixed(byte *buf0Ptr = buf0) { //calculate the frame block size here var blockSize = blocksz * 8 + 8; Console.WriteLine("frame_block_size 0x{0:X}\n", blockSize); //Console.ReadKey(); //so we make a new at3+ frame decoder var d2 = new MaiAt3PlusFrameDecoder(); stream.Read(buf0, 0, blockSize); short[] pBuf; int rs; //decode the first frame and get channel num //for (int n = 0; n < block_size; n++) Console.Write(buf0[n]); if ((rs = d2.DecodeFrame(buf0Ptr, blockSize, out chns, out pBuf)) != 0) { Console.WriteLine("decode error {0}", rs); } Console.WriteLine("channels: {0}\n", chns); if (chns > 2) { Console.WriteLine("warning: waveout doesn't support {0} chns\n", chns); } //just waveout //MaiWaveOutI *mwo0 = new MaiWaveOutI(chns, 44100, 16); //mwo0.play(); while (!stream.Eof()) { stream.Read(buf0, 0, blockSize); //decode frame and get sample data if ((rs = d2.DecodeFrame(buf0Ptr, blockSize, out chns, out pBuf)) != 0) { Console.WriteLine("decode error {0}", rs); } //play it outStream.WriteStructVector(pBuf, 0x800 * chns); //mwo0.enqueue((Mai_I8*)p_buf, 0x800 * chns * 2); } //while (mwo0.getRemainBufSize()) Mai_Sleep(1); return(0); } }
protected override void InitProtected() { this.MaiAT3PlusFrameDecoder = new MaiAt3PlusFrameDecoder(); }