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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include "grib2.h"
g2int simunpack(unsigned char *,g2int *, g2int,g2float *);
int comunpack(unsigned char *,g2int,g2int,g2int *,g2int,g2float *);
g2int specunpack(unsigned char *,g2int *,g2int,g2int,g2int, g2int, g2float *);
#ifdef USE_PNG
g2int pngunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
#endif /* USE_PNG */
#ifdef USE_JPEG2000
g2int jpcunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
#endif /* USE_JPEG2000 */
g2int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,g2int *igdstmpl,
g2int idrsnum,g2int *idrstmpl,g2int ndpts,g2float **fld)
//$$$ SUBPROGRAM DOCUMENTATION BLOCK
// . . . .
// SUBPROGRAM: g2_unpack7
// PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-10-31
//
// ABSTRACT: This subroutine unpacks Section 7 (Data Section)
// as defined in GRIB Edition 2.
//
// PROGRAM HISTORY LOG:
// 2002-10-31 Gilbert
// 2002-12-20 Gilbert - Added GDT info to arguments
// and added 5.51 processing.
// 2003-08-29 Gilbert - Added support for new templates using
// PNG and JPEG2000 algorithms/templates.
// 2004-11-29 Gilbert - JPEG2000 now allowed to use WMO Template no. 5.40
// PNG now allowed to use WMO Template no. 5.41
// 2004-12-16 Taylor - Added check on comunpack return code.
// 2008-12-23 Wesley - Initialize Number of data points unpacked
//
// USAGE: int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,
// g2int *igdstmpl, g2int idrsnum,
// g2int *idrstmpl, g2int ndpts,g2float **fld)
// INPUT ARGUMENTS:
// cgrib - char array containing Section 7 of the GRIB2 message
// iofst - Bit offset of the beginning of Section 7 in cgrib.
// igdsnum - Grid Definition Template Number ( see Code Table 3.0)
// ( Only used for DRS Template 5.51 )
// igdstmpl - Pointer to an integer array containing the data values for
// the specified Grid Definition
// Template ( N=igdsnum ). Each element of this integer
// array contains an entry (in the order specified) of Grid
// Definition Template 3.N
// ( Only used for DRS Template 5.51 )
// idrsnum - Data Representation Template Number ( see Code Table 5.0)
// idrstmpl - Pointer to an integer array containing the data values for
// the specified Data Representation
// Template ( N=idrsnum ). Each element of this integer
// array contains an entry (in the order specified) of Data
// Representation Template 5.N
// ndpts - Number of data points unpacked and returned.
//
// OUTPUT ARGUMENTS:
// iofst - Bit offset at the end of Section 7, returned.
// fld - Pointer to a float array containing the unpacked data field.
//
// RETURN VALUES:
// ierr - Error return code.
// 0 = no error
// 2 = Not section 7
// 4 = Unrecognized Data Representation Template
// 5 = need one of GDT 3.50 through 3.53 to decode DRT 5.51
// 6 = memory allocation error
// 7 = corrupt section 7.
//
// REMARKS: None
//
// ATTRIBUTES:
// LANGUAGE: C
// MACHINE:
//
//$$$//
{
g2int ierr,isecnum;
g2int ipos,lensec;
g2float *lfld;
ierr=0;
*fld=0; //NULL
gbit(cgrib,&lensec,*iofst,32); // Get Length of Section
*iofst=*iofst+32;
gbit(cgrib,&isecnum,*iofst,8); // Get Section Number
*iofst=*iofst+8;
if ( isecnum != 7 ) {
ierr=2;
//fprintf(stderr,"g2_unpack7: Not Section 7 data.\n");
return(ierr);
}
ipos=(*iofst/8);
lfld=(g2float *)calloc(ndpts ? ndpts : 1,sizeof(g2float));
if (lfld == 0) {
ierr=6;
return(ierr);
}
else {
*fld=lfld;
}
if (idrsnum == 0)
simunpack(cgrib+ipos,idrstmpl,ndpts,lfld);
else if (idrsnum == 2 || idrsnum == 3) {
if (comunpack(cgrib+ipos,lensec,idrsnum,idrstmpl,ndpts,lfld) != 0) {
return 7;
}
}
else if (idrsnum == 50) { // Spectral Simple
simunpack(cgrib+ipos,idrstmpl,ndpts-1,lfld+1);
rdieee(idrstmpl+4,lfld+0,1);
}
else if (idrsnum == 51) // Spectral complex
if ( igdsnum>=50 && igdsnum <=53 )
specunpack(cgrib+ipos,idrstmpl,ndpts,igdstmpl[0],igdstmpl[2],igdstmpl[2],lfld);
else {
fprintf(stderr,"g2_unpack7: Cannot use GDT 3.%d to unpack Data Section 5.51.\n",(int)igdsnum);
ierr=5;
if ( lfld != 0 ) free(lfld);
*fld=0; //NULL
return(ierr);
}
#ifdef USE_JPEG2000
else if (idrsnum == 40 || idrsnum == 40000) {
jpcunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
}
#endif /* USE_JPEG2000 */
#ifdef USE_PNG
else if (idrsnum == 41 || idrsnum == 40010) {
pngunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
}
#endif /* USE_PNG */
else {
fprintf(stderr,"g2_unpack7: Data Representation Template 5.%d not yet implemented.\n",(int)idrsnum);
ierr=4;
if ( lfld != 0 ) free(lfld);
*fld=0; //NULL
return(ierr);
}
*iofst=*iofst+(8*lensec);
return(ierr); // End of Section 7 processing
}
|