📄 dcttce.c
字号:
max_coefficient_bits); if (return_value == 1) { QccErrorAddMessage("(QccWAVdcttceEncode): Error calling QccWAVdcttceIPPass()"); goto Error; } else { if (return_value == 2) goto Finished; } return_value = QccWAVdcttceSPass(&image_subband_pyramid, significance_map, threshold, model, output_buffer, max_coefficient_bits); if (return_value == 1) { QccErrorAddMessage("(QccWAVdcttceEncode): Error calling QccWAVdcttceSPass()"); goto Error; } else { if (return_value == 2) goto Finished; } threshold /= 2.0; } else while (threshold > 0.75) { return_value = QccWAVdcttceNZNPass(&image_subband_pyramid, significance_map, sign_array, threshold, p_estimation, subband_significance, model, output_buffer, max_coefficient_bits); if (return_value == 1) { QccErrorAddMessage("(QccWAVdcttceEncode): Error calling QccWAVdcttceNZNPass()"); goto Error; } else { if (return_value == 2) goto Finished; } return_value = QccWAVdcttceIPPass(&image_subband_pyramid, significance_map, sign_array, threshold, p_estimation, subband_significance, model, output_buffer, max_coefficient_bits); if (return_value == 1) { QccErrorAddMessage("(QccWAVdcttceEncode): Error calling QccWAVdcttceIPPass()"); goto Error; } else { if (return_value == 2) goto Finished; } return_value = QccWAVdcttceSPass(&image_subband_pyramid, significance_map, threshold, model, output_buffer, max_coefficient_bits); if (return_value == 1) { QccErrorAddMessage("(QccWAVdcttceEncode): Error calling QccWAVdcttceSPass()"); goto Error; } else { if (return_value == 2) goto Finished; } bitplane_cnt++; threshold /= 2.0; } QccENTArithmeticEncodeFlush(model, output_buffer); Finished: return_value = 0; goto Return; Error: return_value = 1; Return: QccENTArithmeticFreeModel(model); QccWAVSubbandPyramidFree(&image_subband_pyramid); if (sign_array != NULL) { for (row = 0; row < image->num_rows; row++) if (sign_array[row] != NULL) QccFree(sign_array[row]); QccFree(sign_array); } if (significance_map != NULL) { for (row = 0; row < image->num_rows; row++) if (significance_map[row] != NULL) QccFree(significance_map[row]); QccFree(significance_map); } if (p_estimation != NULL) { for (row = 0; row < image->num_rows; row++) if (p_estimation[row] != NULL) QccFree(p_estimation[row]); QccFree(p_estimation); } if (subband_significance != NULL) QccFree(subband_significance); if (max_coefficient_bits != NULL) QccFree(max_coefficient_bits); return(return_value);}static int QccWAVdcttceDecodeInverseDCT(QccWAVSubbandPyramid *image_subband_pyramid, char **sign_array, QccIMGImageComponent *image, double image_mean, double stepsize, int overlap_sample, double smooth_factor){ int return_value; int row, col; int m, n; int num_subbands,subband; int subband_origin_row; int subband_origin_col; int subband_num_rows; int subband_num_cols; int num_levels; QccMatrixInt dctrow_array = NULL; int block_size; num_subbands = QccWAVSubbandPyramidNumLevelsToNumSubbands(image_subband_pyramid->num_levels); if (stepsize > 0) for (subband = 0; subband < num_subbands; subband++) { if (QccWAVSubbandPyramidSubbandSize(image_subband_pyramid, subband, &subband_num_rows, &subband_num_cols)) { QccErrorAddMessage("(QccWAVdcttceDecodeInverseDCT): Error calling QccWAVSubbandPyramidSubbandSize()"); goto Error; } if (QccWAVSubbandPyramidSubbandOffsets(image_subband_pyramid, subband, &subband_origin_row, &subband_origin_col)) { QccErrorAddMessage("(QccWAVdcttceDecodeInverseDCT): Error calling QccWAVSubbandPyramidSubbandOffsets()"); goto Error; } for (row = 0; row < subband_num_rows; row++) for (col = 0; col < subband_num_cols; col++) { if (sign_array[subband_origin_row + row] [subband_origin_col + col]) image_subband_pyramid->matrix [subband_origin_row + row][subband_origin_col + col] *= -1; image_subband_pyramid->matrix [subband_origin_row + row][subband_origin_col + col] *= stepsize; } } else { for (row = 0; row < image_subband_pyramid->num_rows; row++) for (col = 0; col < image_subband_pyramid->num_cols; col++) if (sign_array[row][col]) image_subband_pyramid->matrix[row][col] *= -1; } if ((dctrow_array = QccMatrixIntAlloc(image->num_rows, image->num_cols)) == NULL) { QccErrorAddMessage("(QccWAVdcttceDecodeInverseDCT): Error calling QccMatrixIntAlloc()"); goto Error; } num_levels = image_subband_pyramid->num_levels; block_size = (1 << num_levels); if (QccWAVdcttceCreateDCTSubbandMatrix(dctrow_array, num_levels, block_size, image->num_rows)) { QccErrorAddMessage("(QccWAVdcttceDecodeInverseDCT): Error calling QccDCT2SubnandMatrix()"); goto Error; } for (m = 0; m < image->num_rows; m++) for (n = 0; n < image->num_cols; n++) image->image[dctrow_array[m][n]][dctrow_array[n][m]] = image_subband_pyramid->matrix[m][n]; if (QccIMGImageComponentInverseLBT(image, image, overlap_sample, block_size, smooth_factor)) { QccErrorAddMessage("(QccWAVTarpDecodeInverseDCT): Error calling QccIMGImageComponentInverseLBT()"); goto Error; } if (QccIMGImageComponentAddMean(image, image_mean)) { QccErrorAddMessage("(QccWAVTarpDecodeInverseDCT): Error calling QccWAVSubbandPyramidAddMean()"); goto Error; } if (QccIMGImageComponentSetMaxMin(image)) { QccErrorAddMessage("(QccWAVdcttceDecodeInverseDCT): Error calling QccIMGImageComponentSetMaxMin()"); goto Error; } return_value = 0; goto Return; Error: return_value = 1; Return: QccMatrixIntFree(dctrow_array, image->num_rows); return(return_value);}int QccWAVdcttceDecodeHeader(QccBitBuffer *input_buffer, int *num_levels, int *num_rows, int *num_cols, double *image_mean, double *stepsize, int *max_coefficient_bits, int *overlap_sample, double *smooth_factor){ int return_value; unsigned char ch; if (QccBitBufferGetChar(input_buffer, &ch)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferPuChar()"); goto Error; } *num_levels = (int)ch; if (QccBitBufferGetInt(input_buffer, num_rows)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetInt()"); goto Error; } if (QccBitBufferGetInt(input_buffer, num_cols)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetInt()"); goto Error; } if (QccBitBufferGetDouble(input_buffer, image_mean)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetDouble()"); goto Error; } if (QccBitBufferGetDouble(input_buffer, stepsize)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetDouble()"); goto Error; } if (QccBitBufferGetInt(input_buffer, max_coefficient_bits)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetChar()"); goto Error; } if (QccBitBufferGetInt(input_buffer, overlap_sample)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetChar()"); goto Error; } if (QccBitBufferGetDouble(input_buffer, smooth_factor)) { QccErrorAddMessage("(QccWAVdcttceDecodeHeader): Error calling QccBitBufferGetDouble()"); goto Error; } return_value = 0; goto Return; Error: return_value = 1; Return: return(return_value);}int QccWAVdcttceDecode(QccBitBuffer *input_buffer, QccIMGImageComponent *image, int num_levels, double image_mean, double stepsize, int max_coefficient_bits, int target_bit_cnt, int overlap_sample, double smooth_factor){ int return_value; QccENTArithmeticModel *model = NULL; QccWAVSubbandPyramid image_subband_pyramid; char **sign_array = NULL; char **significance_map = NULL; double **p_estimation = NULL; int *max_bits = NULL; double *subband_significance = NULL; double threshold; int row, col; int num_symbols[1] = { 2 }; int num_subbands; int bitplane_cnt = 0; if (image == NULL) return(0); if (input_buffer == NULL) return(0); num_subbands = QccWAVSubbandPyramidNumLevelsToNumSubbands(num_levels); if ((max_bits = (int *)malloc(sizeof(int) * num_subbands)) == NULL) { QccErrorAddMessage("(QccWAVdcttceDecode): Error allocating memory"); goto Error; } if (QccWAVdcttceDecodeBitPlaneInfo(input_buffer, num_subbands, max_bits, max_coefficient_bits)) { QccErrorAddMessage("(QccWAVdcttceDecode): Error calling QccWAVdcttceEncodeBitPlaneInfo()"); goto Error; } QccWAVSubbandPyramidInitialize(&image_subband_pyramid); image_subband_pyramid.num_levels = num_levels; image_subband_pyramid.num_rows = image->num_rows; image_subband_pyramid.num_cols = image->num_c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -