void FloorCurveDecode( Mapping mapping ) { for( int i = 0; i < channels; i++ ) { int submapNum = mapping.mux[i]; int floorNum = mapping.submapFloor[submapNum]; Floor floor = floorConfigs[floorNum]; noResidue[i] = (bool)floor.ReadPerPacketData( this, bitReader, null ); } // nonezero vector propagate for( int i = 0; i < mapping.couplingSteps; i++ ) { if( !noResidue[mapping.magnitude[i]] || !noResidue[mapping.angle[i]] ) { noResidue[mapping.magnitude[i]] = false; noResidue[mapping.angle[i]] = false; } } }
void ReadMappingsSetup( int count ) { mappingConfigs = new Mapping[count]; for( int i = 0; i < mappingConfigs.Length; i++ ) { int mappingType = bitReader.ReadBits( 16 ); Mapping mapping = null; if( mappingType == 0 ) { mapping = new Mapping(); } else { throw new InvalidDataException( "Invalid mapping type: " + mappingType ); } mapping.ReadSetupData( this, bitReader ); mappingConfigs[i] = mapping; } }
void ResidueDecode( Mapping mapping ) { for( int i = 0; i < mapping.submaps; i++ ) { int ch = 0; for( int j = 0; j < channels; j++ ) { if( mapping.mux[j] == i ) { doNotDecode[ch] = noResidue[j]; ch++; } } int residueNum = mapping.submapResidue[i]; residueArgs.ch = ch; residueArgs.doNotDecode = doNotDecode; residueConfigs[residueNum].ReadPerPacketData( this, bitReader, residueArgs ); ch = 0; for( int j = 0; j < channels; j++ ) { // TODO: spec seems to suggest <=, look into if( mapping.mux[j] == i ) { // TODO: residue_vector[j] = decoded_residue_vector[ch]; ch++; } } } }
void InverseCoupling( Mapping mapping ) { // TODO: inverse coupling for( int i = mapping.couplingSteps - 1; i >= 0; i-- ) { } }