Return a raster from a serialized form.
Serialized form is documented in doc/RFC1-SerializedFormat.
NOTE: the raster will contain pointer to the serialized form (including band data), which must be kept alive.
Definition at line 725 of file rt_serialize.c.
725 {
727 const uint8_t *ptr = NULL;
728 const uint8_t *beg = NULL;
729 uint16_t i = 0;
730 uint16_t j = 0;
731#ifdef WORDS_BIGENDIAN
733#else
734 uint8_t littleEndian =
LW_TRUE;
735#endif
736
737 assert(NULL != serialized);
738
740
741
742
743
744
745
746
747 RASTER_DEBUG(3,
"rt_raster_deserialize: Allocating memory for deserialized raster header");
749 if (!rast) {
750 rterror(
"rt_raster_deserialize: Out of memory allocating raster for deserialization");
751 return NULL;
752 }
753
754
755 RASTER_DEBUG(3,
"rt_raster_deserialize: Deserialize raster header");
757
758 if (0 ==
rast->numBands || header_only) {
761 }
762
763 beg = (const uint8_t*) serialized;
764
765
766 RASTER_DEBUG(3,
"rt_raster_deserialize: Allocating memory for bands");
768 if (
rast->bands == NULL) {
769 rterror(
"rt_raster_deserialize: Out of memory allocating bands");
771 return NULL;
772 }
773
775
776
777 ptr = beg;
779
780
781 for (i = 0; i <
rast->numBands; ++i) {
784 int pixbytes = 0;
785
787 if (!band) {
788 rterror(
"rt_raster_deserialize: Out of memory allocating rt_band during deserialization");
791 return NULL;
792 }
793
795
797 ptr++;
799
801
809
810
812 ptr += pixbytes - 1;
813
814
815 switch (
band->pixtype) {
818 break;
819 }
822 break;
823 }
826 break;
827 }
830 break;
831 }
834 break;
835 }
838 break;
839 }
842 break;
843 }
846 break;
847 }
850 break;
851 }
854 break;
855 }
858 break;
859 }
860 default: {
861 rterror(
"rt_raster_deserialize: Unknown pixeltype %d",
band->pixtype);
864 return NULL;
865 }
866 }
867
870
871
872 assert(!((ptr - beg) % pixbytes));
873
875 int pathlen = 0;
876
877
878 band->data.offline.bandNum = *ptr;
879 ptr += 1;
880
881
882 pathlen = strlen((char*) ptr);
883 band->data.offline.path =
rtalloc(
sizeof(
char) * (pathlen + 1));
884 if (
band->data.offline.path == NULL) {
885 rterror(
"rt_raster_deserialize: Could not allocate memory for offline band path");
888 return NULL;
889 }
890
891 memcpy(
band->data.offline.path, ptr, pathlen);
892 band->data.offline.path[pathlen] =
'\0';
893 ptr += pathlen + 1;
894
895 band->data.offline.mem = NULL;
896 }
897 else {
898
899 const uint32_t datasize =
rast->width *
rast->height * pixbytes;
900 band->data.mem = (uint8_t*) ptr;
901 ptr += datasize;
902 }
903
904
905#if POSTGIS_DEBUG_LEVEL > 0
906 const uint8_t *padbeg = ptr;
907#endif
908 while (0 != ((ptr - beg) % 8)) {
909 ++ptr;
910 }
911
912 RASTER_DEBUGF(3,
"rt_raster_deserialize: skip %ld bytes of 8-bytes boundary padding", ptr - padbeg);
913
914
915 assert(!((ptr - beg) % pixbytes));
916 }
917
919}
#define LW_TRUE
Return types for functions with status returns.
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
#define RASTER_DEBUG(level, msg)
#define RASTER_DEBUGF(level, msg,...)
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
const char * rt_pixtype_name(rt_pixtype pixtype)
void rt_band_destroy(rt_band band)
Destroy a raster band.
void rtdealloc(void *mem)
struct rt_raster_t * rt_raster
Types definitions.
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
uint8_t read_uint8(const uint8_t **from)
double read_float64(const uint8_t **from, uint8_t littleEndian)
float read_float32(const uint8_t **from, uint8_t littleEndian)
int8_t read_int8(const uint8_t **from)
int16_t read_int16(const uint8_t **from, uint8_t littleEndian)
int32_t read_int32(const uint8_t **from, uint8_t littleEndian)
uint32_t read_uint32(const uint8_t **from, uint8_t littleEndian)
uint16_t read_uint16(const uint8_t **from, uint8_t littleEndian)
#define BANDTYPE_HAS_NODATA(x)
#define BANDTYPE_IS_OFFDB(x)
#define BANDTYPE_IS_NODATA(x)
#define BANDTYPE_PIXTYPE_MASK
References BANDTYPE_HAS_NODATA, BANDTYPE_IS_NODATA, BANDTYPE_IS_OFFDB, BANDTYPE_PIXTYPE_MASK, LW_FALSE, LW_TRUE, PT_16BSI, PT_16BUI, PT_1BB, PT_2BUI, PT_32BF, PT_32BSI, PT_32BUI, PT_4BUI, PT_64BF, PT_8BSI, PT_8BUI, RASTER_DEBUG, RASTER_DEBUGF, read_float32(), read_float64(), read_int16(), read_int32(), read_int8(), read_uint16(), read_uint32(), read_uint8(), rt_band_destroy(), rt_pixtype_name(), rt_pixtype_size(), rt_raster_destroy(), rtalloc(), rtdealloc(), and rterror().
Referenced by RASTER_addBand(), RASTER_addBandOutDB(), RASTER_addBandRasterArray(), RASTER_asGDALRaster(), RASTER_asHexWKB(), RASTER_asWKB(), RASTER_band(), RASTER_bandIsNoData(), RASTER_bandmetadata(), RASTER_clip(), RASTER_colorMap(), RASTER_contains(), RASTER_containsProperly(), RASTER_Contour(), RASTER_convex_hull(), RASTER_copyBand(), RASTER_coveredby(), RASTER_covers(), RASTER_dfullywithin(), RASTER_dumpAsPolygons(), RASTER_dumpValues(), RASTER_dwithin(), RASTER_envelope(), RASTER_GDALWarp(), RASTER_getBandFileSize(), RASTER_getBandFileTimestamp(), RASTER_getBandNoDataValue(), RASTER_getBandPath(), RASTER_getBandPixelType(), RASTER_getBandPixelTypeName(), RASTER_getGeometryValues(), RASTER_getGeotransform(), RASTER_getHeight(), RASTER_getNumBands(), RASTER_getPixelCentroids(), RASTER_getPixelHeight(), RASTER_getPixelPolygons(), RASTER_getPixelValue(), RASTER_getPixelValueResample(), RASTER_getPixelWidth(), RASTER_getPolygon(), RASTER_getSRID(), RASTER_getWidth(), RASTER_getXScale(), RASTER_getXSkew(), RASTER_getXUpperLeft(), RASTER_getYScale(), RASTER_getYSkew(), RASTER_getYUpperLeft(), RASTER_hasNoBand(), RASTER_histogram(), RASTER_InterpolateRaster(), RASTER_intersectionFractions(), RASTER_intersects(), RASTER_isEmpty(), RASTER_mapAlgebra2(), RASTER_mapAlgebraExpr(), RASTER_mapAlgebraFct(), RASTER_mapAlgebraFctNgb(), RASTER_metadata(), RASTER_nearestValue(), RASTER_neighborhood(), RASTER_nMapAlgebra(), RASTER_noop(), RASTER_notSameAlignmentReason(), RASTER_out(), RASTER_overlaps(), RASTER_pixelOfValue(), RASTER_quantile(), RASTER_rasterToWorldCoord(), RASTER_reclass(), RASTER_reclass_exact(), RASTER_sameAlignment(), RASTER_setBandIsNoData(), RASTER_setBandNoDataValue(), RASTER_setBandPath(), RASTER_setGeotransform(), RASTER_setPixelValue(), RASTER_setPixelValuesArray(), RASTER_setPixelValuesGeomval(), RASTER_setRotation(), RASTER_setScale(), RASTER_setScaleXY(), RASTER_setSkew(), RASTER_setSkewXY(), RASTER_setSRID(), RASTER_setUpperLeftXY(), RASTER_summaryStats(), RASTER_summaryStats_transfn(), RASTER_summaryStatsCoverage(), RASTER_tile(), RASTER_to_bytea(), RASTER_touches(), RASTER_union_transfn(), RASTER_valueCount(), RASTER_valueCountCoverage(), RASTER_worldToRasterCoord(), rtpg_nmapalgebra_rastbandarg_process(), and test_raster_wkb().