static XCamReturn read_buf (SmartPtr<DrmBoBuffer> &buf, TestFileHandle &file) { const VideoBufferInfo info = buf->get_video_info (); VideoBufferPlanarInfo planar; uint8_t *memory = NULL; XCamReturn ret = XCAM_RETURN_NO_ERROR; memory = buf->map (); for (uint32_t index = 0; index < info.components; index++) { info.get_planar_info (planar, index); uint32_t line_bytes = planar.width * planar.pixel_bytes; for (uint32_t i = 0; i < planar.height; i++) { if (fread (memory + info.offsets [index] + i * info.strides [index], 1, line_bytes, file.fp) != line_bytes) { if (feof (file.fp)) ret = XCAM_RETURN_BYPASS; else { XCAM_LOG_ERROR ("read file failed, size doesn't match"); ret = XCAM_RETURN_ERROR_FILE; } } } } buf->unmap (); return ret; }
XCamReturn FakePollThread::read_buf (SmartPtr<DrmBoBuffer> &buf) { uint8_t *dst = buf->map (); const VideoBufferInfo info = buf->get_video_info (); VideoBufferPlanarInfo planar; XCamReturn ret = XCAM_RETURN_NO_ERROR; for (uint32_t index = 0; index < info.components; index++) { info.get_planar_info(planar, index); uint32_t line_bytes = planar.width * planar.pixel_bytes; for (uint32_t i = 0; i < planar.height; i++) { if (fread (dst + info.offsets [index] + i * info.strides [index], 1, line_bytes, _raw) < line_bytes) { if (feof (_raw)) { fseek (_raw, 0, SEEK_SET); ret = XCAM_RETURN_BYPASS; } else { XCAM_LOG_ERROR ("poll_buffer_loop failed to read file"); ret = XCAM_RETURN_ERROR_FILE; } goto done; } } } done: buf->unmap (); return ret; }
static XCamReturn calculate_psnr (SmartPtr<DrmBoBuffer> &psnr_cur, SmartPtr<DrmBoBuffer> &psnr_ref, PsnrType psnr_type, float &psnr) { const VideoBufferInfo info = psnr_cur->get_video_info (); VideoBufferPlanarInfo planar; uint8_t *cur_mem = NULL, *ref_mem = NULL; XCamReturn ret = XCAM_RETURN_NO_ERROR; int8_t interval = 1, index = 0; if (PSNRY == psnr_type) { interval = 1; index = 0; } else if (PSNRR == psnr_type) { interval = 4; index = 0; } else if (PSNRG == psnr_type) { interval = 4; index = 1; } else if (PSNRB == psnr_type) { interval = 4; index = 2; } cur_mem = psnr_cur->map (); ref_mem = psnr_ref->map (); if (!cur_mem || !ref_mem) { XCAM_LOG_ERROR ("calculate_psnr map buffer failed"); return XCAM_RETURN_ERROR_MEM; } uint32_t sum = 0, pos = 0; info.get_planar_info (planar, 0); for (uint32_t i = 0; i < planar.height; i++) { for (uint32_t j = 0; j < planar.width / interval; j++) { pos = i * planar.width + j * interval + index; sum += (cur_mem [pos] - ref_mem [pos]) * (cur_mem [pos] - ref_mem [pos]); } } float mse = (float) sum / (planar.height * planar.width / interval) + 0.000001f; psnr = 10 * log10 (255 * 255 / mse); psnr_cur->unmap (); psnr_ref->unmap (); return ret; }