Skip to content

Commit

Permalink
fn dav1d_decode_frame_exit: Cleanup and make mostly safe (#422)
Browse files Browse the repository at this point in the history
  • Loading branch information
kkysen authored Aug 30, 2023
2 parents bd9d94f + c8b9237 commit 396d744
Showing 1 changed file with 37 additions and 42 deletions.
79 changes: 37 additions & 42 deletions src/decode.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use std::ptr::{self, addr_of_mut};
use std::sync::atomic::{AtomicI32, Ordering};
use std::ptr;
use std::ptr::addr_of_mut;
use std::slice;
use std::sync::atomic::AtomicI32;
use std::sync::atomic::Ordering;

#[cfg(feature = "bitdepth_16")]
use crate::include::common::bitdepth::BitDepth16;
Expand Down Expand Up @@ -6311,57 +6314,49 @@ pub unsafe extern "C" fn dav1d_decode_frame_main(f: *mut Dav1dFrameContext) -> l
}
return retval;
}

#[no_mangle]
pub unsafe extern "C" fn dav1d_decode_frame_exit(f: *mut Dav1dFrameContext, retval: libc::c_int) {
let c: *const Dav1dContext = (*f).c;
if !((*f).sr_cur.p.data[0]).is_null() {
*&mut (*f).task_thread.error = 0 as libc::c_int;
let f = &mut *f; // TODO(kkysen) propagate to arg once we deduplicate the fn decl
let c = &*f.c;
if !f.sr_cur.p.data[0].is_null() {
f.task_thread.error = 0;
}
if (*c).n_fc > 1 as libc::c_uint && retval != 0 && !((*f).frame_thread.cf).is_null() {
memset(
(*f).frame_thread.cf,
0 as libc::c_int,
((*f).frame_thread.cf_sz as size_t)
.wrapping_mul(128)
.wrapping_mul(128)
.wrapping_div(2),
);
if c.n_fc > 1 && retval != 0 && !f.frame_thread.cf.is_null() {
slice::from_raw_parts_mut(
f.frame_thread.cf.cast::<u8>(),
usize::try_from(f.frame_thread.cf_sz).unwrap() * 128 * 128 / 2,
)
.fill(0);
}
let mut i = 0;
while i < 7 {
if !((*f).refp[i as usize].p.frame_hdr).is_null() {
dav1d_thread_picture_unref(&mut *((*f).refp).as_mut_ptr().offset(i as isize));
// TODO(kkysen) use array::zip when stable
for i in 0..7 {
if !f.refp[i].p.frame_hdr.is_null() {
dav1d_thread_picture_unref(&mut f.refp[i]);
}
dav1d_ref_dec(&mut *((*f).ref_mvs_ref).as_mut_ptr().offset(i as isize));
i += 1;
dav1d_ref_dec(&mut f.ref_mvs_ref[i]);
}
dav1d_picture_unref_internal(&mut (*f).cur);
dav1d_thread_picture_unref(&mut (*f).sr_cur);
dav1d_cdf_thread_unref(&mut (*f).in_cdf);
if !((*f).frame_hdr).is_null() && (*(*f).frame_hdr).refresh_context != 0 {
if !((*f).out_cdf.progress).is_null() {
dav1d_picture_unref_internal(&mut f.cur);
dav1d_thread_picture_unref(&mut f.sr_cur);
dav1d_cdf_thread_unref(&mut f.in_cdf);
if !f.frame_hdr.is_null() && (*f.frame_hdr).refresh_context != 0 {
if !f.out_cdf.progress.is_null() {
::core::intrinsics::atomic_store_seqcst(
(*f).out_cdf.progress,
(if retval == 0 {
1 as libc::c_int
} else {
2147483647 - 1
}) as libc::c_uint,
f.out_cdf.progress,
if retval == 0 { 1 } else { 2147483647 - 1 },
);
}
dav1d_cdf_thread_unref(&mut (*f).out_cdf);
dav1d_cdf_thread_unref(&mut f.out_cdf);
}
dav1d_ref_dec(&mut (*f).cur_segmap_ref);
dav1d_ref_dec(&mut (*f).prev_segmap_ref);
dav1d_ref_dec(&mut (*f).mvs_ref);
dav1d_ref_dec(&mut (*f).seq_hdr_ref);
dav1d_ref_dec(&mut (*f).frame_hdr_ref);
let mut i_0 = 0;
while i_0 < (*f).n_tile_data {
dav1d_data_unref_internal(&mut (*((*f).tile).offset(i_0 as isize)).data);
i_0 += 1;
dav1d_ref_dec(&mut f.cur_segmap_ref);
dav1d_ref_dec(&mut f.prev_segmap_ref);
dav1d_ref_dec(&mut f.mvs_ref);
dav1d_ref_dec(&mut f.seq_hdr_ref);
dav1d_ref_dec(&mut f.frame_hdr_ref);
for tile in slice::from_raw_parts_mut(f.tile, f.n_tile_data.try_into().unwrap()) {
dav1d_data_unref_internal(&mut tile.data);
}
(*f).task_thread.retval = retval;
f.task_thread.retval = retval;
}

pub unsafe fn dav1d_decode_frame(f: &mut Dav1dFrameContext) -> libc::c_int {
Expand Down

0 comments on commit 396d744

Please sign in to comment.