1*c0909341SAndroid Build Coastguard Worker /* 2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018-2021, 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 #ifndef DAV1D_SRC_PICTURE_H 29*c0909341SAndroid Build Coastguard Worker #define DAV1D_SRC_PICTURE_H 30*c0909341SAndroid Build Coastguard Worker 31*c0909341SAndroid Build Coastguard Worker #include <stdatomic.h> 32*c0909341SAndroid Build Coastguard Worker 33*c0909341SAndroid Build Coastguard Worker #include "src/thread.h" 34*c0909341SAndroid Build Coastguard Worker #include "dav1d/picture.h" 35*c0909341SAndroid Build Coastguard Worker 36*c0909341SAndroid Build Coastguard Worker #include "src/thread_data.h" 37*c0909341SAndroid Build Coastguard Worker #include "src/ref.h" 38*c0909341SAndroid Build Coastguard Worker 39*c0909341SAndroid Build Coastguard Worker enum PlaneType { 40*c0909341SAndroid Build Coastguard Worker PLANE_TYPE_Y, 41*c0909341SAndroid Build Coastguard Worker PLANE_TYPE_UV, 42*c0909341SAndroid Build Coastguard Worker PLANE_TYPE_BLOCK, 43*c0909341SAndroid Build Coastguard Worker PLANE_TYPE_ALL, 44*c0909341SAndroid Build Coastguard Worker }; 45*c0909341SAndroid Build Coastguard Worker 46*c0909341SAndroid Build Coastguard Worker enum PictureFlags { 47*c0909341SAndroid Build Coastguard Worker PICTURE_FLAG_NEW_SEQUENCE = 1 << 0, 48*c0909341SAndroid Build Coastguard Worker PICTURE_FLAG_NEW_OP_PARAMS_INFO = 1 << 1, 49*c0909341SAndroid Build Coastguard Worker PICTURE_FLAG_NEW_TEMPORAL_UNIT = 1 << 2, 50*c0909341SAndroid Build Coastguard Worker }; 51*c0909341SAndroid Build Coastguard Worker 52*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dThreadPicture { 53*c0909341SAndroid Build Coastguard Worker Dav1dPicture p; 54*c0909341SAndroid Build Coastguard Worker int visible; 55*c0909341SAndroid Build Coastguard Worker // This can be set for inter frames, non-key intra frames, or for invisible 56*c0909341SAndroid Build Coastguard Worker // keyframes that have not yet been made visible using the show-existing-frame 57*c0909341SAndroid Build Coastguard Worker // mechanism. 58*c0909341SAndroid Build Coastguard Worker int showable; 59*c0909341SAndroid Build Coastguard Worker enum PictureFlags flags; 60*c0909341SAndroid Build Coastguard Worker // [0] block data (including segmentation map and motion vectors) 61*c0909341SAndroid Build Coastguard Worker // [1] pixel data 62*c0909341SAndroid Build Coastguard Worker atomic_uint *progress; 63*c0909341SAndroid Build Coastguard Worker } Dav1dThreadPicture; 64*c0909341SAndroid Build Coastguard Worker 65*c0909341SAndroid Build Coastguard Worker typedef struct Dav1dPictureBuffer { 66*c0909341SAndroid Build Coastguard Worker void *data; 67*c0909341SAndroid Build Coastguard Worker struct Dav1dPictureBuffer *next; 68*c0909341SAndroid Build Coastguard Worker } Dav1dPictureBuffer; 69*c0909341SAndroid Build Coastguard Worker 70*c0909341SAndroid Build Coastguard Worker /* 71*c0909341SAndroid Build Coastguard Worker * Allocate a picture with custom border size. 72*c0909341SAndroid Build Coastguard Worker */ 73*c0909341SAndroid Build Coastguard Worker int dav1d_thread_picture_alloc(Dav1dContext *c, Dav1dFrameContext *f, const int bpc); 74*c0909341SAndroid Build Coastguard Worker 75*c0909341SAndroid Build Coastguard Worker /** 76*c0909341SAndroid Build Coastguard Worker * Allocate a picture with identical metadata to an existing picture. 77*c0909341SAndroid Build Coastguard Worker * The width is a separate argument so this function can be used for 78*c0909341SAndroid Build Coastguard Worker * super-res, where the width changes, but everything else is the same. 79*c0909341SAndroid Build Coastguard Worker * For the more typical use case of allocating a new image of the same 80*c0909341SAndroid Build Coastguard Worker * dimensions, use src->p.w as width. 81*c0909341SAndroid Build Coastguard Worker */ 82*c0909341SAndroid Build Coastguard Worker int dav1d_picture_alloc_copy(Dav1dContext *c, Dav1dPicture *dst, const int w, 83*c0909341SAndroid Build Coastguard Worker const Dav1dPicture *src); 84*c0909341SAndroid Build Coastguard Worker 85*c0909341SAndroid Build Coastguard Worker /** 86*c0909341SAndroid Build Coastguard Worker * Create a copy of a picture. 87*c0909341SAndroid Build Coastguard Worker */ 88*c0909341SAndroid Build Coastguard Worker void dav1d_picture_ref(Dav1dPicture *dst, const Dav1dPicture *src); 89*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_ref(Dav1dThreadPicture *dst, 90*c0909341SAndroid Build Coastguard Worker const Dav1dThreadPicture *src); 91*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_move_ref(Dav1dThreadPicture *dst, 92*c0909341SAndroid Build Coastguard Worker Dav1dThreadPicture *src); 93*c0909341SAndroid Build Coastguard Worker void dav1d_thread_picture_unref(Dav1dThreadPicture *p); 94*c0909341SAndroid Build Coastguard Worker 95*c0909341SAndroid Build Coastguard Worker /** 96*c0909341SAndroid Build Coastguard Worker * Move a picture reference. 97*c0909341SAndroid Build Coastguard Worker */ 98*c0909341SAndroid Build Coastguard Worker void dav1d_picture_move_ref(Dav1dPicture *dst, Dav1dPicture *src); 99*c0909341SAndroid Build Coastguard Worker 100*c0909341SAndroid Build Coastguard Worker int dav1d_default_picture_alloc(Dav1dPicture *p, void *cookie); 101*c0909341SAndroid Build Coastguard Worker void dav1d_default_picture_release(Dav1dPicture *p, void *cookie); 102*c0909341SAndroid Build Coastguard Worker void dav1d_picture_unref_internal(Dav1dPicture *p); 103*c0909341SAndroid Build Coastguard Worker 104*c0909341SAndroid Build Coastguard Worker struct itut_t35_ctx_context { 105*c0909341SAndroid Build Coastguard Worker Dav1dITUTT35 *itut_t35; 106*c0909341SAndroid Build Coastguard Worker size_t n_itut_t35; 107*c0909341SAndroid Build Coastguard Worker Dav1dRef ref; 108*c0909341SAndroid Build Coastguard Worker }; 109*c0909341SAndroid Build Coastguard Worker 110*c0909341SAndroid Build Coastguard Worker void dav1d_picture_free_itut_t35(const uint8_t *data, void *user_data); 111*c0909341SAndroid Build Coastguard Worker void dav1d_picture_copy_props(Dav1dPicture *p, 112*c0909341SAndroid Build Coastguard Worker Dav1dContentLightLevel *content_light, Dav1dRef *content_light_ref, 113*c0909341SAndroid Build Coastguard Worker Dav1dMasteringDisplay *mastering_display, Dav1dRef *mastering_display_ref, 114*c0909341SAndroid Build Coastguard Worker Dav1dITUTT35 *itut_t35, Dav1dRef *itut_t35_ref, size_t n_itut_t35, 115*c0909341SAndroid Build Coastguard Worker const Dav1dDataProps *props); 116*c0909341SAndroid Build Coastguard Worker 117*c0909341SAndroid Build Coastguard Worker /** 118*c0909341SAndroid Build Coastguard Worker * Get event flags from picture flags. 119*c0909341SAndroid Build Coastguard Worker */ 120*c0909341SAndroid Build Coastguard Worker enum Dav1dEventFlags dav1d_picture_get_event_flags(const Dav1dThreadPicture *p); 121*c0909341SAndroid Build Coastguard Worker 122*c0909341SAndroid Build Coastguard Worker #endif /* DAV1D_SRC_PICTURE_H */ 123