Skip to content

Commit 4094895

Browse files
committed
Check data.is_none() in addition to data.data[0].is_null().
1 parent e38f69c commit 4094895

File tree

5 files changed

+147
-23
lines changed

5 files changed

+147
-23
lines changed

src/decode.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4539,7 +4539,14 @@ pub(crate) unsafe fn rav1d_decode_frame_exit(
45394539
f: &mut Rav1dFrameData,
45404540
retval: Rav1dResult,
45414541
) {
4542-
if !f.sr_cur.p.data.as_ref().unwrap().data[0].is_null() {
4542+
if !f
4543+
.sr_cur
4544+
.p
4545+
.data
4546+
.as_ref()
4547+
.map(|data| data.data[0].is_null())
4548+
.unwrap_or(true)
4549+
{
45434550
f.task_thread.error = AtomicI32::new(0);
45444551
}
45454552
let cf = f.frame_thread.cf.get_mut();
@@ -4644,7 +4651,12 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
46444651
task_thread_lock = f.task_thread.cond.wait(task_thread_lock).unwrap();
46454652
}
46464653
let out_delayed = &mut c.frame_thread.out_delayed[next as usize];
4647-
if !out_delayed.p.data.as_ref().unwrap().data[0].is_null()
4654+
if !out_delayed
4655+
.p
4656+
.data
4657+
.as_ref()
4658+
.map(|data| data.data[0].is_null())
4659+
.unwrap_or(true)
46484660
|| f.task_thread.error.load(Ordering::SeqCst) != 0
46494661
{
46504662
let first = c.task_thread.first.load(Ordering::SeqCst);
@@ -4671,7 +4683,13 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
46714683
c.cached_error = mem::replace(&mut error, Ok(()));
46724684
*c.cached_error_props.get_mut().unwrap() = out_delayed.p.m.clone();
46734685
rav1d_thread_picture_unref(out_delayed);
4674-
} else if !out_delayed.p.data.as_ref().unwrap().data[0].is_null() {
4686+
} else if !out_delayed
4687+
.p
4688+
.data
4689+
.as_ref()
4690+
.map(|data| data.data[0].is_null())
4691+
.unwrap_or(true)
4692+
{
46754693
let progress = out_delayed.progress.as_ref().unwrap()[1].load(Ordering::Relaxed);
46764694
if (out_delayed.visible || c.output_invisible_frames) && progress != FRAME_ERROR {
46774695
rav1d_thread_picture_ref(&mut c.out, out_delayed);
@@ -4732,14 +4750,27 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
47324750
if frame_hdr.frame_type.is_inter_or_switch() {
47334751
if frame_hdr.primary_ref_frame != RAV1D_PRIMARY_REF_NONE {
47344752
let pri_ref = frame_hdr.refidx[frame_hdr.primary_ref_frame as usize] as usize;
4735-
if c.refs[pri_ref].p.p.data.as_ref().unwrap().data[0].is_null() {
4753+
if c.refs[pri_ref]
4754+
.p
4755+
.p
4756+
.data
4757+
.as_ref()
4758+
.map(|data| data.data[0].is_null())
4759+
.unwrap_or(true)
4760+
{
47364761
on_error(f, c, out);
47374762
return Err(EINVAL);
47384763
}
47394764
}
47404765
for i in 0..7 {
47414766
let refidx = frame_hdr.refidx[i] as usize;
4742-
if c.refs[refidx].p.p.data.as_ref().unwrap().data[0].is_null()
4767+
if c.refs[refidx]
4768+
.p
4769+
.p
4770+
.data
4771+
.as_ref()
4772+
.map(|data| data.data[0].is_null())
4773+
.unwrap_or(true)
47434774
|| (frame_hdr.size.width[0] * 2) < c.refs[refidx].p.p.p.w
47444775
|| (frame_hdr.size.height * 2) < c.refs[refidx].p.p.p.h
47454776
|| frame_hdr.size.width[0] > c.refs[refidx].p.p.p.w * 16

src/lib.rs

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,16 @@ unsafe fn output_image(c: &mut Rav1dContext, out: &mut Rav1dPicture) -> Rav1dRes
400400
}
401401
rav1d_thread_picture_unref(&mut *r#in);
402402

403-
if !c.all_layers && c.max_spatial_id && !(c.out.p.data.as_ref().unwrap().data[0]).is_null() {
403+
if !c.all_layers
404+
&& c.max_spatial_id
405+
&& !c
406+
.out
407+
.p
408+
.data
409+
.as_ref()
410+
.map(|data| data.data[0].is_null())
411+
.unwrap_or(true)
412+
{
404413
rav1d_thread_picture_move_ref(r#in, &mut c.out);
405414
}
406415
res
@@ -411,8 +420,20 @@ unsafe fn output_picture_ready(c: &mut Rav1dContext, drain: bool) -> bool {
411420
return true;
412421
}
413422
if !c.all_layers && c.max_spatial_id {
414-
if !c.out.p.data.as_ref().unwrap().data[0].is_null()
415-
&& !c.cache.p.data.as_ref().unwrap().data[0].is_null()
423+
if !c
424+
.out
425+
.p
426+
.data
427+
.as_ref()
428+
.map(|data| data.data[0].is_null())
429+
.unwrap_or(true)
430+
&& !c
431+
.cache
432+
.p
433+
.data
434+
.as_ref()
435+
.map(|data| data.data[0].is_null())
436+
.unwrap_or(true)
416437
{
417438
if c.max_spatial_id == (c.cache.p.frame_hdr.as_ref().unwrap().spatial_id != 0)
418439
|| c.out.flags.contains(PictureFlags::NEW_TEMPORAL_UNIT)
@@ -423,17 +444,37 @@ unsafe fn output_picture_ready(c: &mut Rav1dContext, drain: bool) -> bool {
423444
rav1d_thread_picture_move_ref(&mut c.cache, &mut c.out);
424445
return false;
425446
} else {
426-
if !c.cache.p.data.as_ref().unwrap().data[0].is_null() && drain {
447+
if !c
448+
.cache
449+
.p
450+
.data
451+
.as_ref()
452+
.map(|data| data.data[0].is_null())
453+
.unwrap_or(true)
454+
&& drain
455+
{
427456
return true;
428457
} else {
429-
if !c.out.p.data.as_ref().unwrap().data[0].is_null() {
458+
if !c
459+
.out
460+
.p
461+
.data
462+
.as_ref()
463+
.map(|data| data.data[0].is_null())
464+
.unwrap_or(true)
465+
{
430466
rav1d_thread_picture_move_ref(&mut c.cache, &mut c.out);
431467
return false;
432468
}
433469
}
434470
}
435471
}
436-
!c.out.p.data.as_ref().unwrap().data[0].is_null()
472+
!c.out
473+
.p
474+
.data
475+
.as_ref()
476+
.map(|data| data.data[0].is_null())
477+
.unwrap_or(true)
437478
}
438479

439480
unsafe fn drain_picture(c: &mut Rav1dContext, out: &mut Rav1dPicture) -> Rav1dResult {
@@ -447,7 +488,12 @@ unsafe fn drain_picture(c: &mut Rav1dContext, out: &mut Rav1dPicture) -> Rav1dRe
447488
task_thread_lock = f.task_thread.cond.wait(task_thread_lock).unwrap();
448489
}
449490
let out_delayed = &mut c.frame_thread.out_delayed[next as usize];
450-
if !out_delayed.p.data.as_ref().unwrap().data[0].is_null()
491+
if !out_delayed
492+
.p
493+
.data
494+
.as_ref()
495+
.map(|data| data.data[0].is_null())
496+
.unwrap_or(true)
451497
|| f.task_thread.error.load(Ordering::SeqCst) != 0
452498
{
453499
let first: c_uint = c.task_thread.first.load(Ordering::SeqCst);
@@ -482,7 +528,13 @@ unsafe fn drain_picture(c: &mut Rav1dContext, out: &mut Rav1dPicture) -> Rav1dRe
482528
rav1d_thread_picture_unref(out_delayed);
483529
return error;
484530
}
485-
if !(out_delayed.p.data.as_ref().unwrap().data[0]).is_null() {
531+
if !out_delayed
532+
.p
533+
.data
534+
.as_ref()
535+
.map(|data| data.data[0].is_null())
536+
.unwrap_or(true)
537+
{
486538
let progress = out_delayed.progress.as_ref().unwrap()[1].load(Ordering::Relaxed);
487539
if (out_delayed.visible || c.output_invisible_frames) && progress != FRAME_ERROR {
488540
rav1d_thread_picture_ref(&mut c.out, out_delayed);

src/obu.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2517,9 +2517,8 @@ unsafe fn parse_obus(
25172517
.p
25182518
.data
25192519
.as_ref()
2520-
.unwrap()
2521-
.data[0]
2522-
.is_null()
2520+
.map(|data| data.data[0].is_null())
2521+
.unwrap_or(true)
25232522
{
25242523
return Err(EINVAL);
25252524
}
@@ -2555,7 +2554,12 @@ unsafe fn parse_obus(
25552554
task_thread_lock = f.task_thread.cond.wait(task_thread_lock).unwrap();
25562555
}
25572556
let out_delayed = &mut c.frame_thread.out_delayed[next as usize];
2558-
if !out_delayed.p.data.as_ref().unwrap().data[0].is_null()
2557+
if !out_delayed
2558+
.p
2559+
.data
2560+
.as_ref()
2561+
.map(|data| data.data[0].is_null())
2562+
.unwrap_or(true)
25592563
|| f.task_thread.error.load(Ordering::SeqCst) != 0
25602564
{
25612565
let first = c.task_thread.first.load(Ordering::SeqCst);
@@ -2581,7 +2585,13 @@ unsafe fn parse_obus(
25812585
c.cached_error = mem::replace(&mut *error, Ok(()));
25822586
*c.cached_error_props.get_mut().unwrap() = out_delayed.p.m.clone();
25832587
rav1d_thread_picture_unref(out_delayed);
2584-
} else if !(out_delayed.p.data.as_ref().unwrap().data[0]).is_null() {
2588+
} else if !out_delayed
2589+
.p
2590+
.data
2591+
.as_ref()
2592+
.map(|data| data.data[0].is_null())
2593+
.unwrap_or(true)
2594+
{
25852595
let progress =
25862596
out_delayed.progress.as_ref().unwrap()[1].load(Ordering::Relaxed);
25872597
if (out_delayed.visible || c.output_invisible_frames) && progress != FRAME_ERROR

src/picture.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,12 @@ unsafe fn picture_alloc_with_edges(
212212
bpc: c_int,
213213
p_allocator: &Rav1dPicAllocator,
214214
) -> Rav1dResult {
215-
if !p.data.as_ref().unwrap().data[0].is_null() {
215+
if !p
216+
.data
217+
.as_ref()
218+
.map(|data| data.data[0].is_null())
219+
.unwrap_or(true)
220+
{
216221
writeln!(logger, "Picture already allocated!",);
217222
return Err(EGeneric);
218223
}
@@ -310,7 +315,13 @@ pub(crate) unsafe fn rav1d_picture_alloc_copy(
310315
}
311316

312317
pub(crate) unsafe fn rav1d_picture_ref(dst: &mut Rav1dPicture, src: &Rav1dPicture) {
313-
if validate_input!(dst.data.as_ref().unwrap().data[0].is_null()).is_err() {
318+
if validate_input!(dst
319+
.data
320+
.as_ref()
321+
.map(|data| data.data[0].is_null())
322+
.unwrap_or(true))
323+
.is_err()
324+
{
314325
return;
315326
}
316327
if let Some(data) = &src.data {
@@ -322,7 +333,13 @@ pub(crate) unsafe fn rav1d_picture_ref(dst: &mut Rav1dPicture, src: &Rav1dPictur
322333
}
323334

324335
pub(crate) unsafe fn rav1d_picture_move_ref(dst: &mut Rav1dPicture, src: &mut Rav1dPicture) {
325-
if validate_input!(dst.data.as_ref().unwrap().data[0].is_null()).is_err() {
336+
if validate_input!(dst
337+
.data
338+
.as_ref()
339+
.map(|data| data.data[0].is_null())
340+
.unwrap_or(true))
341+
.is_err()
342+
{
326343
return;
327344
}
328345
if let Some(data) = &src.data {

src/thread_task.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,7 +1257,14 @@ pub unsafe fn rav1d_worker_task(c: &Rav1dContext, task_thread: Arc<Rav1dTaskCont
12571257
};
12581258
// Note that `progress.is_some() == c.n_fc > 1`.
12591259
let progress = &**f.sr_cur.progress.as_ref().unwrap();
1260-
if !(f.sr_cur.p.data.as_ref().unwrap().data[0]).is_null() {
1260+
if !f
1261+
.sr_cur
1262+
.p
1263+
.data
1264+
.as_ref()
1265+
.map(|data| data.data[0].is_null())
1266+
.unwrap_or(true)
1267+
{
12611268
progress[0].store(if error_0 != 0 { FRAME_ERROR } else { y }, Ordering::SeqCst);
12621269
}
12631270
f.frame_thread_progress.entropy.store(
@@ -1310,7 +1317,14 @@ pub unsafe fn rav1d_worker_task(c: &Rav1dContext, task_thread: Arc<Rav1dTaskCont
13101317
// Note that `progress.is_some() == c.n_fc > 1`.
13111318
if let Some(progress) = &f.sr_cur.progress {
13121319
// upon flush, this can be free'ed already
1313-
if !(f.sr_cur.p.data.as_ref().unwrap().data[0]).is_null() {
1320+
if !f
1321+
.sr_cur
1322+
.p
1323+
.data
1324+
.as_ref()
1325+
.map(|data| data.data[0].is_null())
1326+
.unwrap_or(true)
1327+
{
13141328
progress[1].store(
13151329
if error_0 != 0 { FRAME_ERROR } else { y_0 },
13161330
Ordering::SeqCst,

0 commit comments

Comments
 (0)