1*c0909341SAndroid Build Coastguard Worker /*
2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, Two Orioles, LLC
4*c0909341SAndroid Build Coastguard Worker * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker *
9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker * list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker *
12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker *
16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker */
27*c0909341SAndroid Build Coastguard Worker
28*c0909341SAndroid Build Coastguard Worker #include "config.h"
29*c0909341SAndroid Build Coastguard Worker
30*c0909341SAndroid Build Coastguard Worker #include <errno.h>
31*c0909341SAndroid Build Coastguard Worker #include <stdint.h>
32*c0909341SAndroid Build Coastguard Worker #include <stdio.h>
33*c0909341SAndroid Build Coastguard Worker #include <stdlib.h>
34*c0909341SAndroid Build Coastguard Worker #include <string.h>
35*c0909341SAndroid Build Coastguard Worker
36*c0909341SAndroid Build Coastguard Worker #include "common/intops.h"
37*c0909341SAndroid Build Coastguard Worker #include "common/validate.h"
38*c0909341SAndroid Build Coastguard Worker
39*c0909341SAndroid Build Coastguard Worker #include "src/internal.h"
40*c0909341SAndroid Build Coastguard Worker #include "src/log.h"
41*c0909341SAndroid Build Coastguard Worker #include "src/picture.h"
42*c0909341SAndroid Build Coastguard Worker #include "src/ref.h"
43*c0909341SAndroid Build Coastguard Worker #include "src/thread.h"
44*c0909341SAndroid Build Coastguard Worker #include "src/thread_task.h"
45*c0909341SAndroid Build Coastguard Worker
dav1d_default_picture_alloc(Dav1dPicture * const p,void * const cookie)46*c0909341SAndroid Build Coastguard Worker int dav1d_default_picture_alloc(Dav1dPicture *const p, void *const cookie) {
47*c0909341SAndroid Build Coastguard Worker assert(sizeof(Dav1dMemPoolBuffer) <= DAV1D_PICTURE_ALIGNMENT);
48*c0909341SAndroid Build Coastguard Worker const int hbd = p->p.bpc > 8;
49*c0909341SAndroid Build Coastguard Worker const int aligned_w = (p->p.w + 127) & ~127;
50*c0909341SAndroid Build Coastguard Worker const int aligned_h = (p->p.h + 127) & ~127;
51*c0909341SAndroid Build Coastguard Worker const int has_chroma = p->p.layout != DAV1D_PIXEL_LAYOUT_I400;
52*c0909341SAndroid Build Coastguard Worker const int ss_ver = p->p.layout == DAV1D_PIXEL_LAYOUT_I420;
53*c0909341SAndroid Build Coastguard Worker const int ss_hor = p->p.layout != DAV1D_PIXEL_LAYOUT_I444;
54*c0909341SAndroid Build Coastguard Worker ptrdiff_t y_stride = aligned_w << hbd;
55*c0909341SAndroid Build Coastguard Worker ptrdiff_t uv_stride = has_chroma ? y_stride >> ss_hor : 0;
56*c0909341SAndroid Build Coastguard Worker /* Due to how mapping of addresses to sets works in most L1 and L2 cache
57*c0909341SAndroid Build Coastguard Worker * implementations, strides of multiples of certain power-of-two numbers
58*c0909341SAndroid Build Coastguard Worker * may cause multiple rows of the same superblock to map to the same set,
59*c0909341SAndroid Build Coastguard Worker * causing evictions of previous rows resulting in a reduction in cache
60*c0909341SAndroid Build Coastguard Worker * hit rate. Avoid that by slightly padding the stride when necessary. */
61*c0909341SAndroid Build Coastguard Worker if (!(y_stride & 1023))
62*c0909341SAndroid Build Coastguard Worker y_stride += DAV1D_PICTURE_ALIGNMENT;
63*c0909341SAndroid Build Coastguard Worker if (!(uv_stride & 1023) && has_chroma)
64*c0909341SAndroid Build Coastguard Worker uv_stride += DAV1D_PICTURE_ALIGNMENT;
65*c0909341SAndroid Build Coastguard Worker p->stride[0] = y_stride;
66*c0909341SAndroid Build Coastguard Worker p->stride[1] = uv_stride;
67*c0909341SAndroid Build Coastguard Worker const size_t y_sz = y_stride * aligned_h;
68*c0909341SAndroid Build Coastguard Worker const size_t uv_sz = uv_stride * (aligned_h >> ss_ver);
69*c0909341SAndroid Build Coastguard Worker const size_t pic_size = y_sz + 2 * uv_sz;
70*c0909341SAndroid Build Coastguard Worker
71*c0909341SAndroid Build Coastguard Worker Dav1dMemPoolBuffer *const buf = dav1d_mem_pool_pop(cookie, pic_size +
72*c0909341SAndroid Build Coastguard Worker DAV1D_PICTURE_ALIGNMENT -
73*c0909341SAndroid Build Coastguard Worker sizeof(Dav1dMemPoolBuffer));
74*c0909341SAndroid Build Coastguard Worker if (!buf) return DAV1D_ERR(ENOMEM);
75*c0909341SAndroid Build Coastguard Worker p->allocator_data = buf;
76*c0909341SAndroid Build Coastguard Worker
77*c0909341SAndroid Build Coastguard Worker uint8_t *const data = buf->data;
78*c0909341SAndroid Build Coastguard Worker p->data[0] = data;
79*c0909341SAndroid Build Coastguard Worker p->data[1] = has_chroma ? data + y_sz : NULL;
80*c0909341SAndroid Build Coastguard Worker p->data[2] = has_chroma ? data + y_sz + uv_sz : NULL;
81*c0909341SAndroid Build Coastguard Worker
82*c0909341SAndroid Build Coastguard Worker return 0;
83*c0909341SAndroid Build Coastguard Worker }
84*c0909341SAndroid Build Coastguard Worker
dav1d_default_picture_release(Dav1dPicture * const p,void * const cookie)85*c0909341SAndroid Build Coastguard Worker void dav1d_default_picture_release(Dav1dPicture *const p, void *const cookie) {
86*c0909341SAndroid Build Coastguard Worker dav1d_mem_pool_push(cookie, p->allocator_data);
87*c0909341SAndroid Build Coastguard Worker }
88*c0909341SAndroid Build Coastguard Worker
89*c0909341SAndroid Build Coastguard Worker struct pic_ctx_context {
90*c0909341SAndroid Build Coastguard Worker Dav1dPicAllocator allocator;
91*c0909341SAndroid Build Coastguard Worker Dav1dPicture pic;
92*c0909341SAndroid Build Coastguard Worker Dav1dRef ref;
93*c0909341SAndroid Build Coastguard Worker void *extra_data[];
94*c0909341SAndroid Build Coastguard Worker };
95*c0909341SAndroid Build Coastguard Worker
free_buffer(const uint8_t * const data,void * const user_data)96*c0909341SAndroid Build Coastguard Worker static void free_buffer(const uint8_t *const data, void *const user_data) {
97*c0909341SAndroid Build Coastguard Worker Dav1dMemPoolBuffer *buf = (Dav1dMemPoolBuffer *)data;
98*c0909341SAndroid Build Coastguard Worker struct pic_ctx_context *pic_ctx = buf->data;
99*c0909341SAndroid Build Coastguard Worker
100*c0909341SAndroid Build Coastguard Worker pic_ctx->allocator.release_picture_callback(&pic_ctx->pic,
101*c0909341SAndroid Build Coastguard Worker pic_ctx->allocator.cookie);
102*c0909341SAndroid Build Coastguard Worker dav1d_mem_pool_push(user_data, buf);
103*c0909341SAndroid Build Coastguard Worker }
104*c0909341SAndroid Build Coastguard Worker
dav1d_picture_free_itut_t35(const uint8_t * const data,void * const user_data)105*c0909341SAndroid Build Coastguard Worker void dav1d_picture_free_itut_t35(const uint8_t *const data, void *const user_data) {
106*c0909341SAndroid Build Coastguard Worker struct itut_t35_ctx_context *itut_t35_ctx = user_data;
107*c0909341SAndroid Build Coastguard Worker
108*c0909341SAndroid Build Coastguard Worker for (size_t i = 0; i < itut_t35_ctx->n_itut_t35; i++)
109*c0909341SAndroid Build Coastguard Worker dav1d_free(itut_t35_ctx->itut_t35[i].payload);
110*c0909341SAndroid Build Coastguard Worker dav1d_free(itut_t35_ctx->itut_t35);
111*c0909341SAndroid Build Coastguard Worker dav1d_free(itut_t35_ctx);
112*c0909341SAndroid Build Coastguard Worker }
113*c0909341SAndroid Build Coastguard Worker
picture_alloc(Dav1dContext * const c,Dav1dPicture * const p,const int w,const int h,Dav1dSequenceHeader * const seq_hdr,Dav1dRef * const seq_hdr_ref,Dav1dFrameHeader * const frame_hdr,Dav1dRef * const frame_hdr_ref,const int bpc,const Dav1dDataProps * const props,Dav1dPicAllocator * const p_allocator,void ** const extra_ptr)114*c0909341SAndroid Build Coastguard Worker static int picture_alloc(Dav1dContext *const c,
115*c0909341SAndroid Build Coastguard Worker Dav1dPicture *const p,
116*c0909341SAndroid Build Coastguard Worker const int w, const int h,
117*c0909341SAndroid Build Coastguard Worker Dav1dSequenceHeader *const seq_hdr, Dav1dRef *const seq_hdr_ref,
118*c0909341SAndroid Build Coastguard Worker Dav1dFrameHeader *const frame_hdr, Dav1dRef *const frame_hdr_ref,
119*c0909341SAndroid Build Coastguard Worker const int bpc,
120*c0909341SAndroid Build Coastguard Worker const Dav1dDataProps *const props,
121*c0909341SAndroid Build Coastguard Worker Dav1dPicAllocator *const p_allocator,
122*c0909341SAndroid Build Coastguard Worker void **const extra_ptr)
123*c0909341SAndroid Build Coastguard Worker {
124*c0909341SAndroid Build Coastguard Worker if (p->data[0]) {
125*c0909341SAndroid Build Coastguard Worker dav1d_log(c, "Picture already allocated!\n");
126*c0909341SAndroid Build Coastguard Worker return -1;
127*c0909341SAndroid Build Coastguard Worker }
128*c0909341SAndroid Build Coastguard Worker assert(bpc > 0 && bpc <= 16);
129*c0909341SAndroid Build Coastguard Worker
130*c0909341SAndroid Build Coastguard Worker size_t extra = c->n_fc > 1 ? sizeof(atomic_int) * 2 : 0;
131*c0909341SAndroid Build Coastguard Worker Dav1dMemPoolBuffer *buf = dav1d_mem_pool_pop(c->pic_ctx_pool,
132*c0909341SAndroid Build Coastguard Worker extra + sizeof(struct pic_ctx_context));
133*c0909341SAndroid Build Coastguard Worker if (buf == NULL)
134*c0909341SAndroid Build Coastguard Worker return DAV1D_ERR(ENOMEM);
135*c0909341SAndroid Build Coastguard Worker
136*c0909341SAndroid Build Coastguard Worker struct pic_ctx_context *pic_ctx = buf->data;
137*c0909341SAndroid Build Coastguard Worker
138*c0909341SAndroid Build Coastguard Worker p->p.w = w;
139*c0909341SAndroid Build Coastguard Worker p->p.h = h;
140*c0909341SAndroid Build Coastguard Worker p->seq_hdr = seq_hdr;
141*c0909341SAndroid Build Coastguard Worker p->frame_hdr = frame_hdr;
142*c0909341SAndroid Build Coastguard Worker p->p.layout = seq_hdr->layout;
143*c0909341SAndroid Build Coastguard Worker p->p.bpc = bpc;
144*c0909341SAndroid Build Coastguard Worker dav1d_data_props_set_defaults(&p->m);
145*c0909341SAndroid Build Coastguard Worker const int res = p_allocator->alloc_picture_callback(p, p_allocator->cookie);
146*c0909341SAndroid Build Coastguard Worker if (res < 0) {
147*c0909341SAndroid Build Coastguard Worker dav1d_mem_pool_push(c->pic_ctx_pool, buf);
148*c0909341SAndroid Build Coastguard Worker return res;
149*c0909341SAndroid Build Coastguard Worker }
150*c0909341SAndroid Build Coastguard Worker
151*c0909341SAndroid Build Coastguard Worker pic_ctx->allocator = *p_allocator;
152*c0909341SAndroid Build Coastguard Worker pic_ctx->pic = *p;
153*c0909341SAndroid Build Coastguard Worker p->ref = dav1d_ref_init(&pic_ctx->ref, buf, free_buffer, c->pic_ctx_pool, 0);
154*c0909341SAndroid Build Coastguard Worker
155*c0909341SAndroid Build Coastguard Worker p->seq_hdr_ref = seq_hdr_ref;
156*c0909341SAndroid Build Coastguard Worker if (seq_hdr_ref) dav1d_ref_inc(seq_hdr_ref);
157*c0909341SAndroid Build Coastguard Worker
158*c0909341SAndroid Build Coastguard Worker p->frame_hdr_ref = frame_hdr_ref;
159*c0909341SAndroid Build Coastguard Worker if (frame_hdr_ref) dav1d_ref_inc(frame_hdr_ref);
160*c0909341SAndroid Build Coastguard Worker
161*c0909341SAndroid Build Coastguard Worker if (extra && extra_ptr)
162*c0909341SAndroid Build Coastguard Worker *extra_ptr = &pic_ctx->extra_data;
163*c0909341SAndroid Build Coastguard Worker
164*c0909341SAndroid Build Coastguard Worker return 0;
165*c0909341SAndroid Build Coastguard Worker }
166*c0909341SAndroid Build Coastguard Worker
dav1d_picture_copy_props(Dav1dPicture * const p,Dav1dContentLightLevel * const content_light,Dav1dRef * const content_light_ref,Dav1dMasteringDisplay * const mastering_display,Dav1dRef * const mastering_display_ref,Dav1dITUTT35 * const itut_t35,Dav1dRef * itut_t35_ref,size_t n_itut_t35,const Dav1dDataProps * const props)167*c0909341SAndroid Build Coastguard Worker void dav1d_picture_copy_props(Dav1dPicture *const p,
168*c0909341SAndroid Build Coastguard Worker Dav1dContentLightLevel *const content_light, Dav1dRef *const content_light_ref,
169*c0909341SAndroid Build Coastguard Worker Dav1dMasteringDisplay *const mastering_display, Dav1dRef *const mastering_display_ref,
170*c0909341SAndroid Build Coastguard Worker Dav1dITUTT35 *const itut_t35, Dav1dRef *itut_t35_ref, size_t n_itut_t35,
171*c0909341SAndroid Build Coastguard Worker const Dav1dDataProps *const props)
172*c0909341SAndroid Build Coastguard Worker {
173*c0909341SAndroid Build Coastguard Worker dav1d_data_props_copy(&p->m, props);
174*c0909341SAndroid Build Coastguard Worker
175*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->content_light_ref);
176*c0909341SAndroid Build Coastguard Worker p->content_light_ref = content_light_ref;
177*c0909341SAndroid Build Coastguard Worker p->content_light = content_light;
178*c0909341SAndroid Build Coastguard Worker if (content_light_ref) dav1d_ref_inc(content_light_ref);
179*c0909341SAndroid Build Coastguard Worker
180*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->mastering_display_ref);
181*c0909341SAndroid Build Coastguard Worker p->mastering_display_ref = mastering_display_ref;
182*c0909341SAndroid Build Coastguard Worker p->mastering_display = mastering_display;
183*c0909341SAndroid Build Coastguard Worker if (mastering_display_ref) dav1d_ref_inc(mastering_display_ref);
184*c0909341SAndroid Build Coastguard Worker
185*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->itut_t35_ref);
186*c0909341SAndroid Build Coastguard Worker p->itut_t35_ref = itut_t35_ref;
187*c0909341SAndroid Build Coastguard Worker p->itut_t35 = itut_t35;
188*c0909341SAndroid Build Coastguard Worker p->n_itut_t35 = n_itut_t35;
189*c0909341SAndroid Build Coastguard Worker if (itut_t35_ref) dav1d_ref_inc(itut_t35_ref);
190*c0909341SAndroid Build Coastguard Worker }
191*c0909341SAndroid Build Coastguard Worker
dav1d_thread_picture_alloc(Dav1dContext * const c,Dav1dFrameContext * const f,const int bpc)192*c0909341SAndroid Build Coastguard Worker int dav1d_thread_picture_alloc(Dav1dContext *const c, Dav1dFrameContext *const f,
193*c0909341SAndroid Build Coastguard Worker const int bpc)
194*c0909341SAndroid Build Coastguard Worker {
195*c0909341SAndroid Build Coastguard Worker Dav1dThreadPicture *const p = &f->sr_cur;
196*c0909341SAndroid Build Coastguard Worker
197*c0909341SAndroid Build Coastguard Worker const int res = picture_alloc(c, &p->p, f->frame_hdr->width[1], f->frame_hdr->height,
198*c0909341SAndroid Build Coastguard Worker f->seq_hdr, f->seq_hdr_ref,
199*c0909341SAndroid Build Coastguard Worker f->frame_hdr, f->frame_hdr_ref,
200*c0909341SAndroid Build Coastguard Worker bpc, &f->tile[0].data.m, &c->allocator,
201*c0909341SAndroid Build Coastguard Worker (void **) &p->progress);
202*c0909341SAndroid Build Coastguard Worker if (res) return res;
203*c0909341SAndroid Build Coastguard Worker
204*c0909341SAndroid Build Coastguard Worker // Don't clear these flags from c->frame_flags if the frame is not going to be output.
205*c0909341SAndroid Build Coastguard Worker // This way they will be added to the next visible frame too.
206*c0909341SAndroid Build Coastguard Worker const int flags_mask = ((f->frame_hdr->show_frame || c->output_invisible_frames) &&
207*c0909341SAndroid Build Coastguard Worker c->max_spatial_id == f->frame_hdr->spatial_id)
208*c0909341SAndroid Build Coastguard Worker ? 0 : (PICTURE_FLAG_NEW_SEQUENCE | PICTURE_FLAG_NEW_OP_PARAMS_INFO);
209*c0909341SAndroid Build Coastguard Worker p->flags = c->frame_flags;
210*c0909341SAndroid Build Coastguard Worker c->frame_flags &= flags_mask;
211*c0909341SAndroid Build Coastguard Worker
212*c0909341SAndroid Build Coastguard Worker p->visible = f->frame_hdr->show_frame;
213*c0909341SAndroid Build Coastguard Worker p->showable = f->frame_hdr->showable_frame;
214*c0909341SAndroid Build Coastguard Worker
215*c0909341SAndroid Build Coastguard Worker if (p->visible) {
216*c0909341SAndroid Build Coastguard Worker // Only add HDR10+ and T35 metadata when show frame flag is enabled
217*c0909341SAndroid Build Coastguard Worker dav1d_picture_copy_props(&p->p, c->content_light, c->content_light_ref,
218*c0909341SAndroid Build Coastguard Worker c->mastering_display, c->mastering_display_ref,
219*c0909341SAndroid Build Coastguard Worker c->itut_t35, c->itut_t35_ref, c->n_itut_t35,
220*c0909341SAndroid Build Coastguard Worker &f->tile[0].data.m);
221*c0909341SAndroid Build Coastguard Worker
222*c0909341SAndroid Build Coastguard Worker // Must be removed from the context after being attached to the frame
223*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&c->itut_t35_ref);
224*c0909341SAndroid Build Coastguard Worker c->itut_t35 = NULL;
225*c0909341SAndroid Build Coastguard Worker c->n_itut_t35 = 0;
226*c0909341SAndroid Build Coastguard Worker } else {
227*c0909341SAndroid Build Coastguard Worker dav1d_data_props_copy(&p->p.m, &f->tile[0].data.m);
228*c0909341SAndroid Build Coastguard Worker }
229*c0909341SAndroid Build Coastguard Worker
230*c0909341SAndroid Build Coastguard Worker if (c->n_fc > 1) {
231*c0909341SAndroid Build Coastguard Worker atomic_init(&p->progress[0], 0);
232*c0909341SAndroid Build Coastguard Worker atomic_init(&p->progress[1], 0);
233*c0909341SAndroid Build Coastguard Worker }
234*c0909341SAndroid Build Coastguard Worker return res;
235*c0909341SAndroid Build Coastguard Worker }
236*c0909341SAndroid Build Coastguard Worker
dav1d_picture_alloc_copy(Dav1dContext * const c,Dav1dPicture * const dst,const int w,const Dav1dPicture * const src)237*c0909341SAndroid Build Coastguard Worker int dav1d_picture_alloc_copy(Dav1dContext *const c, Dav1dPicture *const dst, const int w,
238*c0909341SAndroid Build Coastguard Worker const Dav1dPicture *const src)
239*c0909341SAndroid Build Coastguard Worker {
240*c0909341SAndroid Build Coastguard Worker Dav1dMemPoolBuffer *const buf = (Dav1dMemPoolBuffer *)src->ref->const_data;
241*c0909341SAndroid Build Coastguard Worker struct pic_ctx_context *const pic_ctx = buf->data;
242*c0909341SAndroid Build Coastguard Worker const int res = picture_alloc(c, dst, w, src->p.h,
243*c0909341SAndroid Build Coastguard Worker src->seq_hdr, src->seq_hdr_ref,
244*c0909341SAndroid Build Coastguard Worker src->frame_hdr, src->frame_hdr_ref,
245*c0909341SAndroid Build Coastguard Worker src->p.bpc, &src->m, &pic_ctx->allocator,
246*c0909341SAndroid Build Coastguard Worker NULL);
247*c0909341SAndroid Build Coastguard Worker if (res) return res;
248*c0909341SAndroid Build Coastguard Worker
249*c0909341SAndroid Build Coastguard Worker dav1d_picture_copy_props(dst, src->content_light, src->content_light_ref,
250*c0909341SAndroid Build Coastguard Worker src->mastering_display, src->mastering_display_ref,
251*c0909341SAndroid Build Coastguard Worker src->itut_t35, src->itut_t35_ref, src->n_itut_t35,
252*c0909341SAndroid Build Coastguard Worker &src->m);
253*c0909341SAndroid Build Coastguard Worker
254*c0909341SAndroid Build Coastguard Worker return 0;
255*c0909341SAndroid Build Coastguard Worker }
256*c0909341SAndroid Build Coastguard Worker
dav1d_picture_ref(Dav1dPicture * const dst,const Dav1dPicture * const src)257*c0909341SAndroid Build Coastguard Worker void dav1d_picture_ref(Dav1dPicture *const dst, const Dav1dPicture *const src) {
258*c0909341SAndroid Build Coastguard Worker assert(dst != NULL);
259*c0909341SAndroid Build Coastguard Worker assert(dst->data[0] == NULL);
260*c0909341SAndroid Build Coastguard Worker assert(src != NULL);
261*c0909341SAndroid Build Coastguard Worker
262*c0909341SAndroid Build Coastguard Worker if (src->ref) {
263*c0909341SAndroid Build Coastguard Worker assert(src->data[0] != NULL);
264*c0909341SAndroid Build Coastguard Worker dav1d_ref_inc(src->ref);
265*c0909341SAndroid Build Coastguard Worker }
266*c0909341SAndroid Build Coastguard Worker if (src->frame_hdr_ref) dav1d_ref_inc(src->frame_hdr_ref);
267*c0909341SAndroid Build Coastguard Worker if (src->seq_hdr_ref) dav1d_ref_inc(src->seq_hdr_ref);
268*c0909341SAndroid Build Coastguard Worker if (src->m.user_data.ref) dav1d_ref_inc(src->m.user_data.ref);
269*c0909341SAndroid Build Coastguard Worker if (src->content_light_ref) dav1d_ref_inc(src->content_light_ref);
270*c0909341SAndroid Build Coastguard Worker if (src->mastering_display_ref) dav1d_ref_inc(src->mastering_display_ref);
271*c0909341SAndroid Build Coastguard Worker if (src->itut_t35_ref) dav1d_ref_inc(src->itut_t35_ref);
272*c0909341SAndroid Build Coastguard Worker *dst = *src;
273*c0909341SAndroid Build Coastguard Worker }
274*c0909341SAndroid Build Coastguard Worker
dav1d_picture_move_ref(Dav1dPicture * const dst,Dav1dPicture * const src)275*c0909341SAndroid Build Coastguard Worker void dav1d_picture_move_ref(Dav1dPicture *const dst, Dav1dPicture *const src) {
276*c0909341SAndroid Build Coastguard Worker assert(dst != NULL);
277*c0909341SAndroid Build Coastguard Worker assert(dst->data[0] == NULL);
278*c0909341SAndroid Build Coastguard Worker assert(src != NULL);
279*c0909341SAndroid Build Coastguard Worker
280*c0909341SAndroid Build Coastguard Worker if (src->ref)
281*c0909341SAndroid Build Coastguard Worker assert(src->data[0] != NULL);
282*c0909341SAndroid Build Coastguard Worker
283*c0909341SAndroid Build Coastguard Worker *dst = *src;
284*c0909341SAndroid Build Coastguard Worker memset(src, 0, sizeof(*src));
285*c0909341SAndroid Build Coastguard Worker }
286*c0909341SAndroid Build Coastguard Worker
dav1d_thread_picture_ref(Dav1dThreadPicture * const dst,const Dav1dThreadPicture * const src)287*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_ref(Dav1dThreadPicture *const dst,
288*c0909341SAndroid Build Coastguard Worker const Dav1dThreadPicture *const src)
289*c0909341SAndroid Build Coastguard Worker {
290*c0909341SAndroid Build Coastguard Worker dav1d_picture_ref(&dst->p, &src->p);
291*c0909341SAndroid Build Coastguard Worker dst->visible = src->visible;
292*c0909341SAndroid Build Coastguard Worker dst->showable = src->showable;
293*c0909341SAndroid Build Coastguard Worker dst->progress = src->progress;
294*c0909341SAndroid Build Coastguard Worker dst->flags = src->flags;
295*c0909341SAndroid Build Coastguard Worker }
296*c0909341SAndroid Build Coastguard Worker
dav1d_thread_picture_move_ref(Dav1dThreadPicture * const dst,Dav1dThreadPicture * const src)297*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_move_ref(Dav1dThreadPicture *const dst,
298*c0909341SAndroid Build Coastguard Worker Dav1dThreadPicture *const src)
299*c0909341SAndroid Build Coastguard Worker {
300*c0909341SAndroid Build Coastguard Worker dav1d_picture_move_ref(&dst->p, &src->p);
301*c0909341SAndroid Build Coastguard Worker dst->visible = src->visible;
302*c0909341SAndroid Build Coastguard Worker dst->showable = src->showable;
303*c0909341SAndroid Build Coastguard Worker dst->progress = src->progress;
304*c0909341SAndroid Build Coastguard Worker dst->flags = src->flags;
305*c0909341SAndroid Build Coastguard Worker memset(src, 0, sizeof(*src));
306*c0909341SAndroid Build Coastguard Worker }
307*c0909341SAndroid Build Coastguard Worker
dav1d_picture_unref_internal(Dav1dPicture * const p)308*c0909341SAndroid Build Coastguard Worker void dav1d_picture_unref_internal(Dav1dPicture *const p) {
309*c0909341SAndroid Build Coastguard Worker validate_input(p != NULL);
310*c0909341SAndroid Build Coastguard Worker
311*c0909341SAndroid Build Coastguard Worker if (p->ref) {
312*c0909341SAndroid Build Coastguard Worker validate_input(p->data[0] != NULL);
313*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->ref);
314*c0909341SAndroid Build Coastguard Worker }
315*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->seq_hdr_ref);
316*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->frame_hdr_ref);
317*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->m.user_data.ref);
318*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->content_light_ref);
319*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->mastering_display_ref);
320*c0909341SAndroid Build Coastguard Worker dav1d_ref_dec(&p->itut_t35_ref);
321*c0909341SAndroid Build Coastguard Worker memset(p, 0, sizeof(*p));
322*c0909341SAndroid Build Coastguard Worker dav1d_data_props_set_defaults(&p->m);
323*c0909341SAndroid Build Coastguard Worker }
324*c0909341SAndroid Build Coastguard Worker
dav1d_thread_picture_unref(Dav1dThreadPicture * const p)325*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_unref(Dav1dThreadPicture *const p) {
326*c0909341SAndroid Build Coastguard Worker dav1d_picture_unref_internal(&p->p);
327*c0909341SAndroid Build Coastguard Worker
328*c0909341SAndroid Build Coastguard Worker p->progress = NULL;
329*c0909341SAndroid Build Coastguard Worker }
330*c0909341SAndroid Build Coastguard Worker
dav1d_picture_get_event_flags(const Dav1dThreadPicture * const p)331*c0909341SAndroid Build Coastguard Worker enum Dav1dEventFlags dav1d_picture_get_event_flags(const Dav1dThreadPicture *const p) {
332*c0909341SAndroid Build Coastguard Worker if (!p->flags)
333*c0909341SAndroid Build Coastguard Worker return 0;
334*c0909341SAndroid Build Coastguard Worker
335*c0909341SAndroid Build Coastguard Worker enum Dav1dEventFlags flags = 0;
336*c0909341SAndroid Build Coastguard Worker if (p->flags & PICTURE_FLAG_NEW_SEQUENCE)
337*c0909341SAndroid Build Coastguard Worker flags |= DAV1D_EVENT_FLAG_NEW_SEQUENCE;
338*c0909341SAndroid Build Coastguard Worker if (p->flags & PICTURE_FLAG_NEW_OP_PARAMS_INFO)
339*c0909341SAndroid Build Coastguard Worker flags |= DAV1D_EVENT_FLAG_NEW_OP_PARAMS_INFO;
340*c0909341SAndroid Build Coastguard Worker
341*c0909341SAndroid Build Coastguard Worker return flags;
342*c0909341SAndroid Build Coastguard Worker }
343