1.1.0版本
This commit is contained in:
85
UniTAP/utils/uicl_api.py
Normal file
85
UniTAP/utils/uicl_api.py
Normal file
@@ -0,0 +1,85 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user