File: MarkerSegmentSOS.java

package info (click to toggle)
pixelmed-codec 20141206-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 268 kB
  • ctags: 329
  • sloc: java: 1,270; makefile: 164
file content (68 lines) | stat: -rw-r--r-- 3,414 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* Copyright (c) 2014, David A. Clunie DBA Pixelmed Publishing. All rights reserved. */

package com.pixelmed.codec.jpeg;

/**
 * <p>A JPEG SOS Marker Segment.</p>
 *
 * @author	dclunie
 */
public class MarkerSegmentSOS {

	private static final String identString = "@(#) $Header: /userland/cvs/codec/com/pixelmed/codec/jpeg/MarkerSegmentSOS.java,v 1.2 2014/03/22 09:06:13 dclunie Exp $";
	
	private int nComponentsPerScan;
	private int[] ScanComponentSelector;
	private int[] DCEntropyCodingTableSelector;
	private int[] ACEntropyCodingTableSelector;
	private int[] MappingTableSelector;			// LS
	private int StartOfSpectralOrPredictorSelection;
	private int EndOfSpectralSelection;
	private int SuccessiveApproximationBitPositionHigh;
	private int SuccessiveApproximationBitPositionLowOrPointTransform;
	
	public int   getNComponentsPerScan() { return nComponentsPerScan; }
	public int[] getDCEntropyCodingTableSelector() { return DCEntropyCodingTableSelector; }
	public int[] getACEntropyCodingTableSelector() { return ACEntropyCodingTableSelector; }

	public MarkerSegmentSOS(byte[] b,int length) throws Exception {
		nComponentsPerScan=Utilities.extract8(b,0);
		int lengthExpected = 1+nComponentsPerScan*2+3;
		 if (length != lengthExpected) {
			throw new Exception("Incorrect length of SOS Parameters Marker Segment, expected "+lengthExpected+" (based on nComponentsPerScan "+nComponentsPerScan+") but was "+length);
		}
		ScanComponentSelector       =new int[nComponentsPerScan];
		DCEntropyCodingTableSelector=new int[nComponentsPerScan];
		ACEntropyCodingTableSelector=new int[nComponentsPerScan];
		MappingTableSelector        =new int[nComponentsPerScan];	// LS
		for (int i=0; i<nComponentsPerScan; ++i) {
			ScanComponentSelector[i]       =Utilities.extract8(b,1+i*2);
			DCEntropyCodingTableSelector[i]=Utilities.extract8(b,1+i*2+1) >> 4;
			ACEntropyCodingTableSelector[i]=Utilities.extract8(b,1+i*2+1) & 0x0f;
			MappingTableSelector[i]        =Utilities.extract8(b,1+i*2+1);	// LS
		}
		StartOfSpectralOrPredictorSelection                  =Utilities.extract8(b,1+nComponentsPerScan*2);
		EndOfSpectralSelection                               =Utilities.extract8(b,1+nComponentsPerScan*2+1);
		SuccessiveApproximationBitPositionHigh               =Utilities.extract8(b,1+nComponentsPerScan*2+2) >> 4;
		SuccessiveApproximationBitPositionLowOrPointTransform=Utilities.extract8(b,1+nComponentsPerScan*2+2) & 0x0f;
	}

	public String toString() {
		StringBuffer buf = new StringBuffer();
		buf.append("\n\tSOS:\n");
		buf.append("\t\t nComponentsPerScan = "+nComponentsPerScan+"\n");
		for (int i=0; i<nComponentsPerScan; ++i) {
			buf.append("\t\t component "+i+"\n");
			buf.append("\t\t\t ScanComponentSelector = "+ScanComponentSelector[i]+"\n");
			buf.append("\t\t\t DCEntropyCodingTableSelector = "+DCEntropyCodingTableSelector[i]+"\n");
			buf.append("\t\t\t ACEntropyCodingTableSelector = "+ACEntropyCodingTableSelector[i]+"\n");
			buf.append("\t\t\t MappingTableSelector(LS) = "+MappingTableSelector[i]+"\n");	// LS
		}
		buf.append("\t\t StartOfSpectralOrPredictorSelection/NearLosslessDifferenceBound(LS) = "+StartOfSpectralOrPredictorSelection+"\n");
		buf.append("\t\t EndOfSpectralSelection/InterleaveMode(LS) = "+EndOfSpectralSelection+"\n");
		buf.append("\t\t SuccessiveApproximationBitPositionHigh = "+SuccessiveApproximationBitPositionHigh+"\n");
		return buf.toString();
	}

}