Blame view

ffmpeg-4.2.2/libavutil/buffer_internal.h 2.71 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  /*
   * This file is part of FFmpeg.
   *
   * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVUTIL_BUFFER_INTERNAL_H
  #define AVUTIL_BUFFER_INTERNAL_H
  
  #include <stdatomic.h>
  #include <stdint.h>
  
  #include "buffer.h"
  #include "thread.h"
  
  /**
   * The buffer is always treated as read-only.
   */
  #define BUFFER_FLAG_READONLY      (1 << 0)
  /**
   * The buffer was av_realloc()ed, so it is reallocatable.
   */
  #define BUFFER_FLAG_REALLOCATABLE (1 << 1)
  
  struct AVBuffer {
      uint8_t *data; /**< data described by this buffer */
      int      size; /**< size of data in bytes */
  
      /**
       *  number of existing AVBufferRef instances referring to this buffer
       */
      atomic_uint refcount;
  
      /**
       * a callback for freeing the data
       */
      void (*free)(void *opaque, uint8_t *data);
  
      /**
       * an opaque pointer, to be used by the freeing callback
       */
      void *opaque;
  
      /**
       * A combination of BUFFER_FLAG_*
       */
      int flags;
  };
  
  typedef struct BufferPoolEntry {
      uint8_t *data;
  
      /*
       * Backups of the original opaque/free of the AVBuffer corresponding to
       * data. They will be used to free the buffer when the pool is freed.
       */
      void *opaque;
      void (*free)(void *opaque, uint8_t *data);
  
      AVBufferPool *pool;
      struct BufferPoolEntry *next;
  } BufferPoolEntry;
  
  struct AVBufferPool {
      AVMutex mutex;
      BufferPoolEntry *pool;
  
      /*
       * This is used to track when the pool is to be freed.
       * The pointer to the pool itself held by the caller is considered to
       * be one reference. Each buffer requested by the caller increases refcount
       * by one, returning the buffer to the pool decreases it by one.
       * refcount reaches zero when the buffer has been uninited AND all the
       * buffers have been released, then it's safe to free the pool and all
       * the buffers in it.
       */
      atomic_uint refcount;
  
      int size;
      void *opaque;
      AVBufferRef* (*alloc)(int size);
      AVBufferRef* (*alloc2)(void *opaque, int size);
      void         (*pool_free)(void *opaque);
  };
  
  #endif /* AVUTIL_BUFFER_INTERNAL_H */