Fix a bug that prevented copying the decoded image into the output buffer when the output buffer is larger than the input image (#122)

* Fix a bug that prevented copying the decoded image into the output buffer when the output buffer is larger than the input image

* add check for a valid roi_width
This commit is contained in:
Aryan Salmanpour
2025-02-20 20:33:54 -05:00
zatwierdzone przez GitHub
rodzic 3876cdc088
commit e074cb2f9b
3 zmienionych plików z 73 dodań i 2 usunięć
+6
Wyświetl plik
@@ -3,6 +3,12 @@
Documentation for rocJPEG is available at
[https://rocm.docs.amd.com/projects/rocJPEG/en/latest/](https://rocm.docs.amd.com/projects/rocJPEG/en/latest/)
## rocJPEG 0.9.0 (Unreleased)
### Resolved issues
* Fixed a bug that prevented copying the decoded image into the output buffer when the output buffer is larger than the input image.
## rocJPEG 0.8.0 for ROCm 6.4
### Changed
+1 -1
Wyświetl plik
@@ -34,7 +34,7 @@ THE SOFTWARE.
extern "C" {
#endif
#define ROCJPEG_MAJOR_VERSION 0
#define ROCJPEG_MINOR_VERSION 8
#define ROCJPEG_MINOR_VERSION 9
#define ROCJPEG_MICRO_VERSION 0
+66 -1
Wyświetl plik
@@ -388,12 +388,77 @@ RocJpegStatus RocJpegDecoder::CopyChannel(HipInteropDeviceMem& hip_interop_dev_m
}
roi_offset = top * hip_interop_dev_mem.pitch[channel_index] + left;
}
uint32_t channel_widths[ROCJPEG_MAX_COMPONENT] = {};
uint32_t roi_width = decode_params->crop_rectangle.right - decode_params->crop_rectangle.left;
bool is_roi_width_valid = roi_width > 0 && roi_width <= hip_interop_dev_mem.width;
switch (decode_params->output_format) {
case ROCJPEG_OUTPUT_NATIVE:
switch (hip_interop_dev_mem.surface_format) {
case VA_FOURCC_444P:
channel_widths[2] = channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case VA_FOURCC_422V:
channel_widths[2] = channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case VA_FOURCC_YUY2:
channel_widths[0] = (is_roi_width_valid ? roi_width : hip_interop_dev_mem.width) * 2;
break;
case VA_FOURCC_NV12:
channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case VA_FOURCC_Y800:
channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
default:
ERR("Unknown output format!");
return ROCJPEG_STATUS_INVALID_PARAMETER;
}
break;
case ROCJPEG_OUTPUT_YUV_PLANAR:
switch (hip_interop_dev_mem.surface_format) {
case VA_FOURCC_444P:
channel_widths[2] = channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case VA_FOURCC_422V:
channel_widths[2] = channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case VA_FOURCC_YUY2:
channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
channel_widths[2] = channel_widths[1] = channel_widths[0] >> 1;
break;
case VA_FOURCC_NV12:
channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
channel_widths[2] = channel_widths[1] = channel_widths[0] >> 1;
break;
case VA_FOURCC_Y800:
channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
default:
ERR("Unknown output format!");
return ROCJPEG_STATUS_INVALID_PARAMETER;
}
break;
case ROCJPEG_OUTPUT_Y:
channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
case ROCJPEG_OUTPUT_RGB:
channel_widths[0] = (is_roi_width_valid ? roi_width : hip_interop_dev_mem.width) * 3;
break;
case ROCJPEG_OUTPUT_RGB_PLANAR:
channel_widths[2] = channel_widths[1] = channel_widths[0] = is_roi_width_valid ? roi_width : hip_interop_dev_mem.width;
break;
default:
ERR("Unknown output format!");
return ROCJPEG_STATUS_INVALID_PARAMETER;
}
if (destination->pitch[channel_index] == hip_interop_dev_mem.pitch[channel_index]) {
uint32_t channel_size = destination->pitch[channel_index] * channel_height;
CHECK_HIP(hipMemcpyDtoDAsync(destination->channel[channel_index], hip_interop_dev_mem.hip_mapped_device_mem + hip_interop_dev_mem.offset[channel_index] + roi_offset, channel_size, hip_stream_));
} else {
CHECK_HIP(hipMemcpy2DAsync(destination->channel[channel_index], destination->pitch[channel_index], hip_interop_dev_mem.hip_mapped_device_mem + hip_interop_dev_mem.offset[channel_index] + roi_offset, hip_interop_dev_mem.pitch[channel_index],
destination->pitch[channel_index], channel_height, hipMemcpyDeviceToDevice, hip_stream_));
channel_widths[channel_index], channel_height, hipMemcpyDeviceToDevice, hip_stream_));
}
}
return ROCJPEG_STATUS_SUCCESS;