diff --git a/include/dav1d/headers.rs b/include/dav1d/headers.rs index 944e2ff61..24a50d502 100644 --- a/include/dav1d/headers.rs +++ b/include/dav1d/headers.rs @@ -424,6 +424,7 @@ impl From for Dav1dMasteringDisplay { } } +#[derive(Clone)] #[repr(C)] pub struct Dav1dITUTT35 { pub country_code: u8, @@ -432,6 +433,7 @@ pub struct Dav1dITUTT35 { pub payload: *mut u8, } +#[derive(Clone)] #[repr(C)] pub(crate) struct Rav1dITUTT35 { pub country_code: u8, diff --git a/include/dav1d/picture.rs b/include/dav1d/picture.rs index 7231f12f6..7185011a8 100644 --- a/include/dav1d/picture.rs +++ b/include/dav1d/picture.rs @@ -9,6 +9,7 @@ use crate::include::dav1d::headers::Dav1dMasteringDisplay; use crate::include::dav1d::headers::Dav1dPixelLayout; use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::include::dav1d::headers::Rav1dFrameHeader; +use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dSequenceHeader; use crate::src::r#ref::Rav1dRef; use libc::ptrdiff_t; @@ -84,7 +85,7 @@ pub(crate) struct Rav1dPicture { pub m: Rav1dDataProps, pub content_light: *mut Dav1dContentLightLevel, // TODO(kkysen) make Rav1d pub mastering_display: *mut Dav1dMasteringDisplay, // TODO(kkysen) make Rav1d - pub itut_t35: *mut Dav1dITUTT35, // TODO(kkysen) make Rav1d + pub itut_t35: *mut Rav1dITUTT35, pub reserved: [uintptr_t; 4], pub frame_hdr_ref: *mut Rav1dRef, pub seq_hdr_ref: *mut Rav1dRef, @@ -153,7 +154,19 @@ impl From for Rav1dPicture { m: m.into(), content_light, mastering_display, - itut_t35: itut_t35, + // `.update_rav1d()` happens in `#[no_mangle] extern "C"`/`DAV1D_API` calls + itut_t35: if itut_t35.is_null() { + ptr::null_mut() + } else { + unsafe { + addr_of_mut!( + (*(itut_t35_ref.read()) + .data + .cast::>()) + .rav1d + ) + } + }, reserved, frame_hdr_ref, seq_hdr_ref, @@ -224,7 +237,19 @@ impl From for Dav1dPicture { m: m.into(), content_light, mastering_display, - itut_t35: itut_t35, + // `.update_dav1d()` happens in [`rav1d_parse_obus`]. + itut_t35: if itut_t35.is_null() { + ptr::null_mut() + } else { + unsafe { + addr_of_mut!( + (*(itut_t35_ref.read()) + .data + .cast::>()) + .dav1d + ) + } + }, reserved, frame_hdr_ref, seq_hdr_ref, diff --git a/src/internal.rs b/src/internal.rs index d656240c8..3469843a8 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -7,9 +7,9 @@ use crate::include::dav1d::dav1d::Rav1dEventFlags; use crate::include::dav1d::dav1d::Rav1dInloopFilterType; use crate::include::dav1d::dav1d::Rav1dLogger; use crate::include::dav1d::headers::Dav1dContentLightLevel; -use crate::include::dav1d::headers::Dav1dITUTT35; use crate::include::dav1d::headers::Dav1dMasteringDisplay; use crate::include::dav1d::headers::Rav1dFrameHeader; +use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dSequenceHeader; use crate::include::dav1d::headers::Rav1dWarpedMotionParams; use crate::include::dav1d::picture::Rav1dPicAllocator; @@ -180,7 +180,7 @@ pub struct Rav1dContext { pub(crate) mastering_display_ref: *mut Rav1dRef, pub(crate) mastering_display: *mut Dav1dMasteringDisplay, // TODO(kkysen) make Rav1d pub(crate) itut_t35_ref: *mut Rav1dRef, - pub(crate) itut_t35: *mut Dav1dITUTT35, // TODO(kkysen) make Rav1d + pub(crate) itut_t35: *mut Rav1dITUTT35, pub(crate) in_0: Rav1dData, pub(crate) out: Rav1dThreadPicture, pub(crate) cache: Rav1dThreadPicture, diff --git a/src/lib.rs b/src/lib.rs index eee38e4d0..47b98b113 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,7 @@ use crate::include::dav1d::headers::Dav1dITUTT35; use crate::include::dav1d::headers::Dav1dMasteringDisplay; use crate::include::dav1d::headers::Dav1dSequenceHeader; use crate::include::dav1d::headers::Rav1dFrameHeader; +use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dSequenceHeader; use crate::include::dav1d::picture::Dav1dPicture; use crate::include::dav1d::picture::Rav1dPicAllocator; @@ -1036,6 +1037,13 @@ pub unsafe extern "C" fn dav1d_get_picture(c: *mut Dav1dContext, out: *mut Dav1d .cast::>()) .update_rav1d(); } + if let Some(mut itut_t35_ref) = NonNull::new((*out).itut_t35_ref) { + (*itut_t35_ref + .as_mut() + .data + .cast::>()) + .update_rav1d(); + } let mut out_rust = out.read().into(); let result = rav1d_get_picture(c, &mut out_rust); out.write(out_rust.into()); @@ -1131,6 +1139,13 @@ pub unsafe extern "C" fn dav1d_apply_grain( .cast::>()) .update_rav1d(); } + if let Some(mut itut_t35_ref) = NonNull::new((*in_0).itut_t35_ref) { + (*itut_t35_ref + .as_mut() + .data + .cast::>()) + .update_rav1d(); + } if let Some(mut seq_hdr_ref) = NonNull::new((*out).seq_hdr_ref) { (*seq_hdr_ref .as_mut() @@ -1145,6 +1160,13 @@ pub unsafe extern "C" fn dav1d_apply_grain( .cast::>()) .update_rav1d(); } + if let Some(mut itut_t35_ref) = NonNull::new((*out).itut_t35_ref) { + (*itut_t35_ref + .as_mut() + .data + .cast::>()) + .update_rav1d(); + } let mut out_rust = out.read().into(); let in_rust = in_0.read().into(); let result = rav1d_apply_grain(c, &mut out_rust, &in_rust); @@ -1177,7 +1199,7 @@ pub(crate) unsafe fn rav1d_flush(c: *mut Rav1dContext) { rav1d_ref_dec(&mut (*c).seq_hdr_ref); (*c).mastering_display = 0 as *mut Dav1dMasteringDisplay; (*c).content_light = 0 as *mut Dav1dContentLightLevel; - (*c).itut_t35 = 0 as *mut Dav1dITUTT35; + (*c).itut_t35 = 0 as *mut Rav1dITUTT35; rav1d_ref_dec(&mut (*c).mastering_display_ref); rav1d_ref_dec(&mut (*c).content_light_ref); rav1d_ref_dec(&mut (*c).itut_t35_ref); diff --git a/src/obu.rs b/src/obu.rs index 6cb25bdbd..de0f3b0ec 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -25,6 +25,7 @@ use crate::include::dav1d::headers::Dav1dTxfmMode; use crate::include::dav1d::headers::Dav1dWarpedMotionType; use crate::include::dav1d::headers::Rav1dFrameHeader; use crate::include::dav1d::headers::Rav1dFrameHeaderOperatingPoint; +use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dLoopfilterModeRefDeltas; use crate::include::dav1d::headers::Rav1dObuType; use crate::include::dav1d::headers::Rav1dSegmentationData; @@ -1867,17 +1868,24 @@ pub(crate) unsafe fn rav1d_parse_obus( ); } else { let ref_3: *mut Rav1dRef = rav1d_ref_create( - (::core::mem::size_of::()).wrapping_add( - (payload_size as usize).wrapping_mul(::core::mem::size_of::()), - ), + (::core::mem::size_of::>()) + .wrapping_add( + (payload_size as usize) + .wrapping_mul(::core::mem::size_of::()), + ), ); if ref_3.is_null() { return -(12 as c_int); } - let itut_t35_metadata: *mut Dav1dITUTT35 = - (*ref_3).data as *mut Dav1dITUTT35; - (*itut_t35_metadata).payload = - &mut *itut_t35_metadata.offset(1) as *mut Dav1dITUTT35 as *mut u8; + let itut_t32_metadatas = + (*ref_3).data.cast::>(); + let itut_t35_metadata: *mut Rav1dITUTT35 = + addr_of_mut!((*itut_t32_metadatas).rav1d); + (*itut_t35_metadata).payload = (*ref_3) + .data + .cast::() + .offset(::core::mem::size_of::>() + as isize); (*itut_t35_metadata).country_code = country_code as u8; (*itut_t35_metadata).country_code_extension_byte = country_code_extension_byte as u8; @@ -1888,6 +1896,7 @@ pub(crate) unsafe fn rav1d_parse_obus( i_2 += 1; } (*itut_t35_metadata).payload_size = payload_size as usize; + (*itut_t32_metadatas).update_dav1d(); rav1d_ref_dec(&mut (*c).itut_t35_ref); (*c).itut_t35 = itut_t35_metadata; (*c).itut_t35_ref = ref_3; diff --git a/src/picture.rs b/src/picture.rs index 6f19fabd2..7d8f04470 100644 --- a/src/picture.rs +++ b/src/picture.rs @@ -5,9 +5,9 @@ use crate::include::dav1d::dav1d::Rav1dEventFlags; use crate::include::dav1d::dav1d::RAV1D_EVENT_FLAG_NEW_OP_PARAMS_INFO; use crate::include::dav1d::dav1d::RAV1D_EVENT_FLAG_NEW_SEQUENCE; use crate::include::dav1d::headers::Dav1dContentLightLevel; -use crate::include::dav1d::headers::Dav1dITUTT35; use crate::include::dav1d::headers::Dav1dMasteringDisplay; use crate::include::dav1d::headers::Rav1dFrameHeader; +use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dSequenceHeader; use crate::include::dav1d::headers::RAV1D_PIXEL_LAYOUT_I400; use crate::include::dav1d::headers::RAV1D_PIXEL_LAYOUT_I420; @@ -146,7 +146,7 @@ unsafe extern "C" fn picture_alloc_with_edges( content_light_ref: *mut Rav1dRef, mastering_display: *mut Dav1dMasteringDisplay, mastering_display_ref: *mut Rav1dRef, - itut_t35: *mut Dav1dITUTT35, + itut_t35: *mut Rav1dITUTT35, itut_t35_ref: *mut Rav1dRef, bpc: c_int, props: *const Rav1dDataProps, @@ -182,6 +182,7 @@ unsafe extern "C" fn picture_alloc_with_edges( rav1d_data_props_set_defaults(&mut (*p).m); (*p).seq_hdr_ref = seq_hdr_ref; (*p).frame_hdr_ref = frame_hdr_ref; + (*p).itut_t35_ref = itut_t35_ref; let res = (*p_allocator).alloc_picture(p); if res < 0 { free(pic_ctx as *mut c_void); @@ -222,7 +223,6 @@ unsafe extern "C" fn picture_alloc_with_edges( if !mastering_display_ref.is_null() { rav1d_ref_inc(mastering_display_ref); } - (*p).itut_t35_ref = itut_t35_ref; if !itut_t35_ref.is_null() { rav1d_ref_inc(itut_t35_ref); } @@ -265,7 +265,7 @@ pub(crate) unsafe fn rav1d_thread_picture_alloc( return res; } rav1d_ref_dec(&mut (*c).itut_t35_ref); - (*c).itut_t35 = 0 as *mut Dav1dITUTT35; + (*c).itut_t35 = 0 as *mut Rav1dITUTT35; let flags_mask = if (*(*f).frame_hdr).show_frame != 0 || (*c).output_invisible_frames != 0 { 0 as c_int } else {