Files

86 lines
3.7 KiB
Python
Raw Permalink Normal View History

2026-04-16 16:51:05 +08:00
import os.path
import subprocess
from typing import Union
from UniTAP.libs.lib_uicl.uicl_utils import *
from .dscl_api import *
def image_file_format_to_uicl_format(file_format):
if file_format == ImageFileFormat.IFF_PPM:
return UICL_ImageFileFormat.FILE_FORMAT_PPM
elif file_format == ImageFileFormat.IFF_BIN:
return UICL_ImageFileFormat.FILE_FORMAT_BIN
elif file_format == ImageFileFormat.IFF_BMP:
return UICL_ImageFileFormat.FILE_FORMAT_BMP
else:
raise TypeError(f"Incorrect file format: {file_format}")
def video_frame_to_rgb8(src_video_frame: VideoFrame, data_info: DataInfo) -> VideoFrame:
rgb8_color_info = ColorInfo()
rgb8_color_info.color_format = ColorInfo.ColorFormat.CF_RGB
rgb8_color_info.bpc = 8
rgb8_color_info.dynamic_range = ColorInfo.DynamicRange.DR_VESA
return video_frame_to_ci(src_video_frame, rgb8_color_info, data_info)
def video_frame_to_ci(src_video_frame: VideoFrame, color_info: ColorInfo, data_info: DataInfo) -> VideoFrame:
src_image = image_from_vf(src_video_frame)
dst_image_params = image_params_from_size_and_ci(src_video_frame.width, src_video_frame.height,
color_info, data_info)
if dst_image_params.Alignment != UICL_Alignment.Alignment_LSB:
src_image = image_convert_to_parameters(src_image, dst_image_params)
dst_image_params.Alignment = UICL_Alignment.Alignment_LSB
return image_to_vf(image_convert_to_parameters(src_image, dst_image_params))
def video_frame_uicl_image(src_video_frame: VideoFrame, color_info: ColorInfo, data_info: DataInfo) -> UICL_Image:
src_image = image_from_vf(src_video_frame)
dst_image_params = image_params_from_size_and_ci(src_video_frame.width, src_video_frame.height,
color_info, data_info)
if dst_image_params.Alignment != UICL_Alignment.Alignment_LSB:
src_image = image_convert_to_parameters(src_image, dst_image_params)
dst_image_params.Alignment = UICL_Alignment.Alignment_LSB
return image_convert_to_parameters(src_image, dst_image_params)
def video_frame_save_to_file(video_frame: Union[VideoFrame, VideoFrameDSC], path: str, file_type: ImageFileFormat) -> bool:
if file_type == ImageFileFormat.IFF_DSC:
with open(path, "wb") as dsc_file:
if b'DSCF' not in video_frame.data:
dsc_file.write(b'DSCF')
dsc_file.write(video_frame.data)
return os.path.exists(path)
else:
if b'DSCF' not in video_frame.data:
if video_frame.data_info.component_order == DataInfo.ComponentOrder.CO_UCDRX:
data_info = DataInfo()
color_info = ColorInfo()
data_info.component_order = DataInfo.ComponentOrder.CO_RGB
data_info.alignment = DataInfo.Alignment.A_LSB
data_info.packing = DataInfo.Packing.P_PACKED
color_info.color_format = ColorInfo.ColorFormat.CF_RGB
color_info.bpc = 8
color_info.dynamic_range = ColorInfo.DynamicRange.DR_VESA
frame = video_frame_uicl_image(video_frame, color_info, data_info)
else:
frame = image_from_vf(video_frame)
return image_save_to_file(frame, path, image_file_format_to_uicl_format(file_type))
else:
vf = decode_video_frame(video_frame)
frame = image_from_vf(vf)
return image_save_to_file(frame, path, image_file_format_to_uicl_format(file_type))
def calculate_crc(video_frame: VideoFrame) -> tuple:
if not isinstance(video_frame, VideoFrame):
raise TypeError("Calculate crc accept only VideoFrame object!")
return uicl_image_calculate_crc(video_frame)