MCPcopy Create free account
hub / github.com/Recordscript/recordscript / decode

Method decode

libs/scrap/src/common/mediacodec.rs:53–135  ·  view source on GitHub ↗

rgb [in/out] fmt and stride must be set in ImageRgb

(&mut self, data: &[u8], rgb: &mut ImageRgb)

Source from the content-addressed store, hash-verified

51
52 // rgb [in/out] fmt and stride must be set in ImageRgb
53 pub fn decode(&mut self, data: &[u8], rgb: &mut ImageRgb) -> ResultType<bool> {
54 // take dst_stride into account please
55 let dst_stride = rgb.stride();
56 match self.dequeue_input_buffer(Duration::from_millis(10))? {
57 Some(mut input_buffer) => {
58 let mut buf = input_buffer.buffer_mut();
59 if data.len() > buf.len() {
60 log::error!("Failed to decode, the input data size is bigger than input buf");
61 bail!("The input data size is bigger than input buf");
62 }
63 buf.write_all(&data)?;
64 self.queue_input_buffer(input_buffer, 0, data.len(), 0, 0)?;
65 }
66 None => {
67 log::debug!("Failed to dequeue_input_buffer: No available input_buffer");
68 }
69 };
70
71 return match self.dequeue_output_buffer(Duration::from_millis(100))? {
72 Some(output_buffer) => {
73 let res_format = self.output_format();
74 let w = res_format
75 .i32("width")
76 .ok_or(Error::msg("Failed to dequeue_output_buffer, width is None"))?
77 as usize;
78 let h = res_format.i32("height").ok_or(Error::msg(
79 "Failed to dequeue_output_buffer, height is None",
80 ))? as usize;
81 let stride = res_format.i32("stride").ok_or(Error::msg(
82 "Failed to dequeue_output_buffer, stride is None",
83 ))?;
84 let buf = output_buffer.buffer();
85 let bps = 4;
86 let u = buf.len() * 2 / 3;
87 let v = buf.len() * 5 / 6;
88 rgb.raw.resize(h * w * bps, 0);
89 let y_ptr = buf.as_ptr();
90 let u_ptr = buf[u..].as_ptr();
91 let v_ptr = buf[v..].as_ptr();
92 unsafe {
93 match rgb.fmt() {
94 ImageFormat::ARGB => {
95 I420ToARGB(
96 y_ptr,
97 stride,
98 u_ptr,
99 stride / 2,
100 v_ptr,
101 stride / 2,
102 rgb.raw.as_mut_ptr(),
103 (w * bps) as _,
104 w as _,
105 h as _,
106 );
107 }
108 ImageFormat::ARGB => {
109 I420ToABGR(
110 y_ptr,

Callers

nothing calls this directly

Calls 2

strideMethod · 0.45
fmtMethod · 0.45

Tested by

no test coverage detected