Rust 将 nokhwa::Buffer 解码为预分配的缓冲区

问题描述 投票:0回答:1

我正在尝试使用

Buffer
方法将 Vec<u8>
 类型从 nokhwa
 板条箱解码为预先分配的 
decode_image_to_buffer
。到目前为止,这是我的代码:

use nokhwa::{
    pixel_format::{RgbFormat},
    utils::{
        yuyv422_predicted_size,
    },
    Buffer,
};

// buffer is an instance of the nokhwa::Buffer struct
// frame_buffer is a Vec<u8>

frame_buffer.resize(yuyv422_predicted_size(buffer.buffer().len(), true), 0);
buffer.decode_image_to_buffer::<RgbAFormat>(&mut frame_buffer)
    .unwrap();

此代码在 linux 上完美运行。但是当我尝试在 Windows 上运行时,出现以下错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: 
ProcessFrameError { src: MJPEG, destination: "RGB888",
error: "Bad decoded buffer size" }', src\main.rs:86:75

我不确定,但我认为错误来自

mozjpeg
板条箱。
nokhwa
使用它来实现
decode_image_to_buffer
方法。更具体地说,我认为错误来自this call to the
jpeg_start_decompress
function.

我不知道这是我的代码还是我使用的依赖项中的错误。我走到了死胡同。请帮助。

rust video decoding
1个回答
1
投票

没关系,我解决了这个问题。结果是

nokhwa
yuyv422_predicted_size
函数没有返回缓冲区大小的正确值。为了解决这个问题,我在我的mozjpeg
中添加了
Cargo.toml
作为依赖项:

[dependencies]
mozjpeg = "0.9.4"

并直接用它来执行解码。

use mozjpeg::{Decompress, ColorSpace};

let decompress = Decompress::new_mem(buffer.buffer()).unwrap();

let mut decompress = decompress.rgba().unwrap();

let num_components = match decompress.color_space() {
    ColorSpace::JCS_UNKNOWN => 0,
    ColorSpace::JCS_GRAYSCALE => 1,
    ColorSpace::JCS_RGB => 3,
    ColorSpace::JCS_YCbCr => 3,
    ColorSpace::JCS_CMYK => 4,
    ColorSpace::JCS_YCCK => 4,
    ColorSpace::JCS_EXT_RGB => 3,
    ColorSpace::JCS_EXT_RGBX => 4,
    ColorSpace::JCS_EXT_BGR => 3,
    ColorSpace::JCS_EXT_BGRX => 4,
    ColorSpace::JCS_EXT_XBGR => 4,
    ColorSpace::JCS_EXT_XRGB => 4,
    ColorSpace::JCS_EXT_RGBA => 4,
    ColorSpace::JCS_EXT_BGRA => 4,
    ColorSpace::JCS_EXT_ABGR => 4,
    ColorSpace::JCS_EXT_ARGB => 4,
    ColorSpace::JCS_RGB565 => 3,
};

frame_buffer.resize(decompress.width() * decompress.height() * num_components, 0);

decompress.read_scanlines_flat_into(&mut frame_buffer);

编辑:

更简单。

Decompress
有一个
min_flat_buffer_size
方法。这可用于计算所需的缓冲区大小。即

frame_buffer.resize(decompress.min_flat_buffer_size(), 0);
© www.soinside.com 2019 - 2024. All rights reserved.