void CvArrTest::get_timing_test_array_types_and_sizes( int /*test_case_idx*/, CvSize** sizes, int** types, CvSize** whole_sizes, bool *are_images ) { const CvFileNode* size_node = find_timing_param( "size" ); const CvFileNode* depth_node = find_timing_param( "depth" ); const CvFileNode* channels_node = find_timing_param( "channels" ); int i, j; int depth = 0, channels = 1; CvSize size = {1,1}, whole_size = size; if( size_node && CV_NODE_IS_SEQ(size_node->tag) ) { CvSeq* seq = size_node->data.seq; size.width = cvReadInt((const CvFileNode*)cvGetSeqElem(seq,0), 1); size.height = cvReadInt((const CvFileNode*)cvGetSeqElem(seq,1), 1); whole_size = size; if( seq->total > 2 ) { whole_size.width = cvReadInt((const CvFileNode*)cvGetSeqElem(seq,2), 1); whole_size.height = cvReadInt((const CvFileNode*)cvGetSeqElem(seq,3), 1); whole_size.width = MAX( whole_size.width, size.width ); whole_size.height = MAX( whole_size.height, size.height ); } } if( depth_node && CV_NODE_IS_STRING(depth_node->tag) ) { depth = cvTsTypeByName( depth_node->data.str.ptr ); if( depth < 0 || depth > CV_64F ) depth = 0; } if( channels_node && CV_NODE_IS_INT(channels_node->tag) ) { channels = cvReadInt( channels_node, 1 ); if( channels < 0 || channels > CV_CN_MAX ) channels = 1; } for( i = 0; i < max_arr; i++ ) { int count = test_array[i].size(); for( j = 0; j < count; j++ ) { sizes[i][j] = size; whole_sizes[i][j] = whole_size; if( i != MASK ) types[i][j] = CV_MAKETYPE(depth,channels); else types[i][j] = CV_8UC1; if( i == REF_OUTPUT || i == REF_INPUT_OUTPUT ) sizes[i][j] = cvSize(0,0); } } if( are_images ) *are_images = false; // by default CvMat is used in performance tests }
CV_IMPL void cvReadRawDataSlice( const CvFileStorage* fs, CvSeqReader* reader, int len, void* _data, const char* dt ) { char* data0 = (char*)_data; int fmt_pairs[CV_FS_MAX_FMT_PAIRS*2], k = 0, fmt_pair_count; int i = 0, count = 0; CV_CHECK_FILE_STORAGE( fs ); if( !reader || !data0 ) CV_Error( CV_StsNullPtr, "Null pointer to reader or destination array" ); if( !reader->seq && len != 1 ) CV_Error( CV_StsBadSize, "The readed sequence is a scalar, thus len must be 1" ); fmt_pair_count = icvDecodeFormat( dt, fmt_pairs, CV_FS_MAX_FMT_PAIRS ); size_t step = ::icvCalcStructSize(dt, 0); for(;;) { int offset = 0; for( k = 0; k < fmt_pair_count; k++ ) { int elem_type = fmt_pairs[k*2+1]; int elem_size = CV_ELEM_SIZE(elem_type); char* data; count = fmt_pairs[k*2]; offset = cvAlign( offset, elem_size ); data = data0 + offset; for( i = 0; i < count; i++ ) { CvFileNode* node = (CvFileNode*)reader->ptr; if( CV_NODE_IS_INT(node->tag) ) { int ival = node->data.i; switch( elem_type ) { case CV_8U: *(uchar*)data = cv::saturate_cast<uchar>(ival); data++; break; case CV_8S: *(char*)data = cv::saturate_cast<schar>(ival); data++; break; case CV_16U: *(ushort*)data = cv::saturate_cast<ushort>(ival); data += sizeof(ushort); break; case CV_16S: *(short*)data = cv::saturate_cast<short>(ival); data += sizeof(short); break; case CV_32S: *(int*)data = ival; data += sizeof(int); break; case CV_32F: *(float*)data = (float)ival; data += sizeof(float); break; case CV_64F: *(double*)data = (double)ival; data += sizeof(double); break; case CV_USRTYPE1: /* reference */ *(size_t*)data = ival; data += sizeof(size_t); break; default: CV_Error( CV_StsUnsupportedFormat, "Unsupported type" ); return; } } else if( CV_NODE_IS_REAL(node->tag) ) { double fval = node->data.f; int ival; switch( elem_type ) { case CV_8U: ival = cvRound(fval); *(uchar*)data = cv::saturate_cast<uchar>(ival); data++; break; case CV_8S: ival = cvRound(fval); *(char*)data = cv::saturate_cast<schar>(ival); data++; break; case CV_16U: ival = cvRound(fval); *(ushort*)data = cv::saturate_cast<ushort>(ival); data += sizeof(ushort); break; case CV_16S: ival = cvRound(fval); *(short*)data = cv::saturate_cast<short>(ival); data += sizeof(short); break; case CV_32S: ival = cvRound(fval); *(int*)data = ival; data += sizeof(int); break; case CV_32F: *(float*)data = (float)fval; data += sizeof(float); break; case CV_64F: *(double*)data = fval; data += sizeof(double); break; case CV_USRTYPE1: /* reference */ ival = cvRound(fval); *(size_t*)data = ival; data += sizeof(size_t); break; default: CV_Error( CV_StsUnsupportedFormat, "Unsupported type" ); return; } } else CV_Error( CV_StsError, "The sequence element is not a numerical scalar" ); CV_NEXT_SEQ_ELEM( sizeof(CvFileNode), *reader ); if( !--len ) goto end_loop; } offset = (int)(data - data0); } data0 += step; } end_loop: if( i != count - 1 || k != fmt_pair_count - 1 ) CV_Error( CV_StsBadSize, "The sequence slice does not fit an integer number of records" ); if( !reader->seq ) reader->ptr -= sizeof(CvFileNode); }