Message ID | mailman.445.1633340916.837.libcamera-devel@lists.libcamera.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Han-Lin Thank you for the patch. On 10/4/21 3:18 PM, Han-Lin Chen via libcamera-devel wrote: > From: hanlinchen<hanlinchen@google.com> > > Change the Macro STDCOPY, MEMCPY_S and CLEAR to its std version to better > suit the style. The patch also fix misusage of STDCOPY as memcpy, which > leads to copying overflown in PA and SA results. Oh yes, I see that now. > > Signed-off-by: Han-Lin Chen<hanlinchen@google.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> > --- > aiq/aiq_input_parameters.cpp | 50 +++++++++----------- > aiq/aiq_results.cpp | 91 +++++++++++++++--------------------- > 2 files changed, 58 insertions(+), 83 deletions(-) > > diff --git a/aiq/aiq_input_parameters.cpp b/aiq/aiq_input_parameters.cpp > index 56301f6..56e8513 100644 > --- a/aiq/aiq_input_parameters.cpp > +++ b/aiq/aiq_input_parameters.cpp > @@ -14,11 +14,6 @@ > > #include <libcamera/base/log.h> > > -/* Macros used by imported code */ > -#define STDCOPY(dst, src, size)std::copy((src), ((src) + (size)), (dst)) > -#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src),std::min((size_t)(dmax), (size_t)(smax))) > -#define CLEAR(x) memset(&(x), 0, sizeof(x)) > - > namespace libcamera { > > LOG_DEFINE_CATEGORY(AIQInputParameters) > @@ -27,26 +22,26 @@ namespaceipa::ipu3::aiq { > > voidAiqInputParameters::init() > { > - CLEAR(aeInputParams); > - CLEAR(afParams); > - CLEAR(afBracketParams); > - CLEAR(awbParams); > - CLEAR(gbceParams); > - CLEAR(paParams); > - CLEAR(saParams); > - CLEAR(sensorDescriptor); > - CLEAR(exposureWindow); > - CLEAR(exposureCoordinate); > - CLEAR(aeFeatures); > - CLEAR(aeManualLimits); > - CLEAR(manualFocusParams); > - CLEAR(focusRect); > - CLEAR(manualCctRange); > - CLEAR(manualWhiteCoordinate); > - CLEAR(awbResults); > - CLEAR(colorGains); > - CLEAR(exposureParams); > - CLEAR(sensorFrameParams); > + memset(&aeInputParams, 0, sizeof(aeInputParams)); > + memset(&afParams, 0, sizeof(afParams)); > + memset(&afBracketParams, 0, sizeof(afBracketParams)); > + memset(&awbParams, 0, sizeof(awbParams)); > + memset(&gbceParams, 0, sizeof(gbceParams)); > + memset(&paParams, 0, sizeof(paParams)); > + memset(&saParams, 0, sizeof(saParams)); > + memset(&sensorDescriptor, 0, sizeof(sensorDescriptor)); > + memset(&exposureWindow, 0, sizeof(exposureWindow)); > + memset(&exposureCoordinate, 0, sizeof(exposureCoordinate)); > + memset(&aeFeatures, 0, sizeof(aeFeatures)); > + memset(&aeManualLimits, 0, sizeof(aeManualLimits)); > + memset(&manualFocusParams, 0, sizeof(manualFocusParams)); > + memset(&focusRect, 0, sizeof(focusRect)); > + memset(&manualCctRange, 0, sizeof(manualCctRange)); > + memset(&manualWhiteCoordinate, 0, sizeof(manualWhiteCoordinate)); > + memset(&awbResults, 0, sizeof(awbResults)); > + memset(&colorGains, 0, sizeof(colorGains)); > + memset(&exposureParams, 0, sizeof(exposureParams)); > + memset(&sensorFrameParams, 0, sizeof(sensorFrameParams)); > aeLock = false; > awbLock = false; > blackLevelLock = false; > @@ -102,10 +97,7 @@ AiqInputParameters &AiqInputParameters::operator=(const AiqInputParameters &othe > if (this == &other) > return *this; > > - MEMCPY_S(this, > - sizeof(AiqInputParameters), > - &other, > - sizeof(AiqInputParameters)); > + memcpy(this, &other, sizeof(AiqInputParameters)); > reset(); > > /* Exposure coordinate is nullptr in other than SPOT mode. */ > diff --git a/aiq/aiq_results.cpp b/aiq/aiq_results.cpp > index 9dda17c..f727f36 100644 > --- a/aiq/aiq_results.cpp > +++ b/aiq/aiq_results.cpp > @@ -14,9 +14,6 @@ > > #include <libcamera/base/log.h> > > -/* Macros used by imported code */ > -#define STDCOPY(dst, src, size)std::copy((src), ((src) + (size)), (dst)) > - > namespace libcamera { > > LOG_DEFINE_CATEGORY(AIQResults) > @@ -111,17 +108,14 @@ voidAiqResults::setAe(ia_aiq_ae_results *ae) > ae->weight_grid->height; > gridElements =std::clamp<unsigned int>(gridElements, 1, MAX_AE_GRID_SIZE); > > - STDCOPY(ae_.weight_grid->weights, > - ae->weight_grid->weights, > - gridElements * sizeof(char)); > + std::copy_n(ae->weight_grid->weights, gridElements, ae_.weight_grid->weights); > } else { > LOG(AIQResults, Error) << "Not copying AE Weight Grids"; > } > > // Copy the flash info structure > if (ae_.flashes && ae->flashes) { > - STDCOPY((int8_t *)ae_.flashes, (int8_t *)ae->flashes, > - NUM_FLASH_LEDS * sizeof(ia_aiq_flash_parameters)); > + std::copy_n(ae->flashes, NUM_FLASH_LEDS, ae_.flashes); > } else { > LOG(AIQResults, Error) << "Not copying AE Flashes"; > } > @@ -172,20 +166,16 @@ voidAiqResults::setGbce(ia_aiq_gbce_results *gbce) > > gbce_.gamma_lut_size = gbce->gamma_lut_size; > > - STDCOPY((int8_t *)gbce_.r_gamma_lut, (int8_t *)gbce->r_gamma_lut, > - gbce->gamma_lut_size * sizeof(float)); > - STDCOPY((int8_t *)gbce_.b_gamma_lut, (int8_t *)gbce->b_gamma_lut, > - gbce->gamma_lut_size * sizeof(float)); > - STDCOPY((int8_t *)gbce_.g_gamma_lut, (int8_t *)gbce->g_gamma_lut, > - gbce->gamma_lut_size * sizeof(float)); > + std::copy_n(gbce->r_gamma_lut, gbce->gamma_lut_size, gbce_.r_gamma_lut); > + std::copy_n(gbce->b_gamma_lut, gbce->gamma_lut_size, gbce_.b_gamma_lut); > + std::copy_n(gbce->g_gamma_lut, gbce->gamma_lut_size, gbce_.g_gamma_lut); > } else { > LOG(AIQResults, Error) << "Not copying Gamma LUT channels"; > } > > if (gbce->tone_map_lut_size > 0) { > gbce_.tone_map_lut_size = gbce->tone_map_lut_size; > - STDCOPY((int8_t *)gbce_.tone_map_lut, (int8_t *)gbce->tone_map_lut, > - gbce->tone_map_lut_size * sizeof(float)); > + std::copy_n(gbce->tone_map_lut, gbce->tone_map_lut_size, gbce_.tone_map_lut); > } else { > LOG(AIQResults, Error) << "Not copying Tone Mapping Gain LUT"; > } > @@ -200,20 +190,20 @@ voidAiqResults::setPa(ia_aiq_pa_results *pa) > { > ASSERT(pa); > > - STDCOPY(&pa_.color_conversion_matrix[0][0], &pa->color_conversion_matrix[0][0], > - MAX_COLOR_CONVERSION_MATRIX * MAX_COLOR_CONVERSION_MATRIX * > - sizeof(pa->color_conversion_matrix[0][0])); > + std::copy_n(&pa->color_conversion_matrix[0][0], > + MAX_COLOR_CONVERSION_MATRIX * MAX_COLOR_CONVERSION_MATRIX, > + &pa_.color_conversion_matrix[0][0]); > > if (pa_.preferred_acm && pa->preferred_acm) { > pa_.preferred_acm->sector_count = pa->preferred_acm->sector_count; > > - STDCOPY(pa_.preferred_acm->hue_of_sectors, > - pa->preferred_acm->hue_of_sectors, > - sizeof(*pa->preferred_acm->hue_of_sectors) * pa->preferred_acm->sector_count); > + std::copy_n(pa->preferred_acm->hue_of_sectors, > + pa->preferred_acm->sector_count, > + pa_.preferred_acm->hue_of_sectors); > > - STDCOPY(pa_.preferred_acm->advanced_color_conversion_matrices[0][0], > - pa->preferred_acm->advanced_color_conversion_matrices[0][0], > - sizeof(*pa->preferred_acm->advanced_color_conversion_matrices) * pa->preferred_acm->sector_count); > + std::copy_n(pa->preferred_acm->advanced_color_conversion_matrices[0][0], > + pa->preferred_acm->sector_count, > + pa_.preferred_acm->advanced_color_conversion_matrices[0][0]); > } else { > LOG(AIQResults, Error) << "Not copying PA hue of sectors"; > } > @@ -222,17 +212,17 @@ voidAiqResults::setPa(ia_aiq_pa_results *pa) > pa_.ir_weight->height = pa->ir_weight->height; > pa_.ir_weight->width = pa->ir_weight->width; > > - STDCOPY(pa_.ir_weight->ir_weight_grid_R, > - pa->ir_weight->ir_weight_grid_R, > - sizeof(*pa->ir_weight->ir_weight_grid_R) * pa->ir_weight->height * pa->ir_weight->width); > + std::copy_n(pa->ir_weight->ir_weight_grid_R, > + pa->ir_weight->height * pa->ir_weight->width, > + pa_.ir_weight->ir_weight_grid_R); > > - STDCOPY(pa_.ir_weight->ir_weight_grid_G, > - pa->ir_weight->ir_weight_grid_G, > - sizeof(*pa->ir_weight->ir_weight_grid_G) * pa->ir_weight->height * pa->ir_weight->width); > + std::copy_n(pa->ir_weight->ir_weight_grid_G, > + pa->ir_weight->height * pa->ir_weight->width, > + pa_.ir_weight->ir_weight_grid_G); > > - STDCOPY(pa_.ir_weight->ir_weight_grid_B, > - pa->ir_weight->ir_weight_grid_B, > - sizeof(*pa->ir_weight->ir_weight_grid_B) * pa->ir_weight->height * pa->ir_weight->width); > + std::copy_n(pa->ir_weight->ir_weight_grid_B, > + pa->ir_weight->height * pa->ir_weight->width, > + pa_.ir_weight->ir_weight_grid_B); > } else { > LOG(AIQResults, Error) << "Not copying IR weight"; > } > @@ -253,13 +243,13 @@ voidAiqResults::setSa(ia_aiq_sa_results *sa) > sa_.height = sa->height; > sa_.lsc_update = sa->lsc_update; > > + uint32_t lscGridSize = sa_.width * sa_.height; > /* Check against one of the vectors but resize applicable to all. */ > - if (channelGr_.size() < (sa_.width * sa_.height)) { > - int lscNewSize = sa_.width * sa_.height; > - channelGr_.resize(lscNewSize); > - channelGb_.resize(lscNewSize); > - channelR_.resize(lscNewSize); > - channelB_.resize(lscNewSize); > + if (channelGr_.size() < lscGridSize) { > + channelGr_.resize(lscGridSize); > + channelGb_.resize(lscGridSize); > + channelR_.resize(lscGridSize); > + channelB_.resize(lscGridSize); > > /* Update the SA data pointers to new memory locations. */ > sa_.channel_gr = channelGr_.data(); > @@ -269,23 +259,16 @@ voidAiqResults::setSa(ia_aiq_sa_results *sa) > } > > if (sa->lsc_update) { > - uint32_t memCopySize = sa->width * sa->height * sizeof(float); > - > - STDCOPY((int8_t *)sa_.channel_gr, (int8_t *)sa->channel_gb, > - memCopySize); > - STDCOPY((int8_t *)sa_.channel_gb, (int8_t *)sa->channel_gr, > - memCopySize); > - STDCOPY((int8_t *)sa_.channel_r, (int8_t *)sa->channel_r, > - memCopySize); > - STDCOPY((int8_t *)sa_.channel_b, (int8_t *)sa->channel_b, > - memCopySize); > + std::copy_n(sa->channel_gr, lscGridSize, sa_.channel_gr); > + std::copy_n(sa->channel_gb, lscGridSize, sa_.channel_gb); > + std::copy_n(sa->channel_r, lscGridSize, sa_.channel_r); > + std::copy_n(sa->channel_b, lscGridSize, sa_.channel_b); > } else { > - LOG(AIQResults, Error) << "Not copying LSC tables."; > + LOG(AIQResults, Debug) << "Not copying LSC tables."; > } > > - STDCOPY(&sa_.light_source[0], > - &sa->light_source[0], > - CMC_NUM_LIGHTSOURCES * sizeof(sa->light_source[0])); > + std::copy_n(&sa->light_source[0], CMC_NUM_LIGHTSOURCES, &sa_.light_source[0]); > + > sa_.scene_difficulty = sa->scene_difficulty; > sa_.num_patches = sa->num_patches; > sa_.covered_area = sa->covered_area; > -- 2.33.0.800.g4c38ced690-goog
diff --git a/aiq/aiq_input_parameters.cpp b/aiq/aiq_input_parameters.cpp index 56301f6..56e8513 100644 --- a/aiq/aiq_input_parameters.cpp +++ b/aiq/aiq_input_parameters.cpp @@ -14,11 +14,6 @@ #include <libcamera/base/log.h> -/* Macros used by imported code */ -#define STDCOPY(dst, src, size) std::copy((src), ((src) + (size)), (dst)) -#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), std::min((size_t)(dmax), (size_t)(smax))) -#define CLEAR(x) memset(&(x), 0, sizeof(x)) - namespace libcamera { LOG_DEFINE_CATEGORY(AIQInputParameters) @@ -27,26 +22,26 @@ namespace ipa::ipu3::aiq { void AiqInputParameters::init() { - CLEAR(aeInputParams); - CLEAR(afParams); - CLEAR(afBracketParams); - CLEAR(awbParams); - CLEAR(gbceParams); - CLEAR(paParams); - CLEAR(saParams); - CLEAR(sensorDescriptor); - CLEAR(exposureWindow); - CLEAR(exposureCoordinate); - CLEAR(aeFeatures); - CLEAR(aeManualLimits); - CLEAR(manualFocusParams); - CLEAR(focusRect); - CLEAR(manualCctRange); - CLEAR(manualWhiteCoordinate); - CLEAR(awbResults); - CLEAR(colorGains); - CLEAR(exposureParams); - CLEAR(sensorFrameParams); + memset(&aeInputParams, 0, sizeof(aeInputParams)); + memset(&afParams, 0, sizeof(afParams)); + memset(&afBracketParams, 0, sizeof(afBracketParams)); + memset(&awbParams, 0, sizeof(awbParams)); + memset(&gbceParams, 0, sizeof(gbceParams)); + memset(&paParams, 0, sizeof(paParams)); + memset(&saParams, 0, sizeof(saParams)); + memset(&sensorDescriptor, 0, sizeof(sensorDescriptor)); + memset(&exposureWindow, 0, sizeof(exposureWindow)); + memset(&exposureCoordinate, 0, sizeof(exposureCoordinate)); + memset(&aeFeatures, 0, sizeof(aeFeatures)); + memset(&aeManualLimits, 0, sizeof(aeManualLimits)); + memset(&manualFocusParams, 0, sizeof(manualFocusParams)); + memset(&focusRect, 0, sizeof(focusRect)); + memset(&manualCctRange, 0, sizeof(manualCctRange)); + memset(&manualWhiteCoordinate, 0, sizeof(manualWhiteCoordinate)); + memset(&awbResults, 0, sizeof(awbResults)); + memset(&colorGains, 0, sizeof(colorGains)); + memset(&exposureParams, 0, sizeof(exposureParams)); + memset(&sensorFrameParams, 0, sizeof(sensorFrameParams)); aeLock = false; awbLock = false; blackLevelLock = false; @@ -102,10 +97,7 @@ AiqInputParameters &AiqInputParameters::operator=(const AiqInputParameters &othe if (this == &other) return *this; - MEMCPY_S(this, - sizeof(AiqInputParameters), - &other, - sizeof(AiqInputParameters)); + memcpy(this, &other, sizeof(AiqInputParameters)); reset(); /* Exposure coordinate is nullptr in other than SPOT mode. */ diff --git a/aiq/aiq_results.cpp b/aiq/aiq_results.cpp index 9dda17c..f727f36 100644 --- a/aiq/aiq_results.cpp +++ b/aiq/aiq_results.cpp @@ -14,9 +14,6 @@ #include <libcamera/base/log.h> -/* Macros used by imported code */ -#define STDCOPY(dst, src, size) std::copy((src), ((src) + (size)), (dst)) - namespace libcamera { LOG_DEFINE_CATEGORY(AIQResults) @@ -111,17 +108,14 @@ void AiqResults::setAe(ia_aiq_ae_results *ae) ae->weight_grid->height; gridElements = std::clamp<unsigned int>(gridElements, 1, MAX_AE_GRID_SIZE); - STDCOPY(ae_.weight_grid->weights, - ae->weight_grid->weights, - gridElements * sizeof(char)); + std::copy_n(ae->weight_grid->weights, gridElements, ae_.weight_grid->weights); } else { LOG(AIQResults, Error) << "Not copying AE Weight Grids"; } // Copy the flash info structure if (ae_.flashes && ae->flashes) { - STDCOPY((int8_t *)ae_.flashes, (int8_t *)ae->flashes, - NUM_FLASH_LEDS * sizeof(ia_aiq_flash_parameters)); + std::copy_n(ae->flashes, NUM_FLASH_LEDS, ae_.flashes); } else { LOG(AIQResults, Error) << "Not copying AE Flashes"; } @@ -172,20 +166,16 @@ void AiqResults::setGbce(ia_aiq_gbce_results *gbce) gbce_.gamma_lut_size = gbce->gamma_lut_size; - STDCOPY((int8_t *)gbce_.r_gamma_lut, (int8_t *)gbce->r_gamma_lut, - gbce->gamma_lut_size * sizeof(float)); - STDCOPY((int8_t *)gbce_.b_gamma_lut, (int8_t *)gbce->b_gamma_lut, - gbce->gamma_lut_size * sizeof(float)); - STDCOPY((int8_t *)gbce_.g_gamma_lut, (int8_t *)gbce->g_gamma_lut, - gbce->gamma_lut_size * sizeof(float)); + std::copy_n(gbce->r_gamma_lut, gbce->gamma_lut_size, gbce_.r_gamma_lut); + std::copy_n(gbce->b_gamma_lut, gbce->gamma_lut_size, gbce_.b_gamma_lut); + std::copy_n(gbce->g_gamma_lut, gbce->gamma_lut_size, gbce_.g_gamma_lut); } else { LOG(AIQResults, Error) << "Not copying Gamma LUT channels"; } if (gbce->tone_map_lut_size > 0) { gbce_.tone_map_lut_size = gbce->tone_map_lut_size; - STDCOPY((int8_t *)gbce_.tone_map_lut, (int8_t *)gbce->tone_map_lut, - gbce->tone_map_lut_size * sizeof(float)); + std::copy_n(gbce->tone_map_lut, gbce->tone_map_lut_size, gbce_.tone_map_lut); } else { LOG(AIQResults, Error) << "Not copying Tone Mapping Gain LUT"; } @@ -200,20 +190,20 @@ void AiqResults::setPa(ia_aiq_pa_results *pa) { ASSERT(pa); - STDCOPY(&pa_.color_conversion_matrix[0][0], &pa->color_conversion_matrix[0][0], - MAX_COLOR_CONVERSION_MATRIX * MAX_COLOR_CONVERSION_MATRIX * - sizeof(pa->color_conversion_matrix[0][0])); + std::copy_n(&pa->color_conversion_matrix[0][0], + MAX_COLOR_CONVERSION_MATRIX * MAX_COLOR_CONVERSION_MATRIX, + &pa_.color_conversion_matrix[0][0]); if (pa_.preferred_acm && pa->preferred_acm) { pa_.preferred_acm->sector_count = pa->preferred_acm->sector_count; - STDCOPY(pa_.preferred_acm->hue_of_sectors, - pa->preferred_acm->hue_of_sectors, - sizeof(*pa->preferred_acm->hue_of_sectors) * pa->preferred_acm->sector_count); + std::copy_n(pa->preferred_acm->hue_of_sectors, + pa->preferred_acm->sector_count, + pa_.preferred_acm->hue_of_sectors); - STDCOPY(pa_.preferred_acm->advanced_color_conversion_matrices[0][0], - pa->preferred_acm->advanced_color_conversion_matrices[0][0], - sizeof(*pa->preferred_acm->advanced_color_conversion_matrices) * pa->preferred_acm->sector_count); + std::copy_n(pa->preferred_acm->advanced_color_conversion_matrices[0][0], + pa->preferred_acm->sector_count, + pa_.preferred_acm->advanced_color_conversion_matrices[0][0]); } else { LOG(AIQResults, Error) << "Not copying PA hue of sectors"; } @@ -222,17 +212,17 @@ void AiqResults::setPa(ia_aiq_pa_results *pa) pa_.ir_weight->height = pa->ir_weight->height; pa_.ir_weight->width = pa->ir_weight->width; - STDCOPY(pa_.ir_weight->ir_weight_grid_R, - pa->ir_weight->ir_weight_grid_R, - sizeof(*pa->ir_weight->ir_weight_grid_R) * pa->ir_weight->height * pa->ir_weight->width); + std::copy_n(pa->ir_weight->ir_weight_grid_R, + pa->ir_weight->height * pa->ir_weight->width, + pa_.ir_weight->ir_weight_grid_R); - STDCOPY(pa_.ir_weight->ir_weight_grid_G, - pa->ir_weight->ir_weight_grid_G, - sizeof(*pa->ir_weight->ir_weight_grid_G) * pa->ir_weight->height * pa->ir_weight->width); + std::copy_n(pa->ir_weight->ir_weight_grid_G, + pa->ir_weight->height * pa->ir_weight->width, + pa_.ir_weight->ir_weight_grid_G); - STDCOPY(pa_.ir_weight->ir_weight_grid_B, - pa->ir_weight->ir_weight_grid_B, - sizeof(*pa->ir_weight->ir_weight_grid_B) * pa->ir_weight->height * pa->ir_weight->width); + std::copy_n(pa->ir_weight->ir_weight_grid_B, + pa->ir_weight->height * pa->ir_weight->width, + pa_.ir_weight->ir_weight_grid_B); } else { LOG(AIQResults, Error) << "Not copying IR weight"; } @@ -253,13 +243,13 @@ void AiqResults::setSa(ia_aiq_sa_results *sa) sa_.height = sa->height; sa_.lsc_update = sa->lsc_update; + uint32_t lscGridSize = sa_.width * sa_.height; /* Check against one of the vectors but resize applicable to all. */ - if (channelGr_.size() < (sa_.width * sa_.height)) { - int lscNewSize = sa_.width * sa_.height; - channelGr_.resize(lscNewSize); - channelGb_.resize(lscNewSize); - channelR_.resize(lscNewSize); - channelB_.resize(lscNewSize); + if (channelGr_.size() < lscGridSize) { + channelGr_.resize(lscGridSize); + channelGb_.resize(lscGridSize); + channelR_.resize(lscGridSize); + channelB_.resize(lscGridSize); /* Update the SA data pointers to new memory locations. */ sa_.channel_gr = channelGr_.data(); @@ -269,23 +259,16 @@ void AiqResults::setSa(ia_aiq_sa_results *sa) } if (sa->lsc_update) { - uint32_t memCopySize = sa->width * sa->height * sizeof(float); - - STDCOPY((int8_t *)sa_.channel_gr, (int8_t *)sa->channel_gb, - memCopySize); - STDCOPY((int8_t *)sa_.channel_gb, (int8_t *)sa->channel_gr, - memCopySize); - STDCOPY((int8_t *)sa_.channel_r, (int8_t *)sa->channel_r, - memCopySize); - STDCOPY((int8_t *)sa_.channel_b, (int8_t *)sa->channel_b, - memCopySize); + std::copy_n(sa->channel_gr, lscGridSize, sa_.channel_gr); + std::copy_n(sa->channel_gb, lscGridSize, sa_.channel_gb); + std::copy_n(sa->channel_r, lscGridSize, sa_.channel_r); + std::copy_n(sa->channel_b, lscGridSize, sa_.channel_b); } else { - LOG(AIQResults, Error) << "Not copying LSC tables."; + LOG(AIQResults, Debug) << "Not copying LSC tables."; } - STDCOPY(&sa_.light_source[0], - &sa->light_source[0], - CMC_NUM_LIGHTSOURCES * sizeof(sa->light_source[0])); + std::copy_n(&sa->light_source[0], CMC_NUM_LIGHTSOURCES, &sa_.light_source[0]); + sa_.scene_difficulty = sa->scene_difficulty; sa_.num_patches = sa->num_patches; sa_.covered_area = sa->covered_area;