private static void ProcessSlice(StartOfImage startOfImage, int slice, int samples, BitmapData data, DataBuf pp) { var startOfFrame = startOfImage.StartOfFrame; var scanLines = startOfFrame.ScanLines; var memory = new DataBuf[2]; // 0x4000 for (var line = 0; line < scanLines; line++) // 0..1728 { // 6 bytes * 8 bits == 48 bits per pixel // 3 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]); var scan0 = data.Scan0 + data.Stride * line + slice * samples * 3; // read four shorts, for two pixels for (var col = 0; col < samples / 4; col++) // 0..216 ==> 0/6 .. 2592/6 --> 0 .. 432 { cc += 4; var diff = new DiffBuf { Y1 = startOfImage.ProcessColor(0x00), Y2 = startOfImage.ProcessColor(0x00), Cb = startOfImage.ProcessColor(0x01), Cr = startOfImage.ProcessColor(0x01) }; if (line % 6 == 0 && col == 0) { pp.Y = (ushort)(pp.Y + diff.Y1); pp.Cb += diff.Cb; pp.Cr += diff.Cr; memory[0].Y = pp.Y; memory[0].Cb = pp.Cb; memory[0].Cr = pp.Cr; pp.Y = (ushort)(pp.Y + diff.Y2); memory[1].Y = pp.Y; memory[1].Cb = pp.Cb; memory[1].Cr = pp.Cr; } else { memory[0].Y = (ushort)(memory[0].Y + diff.Y1); memory[0].Cb = (short)(memory[0].Cb + diff.Cb); memory[0].Cr = (short)(memory[0].Cr + diff.Cr); memory[1].Y = (ushort)(memory[1].Y + diff.Y2); memory[1].Cb = memory[0].Cb; memory[1].Cr = memory[0].Cr; } PokePixels(scan0, col, memory[0], memory[1]); } } }
public DiffBuf[] ReadDiffRow() { int samplesPerLine = StartOfFrame.SamplesPerLine; var diff = new DiffBuf[samplesPerLine / 2]; // 1296 for (var x = 0; x < samplesPerLine / 2; x++) // 1296 { diff[x].Y1 = ProcessColor(0x00); diff[x].Y2 = ProcessColor(0x00); diff[x].Cb = ProcessColor(0x01); diff[x].Cr = ProcessColor(0x01); } return(diff); }
private static DiffBuf[] ReadDiffBufs(int samplesPerLine, StartOfImage startOfImage) { var table0 = startOfImage.HuffmanTable.Tables[0x00]; var table1 = startOfImage.HuffmanTable.Tables[0x01]; var diff = new DiffBuf[samplesPerLine / 4]; // 864 / 4 == 216 for (var x = 0; x < diff.Length; x++) { diff[x].Y1 = startOfImage.ProcessColor(0x00); diff[x].Y2 = startOfImage.ProcessColor(0x00); diff[x].Cb = startOfImage.ProcessColor(0x01); diff[x].Cr = startOfImage.ProcessColor(0x01); cc += 4; } return(diff); }
private static DiffBuf[] ReadDiffRow(StartOfImage startOfImage) { var startOfFrame = startOfImage.StartOfFrame; int samplesPerLine = startOfFrame.SamplesPerLine; var diff = new DiffBuf[samplesPerLine / 4]; // 648 for (var x = 0; x < samplesPerLine / 4; x++) // 0..648 { diff[x].Y1 = startOfImage.ProcessColor(0x00); diff[x].Y2 = startOfImage.ProcessColor(0x00); diff[x].Y3 = startOfImage.ProcessColor(0x00); diff[x].Y4 = startOfImage.ProcessColor(0x00); diff[x].Cb = startOfImage.ProcessColor(0x01); diff[x].Cr = startOfImage.ProcessColor(0x01); cc += 4; } return(diff); }
private static DiffBuf[] ReadDiffRow(StartOfImage startOfImage) { var startOfFrame = startOfImage.StartOfFrame; int samplesPerLine = startOfFrame.SamplesPerLine; var table0 = startOfImage.HuffmanTable.Tables[0x00]; var table1 = startOfImage.HuffmanTable.Tables[0x01]; var diff = new DiffBuf[samplesPerLine / 2]; // 1296 for (var x = 0; x < samplesPerLine / 2; x++) // 1296 { diff[x].Y1 = startOfImage.ProcessColor(0x00); diff[x].Y2 = startOfImage.ProcessColor(0x00); diff[x].Cb = startOfImage.ProcessColor(0x01); diff[x].Cr = startOfImage.ProcessColor(0x01); cc += 4; } return(diff); }
private static void ProcessSlice(StartOfImage startOfImage, int slice, int width, BitmapData data, ushort[] pp) { var startOfFrame = startOfImage.StartOfFrame; var scanLines = startOfFrame.ScanLines; var memory = new ushort[2]; for (var line = 0; line < scanLines; line++) { // 6 bytes * 8 bits == 48 bits per pixel // 3 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]); var scan0 = data.Scan0 + data.Stride * line + slice * width * 6; // read two shorts, for two pixels for (var col = 0; col < width / 2; col++) { var diff = new DiffBuf { Y1 = startOfImage.ProcessColor(0x00), Y2 = startOfImage.ProcessColor(0x01), }; cc += 2; if (line % 2 == 0 && col == 0) { pp[0] = (ushort)(pp[0] + diff.Y1); memory[0] = pp[0]; pp[1] = (ushort)(pp[1] + diff.Y2); memory[1] = pp[1]; } else { memory[0] = (ushort)(memory[0] + diff.Y1); memory[1] = (ushort)(memory[1] + diff.Y2); } if (line % 2 == 0) { var pixel0 = new DataBuf { R = memory[0] }; var pixel1 = new DataBuf { G = memory[1] }; PokePixels(scan0, col, pixel0, pixel1); } else { var pixel0 = new DataBuf { G = memory[0] }; var pixel1 = new DataBuf { B = memory[1] }; PokePixels(scan0, col, pixel0, pixel1); } } } }
private static void ProcessSlice(StartOfImage startOfImage, int slice, int samples, BitmapData data) { var startOfFrame = startOfImage.StartOfFrame; var table0 = startOfImage.HuffmanTable.Tables[0x00]; var table1 = startOfImage.HuffmanTable.Tables[0x01]; var lastRow = new DataBuf { Y = 0x0000 }; // 0x4000 for (var line = 0; line < startOfFrame.ScanLines; line += 2) // 0..2592 { // 6 bytes * 8 bits == 48 bits per pixel // 2 = 6 bytes * samplesPerLine / (slices[0] * slices[1] + slices[2]); var scan0 = data.Scan0 + data.Stride * line + slice * samples * 2; var scan1 = data.Scan0 + data.Stride * (line + 1) + slice * samples * 2; // read six shorts, for four pixels for (var col = 0; col < samples / 6; col++) // 0..1296 { cc += 6; var diff = new DiffBuf { Y1 = startOfImage.ProcessColor(0x00), Y2 = startOfImage.ProcessColor(0x00), Y3 = startOfImage.ProcessColor(0x00), Y4 = startOfImage.ProcessColor(0x00), Cb = startOfImage.ProcessColor(0x01), Cr = startOfImage.ProcessColor(0x01), }; var pixel0 = new DataBuf { Y = (ushort)(lastRow.Y + diff.Y1), Cb = (short)(lastRow.Cb + diff.Cb), Cr = (short)(lastRow.Cr + diff.Cr) }; var pixel1 = new DataBuf { Y = (ushort)(lastRow.Y + diff.Y1 + diff.Y2), Cb = (short)(lastRow.Cb + diff.Cb), Cr = (short)(lastRow.Cr + diff.Cr) }; var pixel2 = new DataBuf { Y = (ushort)(lastRow.Y + diff.Y1 + diff.Y2 + diff.Y3), Cb = (short)(lastRow.Cb + diff.Cb), Cr = (short)(lastRow.Cr + diff.Cr) }; var pixel3 = new DataBuf { Y = (ushort)(lastRow.Y + diff.Y1 + diff.Y2 + diff.Y3 + diff.Y4), Cb = (short)(lastRow.Cb + diff.Cb), Cr = (short)(lastRow.Cr + diff.Cr) }; PokePixels(scan0, scan1, col, pixel0, pixel1, pixel2, pixel3); } } }