Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * AVPacket functions for libavcodec | ||
3 | * Copyright (c) 2000, 2001, 2002 Fabrice Bellard | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | #include <string.h> | ||
23 | |||
24 | #include "libavutil/avassert.h" | ||
25 | #include "libavutil/avutil.h" | ||
26 | #include "libavutil/container_fifo.h" | ||
27 | #include "libavutil/intreadwrite.h" | ||
28 | #include "libavutil/mathematics.h" | ||
29 | #include "libavutil/mem.h" | ||
30 | #include "libavutil/rational.h" | ||
31 | |||
32 | #include "defs.h" | ||
33 | #include "packet.h" | ||
34 | #include "packet_internal.h" | ||
35 | |||
36 | #if FF_API_INIT_PACKET | ||
37 | 1366528 | void av_init_packet(AVPacket *pkt) | |
38 | { | ||
39 | 1366528 | pkt->pts = AV_NOPTS_VALUE; | |
40 | 1366528 | pkt->dts = AV_NOPTS_VALUE; | |
41 | 1366528 | pkt->pos = -1; | |
42 | 1366528 | pkt->duration = 0; | |
43 | 1366528 | pkt->flags = 0; | |
44 | 1366528 | pkt->stream_index = 0; | |
45 | 1366528 | pkt->buf = NULL; | |
46 | 1366528 | pkt->side_data = NULL; | |
47 | 1366528 | pkt->side_data_elems = 0; | |
48 | 1366528 | pkt->opaque = NULL; | |
49 | 1366528 | pkt->opaque_ref = NULL; | |
50 | 1366528 | pkt->time_base = av_make_q(0, 1); | |
51 | 1366528 | } | |
52 | #endif | ||
53 | |||
54 | 12488139 | static void get_packet_defaults(AVPacket *pkt) | |
55 | { | ||
56 | 12488139 | memset(pkt, 0, sizeof(*pkt)); | |
57 | |||
58 | 12488139 | pkt->pts = AV_NOPTS_VALUE; | |
59 | 12488139 | pkt->dts = AV_NOPTS_VALUE; | |
60 | 12488139 | pkt->pos = -1; | |
61 | 12488139 | pkt->time_base = av_make_q(0, 1); | |
62 | 12488139 | } | |
63 | |||
64 | 290720 | AVPacket *av_packet_alloc(void) | |
65 | { | ||
66 | 290720 | AVPacket *pkt = av_malloc(sizeof(AVPacket)); | |
67 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 290720 times.
|
290720 | if (!pkt) |
68 | ✗ | return pkt; | |
69 | |||
70 | 290720 | get_packet_defaults(pkt); | |
71 | |||
72 | 290720 | return pkt; | |
73 | } | ||
74 | |||
75 | 369094 | void av_packet_free(AVPacket **pkt) | |
76 | { | ||
77 |
3/4✓ Branch 0 taken 369094 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 78374 times.
✓ Branch 3 taken 290720 times.
|
369094 | if (!pkt || !*pkt) |
78 | 78374 | return; | |
79 | |||
80 | 290720 | av_packet_unref(*pkt); | |
81 | 290720 | av_freep(pkt); | |
82 | } | ||
83 | |||
84 | 892045 | static int packet_alloc(AVBufferRef **buf, int size) | |
85 | { | ||
86 | int ret; | ||
87 |
3/4✓ Branch 0 taken 892045 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 892044 times.
|
892045 | if (size < 0 || size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) |
88 | 1 | return AVERROR(EINVAL); | |
89 | |||
90 | 892044 | ret = av_buffer_realloc(buf, size + AV_INPUT_BUFFER_PADDING_SIZE); | |
91 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 892044 times.
|
892044 | if (ret < 0) |
92 | ✗ | return ret; | |
93 | |||
94 | 892044 | memset((*buf)->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); | |
95 | |||
96 | 892044 | return 0; | |
97 | } | ||
98 | |||
99 | 769997 | int av_new_packet(AVPacket *pkt, int size) | |
100 | { | ||
101 | 769997 | AVBufferRef *buf = NULL; | |
102 | 769997 | int ret = packet_alloc(&buf, size); | |
103 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 769996 times.
|
769997 | if (ret < 0) |
104 | 1 | return ret; | |
105 | |||
106 | 769996 | get_packet_defaults(pkt); | |
107 | 769996 | pkt->buf = buf; | |
108 | 769996 | pkt->data = buf->data; | |
109 | 769996 | pkt->size = size; | |
110 | |||
111 | 769996 | return 0; | |
112 | } | ||
113 | |||
114 | 599514 | void av_shrink_packet(AVPacket *pkt, int size) | |
115 | { | ||
116 |
2/2✓ Branch 0 taken 594044 times.
✓ Branch 1 taken 5470 times.
|
599514 | if (pkt->size <= size) |
117 | 594044 | return; | |
118 | 5470 | pkt->size = size; | |
119 | 5470 | memset(pkt->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); | |
120 | } | ||
121 | |||
122 | 278772 | int av_grow_packet(AVPacket *pkt, int grow_by) | |
123 | { | ||
124 | int new_size; | ||
125 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 278772 times.
|
278772 | av_assert0((unsigned)pkt->size <= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE); |
126 | 278772 | if ((unsigned)grow_by > | |
127 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 278771 times.
|
278772 | INT_MAX - (pkt->size + AV_INPUT_BUFFER_PADDING_SIZE)) |
128 | 1 | return AVERROR(ENOMEM); | |
129 | |||
130 | 278771 | new_size = pkt->size + grow_by + AV_INPUT_BUFFER_PADDING_SIZE; | |
131 |
2/2✓ Branch 0 taken 11737 times.
✓ Branch 1 taken 267034 times.
|
278771 | if (pkt->buf) { |
132 | size_t data_offset; | ||
133 | 11737 | uint8_t *old_data = pkt->data; | |
134 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11737 times.
|
11737 | if (pkt->data == NULL) { |
135 | ✗ | data_offset = 0; | |
136 | ✗ | pkt->data = pkt->buf->data; | |
137 | } else { | ||
138 | 11737 | data_offset = pkt->data - pkt->buf->data; | |
139 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11737 times.
|
11737 | if (data_offset > INT_MAX - new_size) |
140 | ✗ | return AVERROR(ENOMEM); | |
141 | } | ||
142 | |||
143 |
3/4✓ Branch 0 taken 1774 times.
✓ Branch 1 taken 9963 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1774 times.
|
13511 | if (new_size + data_offset > pkt->buf->size || |
144 | 1774 | !av_buffer_is_writable(pkt->buf)) { | |
145 | int ret; | ||
146 | |||
147 | // allocate slightly more than requested to avoid excessive | ||
148 | // reallocations | ||
149 |
1/2✓ Branch 0 taken 9963 times.
✗ Branch 1 not taken.
|
9963 | if (new_size + data_offset < INT_MAX - new_size/16) |
150 | 9963 | new_size += new_size/16; | |
151 | |||
152 | 9963 | ret = av_buffer_realloc(&pkt->buf, new_size + data_offset); | |
153 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9963 times.
|
9963 | if (ret < 0) { |
154 | ✗ | pkt->data = old_data; | |
155 | ✗ | return ret; | |
156 | } | ||
157 | 9963 | pkt->data = pkt->buf->data + data_offset; | |
158 | } | ||
159 | } else { | ||
160 | 267034 | pkt->buf = av_buffer_alloc(new_size); | |
161 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 267034 times.
|
267034 | if (!pkt->buf) |
162 | ✗ | return AVERROR(ENOMEM); | |
163 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 267034 times.
|
267034 | if (pkt->size > 0) |
164 | ✗ | memcpy(pkt->buf->data, pkt->data, pkt->size); | |
165 | 267034 | pkt->data = pkt->buf->data; | |
166 | } | ||
167 | 278771 | pkt->size += grow_by; | |
168 | 278771 | memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE); | |
169 | |||
170 | 278771 | return 0; | |
171 | } | ||
172 | |||
173 | 29 | int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size) | |
174 | { | ||
175 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
|
29 | if (size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) |
176 | 1 | return AVERROR(EINVAL); | |
177 | |||
178 | 28 | pkt->buf = av_buffer_create(data, size + AV_INPUT_BUFFER_PADDING_SIZE, | |
179 | av_buffer_default_free, NULL, 0); | ||
180 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 28 times.
|
28 | if (!pkt->buf) |
181 | ✗ | return AVERROR(ENOMEM); | |
182 | |||
183 | 28 | pkt->data = data; | |
184 | 28 | pkt->size = size; | |
185 | |||
186 | 28 | return 0; | |
187 | } | ||
188 | |||
189 | 7825521 | void av_packet_free_side_data(AVPacket *pkt) | |
190 | { | ||
191 | int i; | ||
192 |
2/2✓ Branch 0 taken 57281 times.
✓ Branch 1 taken 7825521 times.
|
7882802 | for (i = 0; i < pkt->side_data_elems; i++) |
193 | 57281 | av_freep(&pkt->side_data[i].data); | |
194 | 7825521 | av_freep(&pkt->side_data); | |
195 | 7825521 | pkt->side_data_elems = 0; | |
196 | 7825521 | } | |
197 | |||
198 | 57283 | int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, | |
199 | uint8_t *data, size_t size) | ||
200 | { | ||
201 | AVPacketSideData *tmp; | ||
202 | 57283 | int i, elems = pkt->side_data_elems; | |
203 | |||
204 |
2/2✓ Branch 0 taken 215 times.
✓ Branch 1 taken 57282 times.
|
57497 | for (i = 0; i < elems; i++) { |
205 | 215 | AVPacketSideData *sd = &pkt->side_data[i]; | |
206 | |||
207 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 214 times.
|
215 | if (sd->type == type) { |
208 | 1 | av_free(sd->data); | |
209 | 1 | sd->data = data; | |
210 | 1 | sd->size = size; | |
211 | 1 | return 0; | |
212 | } | ||
213 | } | ||
214 | |||
215 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 57282 times.
|
57282 | if ((unsigned)elems + 1 > AV_PKT_DATA_NB) |
216 | ✗ | return AVERROR(ERANGE); | |
217 | |||
218 | 57282 | tmp = av_realloc(pkt->side_data, (elems + 1) * sizeof(*tmp)); | |
219 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 57282 times.
|
57282 | if (!tmp) |
220 | ✗ | return AVERROR(ENOMEM); | |
221 | |||
222 | 57282 | pkt->side_data = tmp; | |
223 | 57282 | pkt->side_data[elems].data = data; | |
224 | 57282 | pkt->side_data[elems].size = size; | |
225 | 57282 | pkt->side_data[elems].type = type; | |
226 | 57282 | pkt->side_data_elems++; | |
227 | |||
228 | 57282 | return 0; | |
229 | } | ||
230 | |||
231 | |||
232 | 55827 | uint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, | |
233 | size_t size) | ||
234 | { | ||
235 | int ret; | ||
236 | uint8_t *data; | ||
237 | |||
238 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 55827 times.
|
55827 | if (size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) |
239 | ✗ | return NULL; | |
240 | 55827 | data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE); | |
241 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 55827 times.
|
55827 | if (!data) |
242 | ✗ | return NULL; | |
243 | |||
244 | 55827 | ret = av_packet_add_side_data(pkt, type, data, size); | |
245 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 55827 times.
|
55827 | if (ret < 0) { |
246 | ✗ | av_freep(&data); | |
247 | ✗ | return NULL; | |
248 | } | ||
249 | |||
250 | 55827 | return data; | |
251 | } | ||
252 | |||
253 | 1192555 | uint8_t *av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, | |
254 | size_t *size) | ||
255 | { | ||
256 | int i; | ||
257 | |||
258 |
2/2✓ Branch 0 taken 32782 times.
✓ Branch 1 taken 1178970 times.
|
1211752 | for (i = 0; i < pkt->side_data_elems; i++) { |
259 |
2/2✓ Branch 0 taken 13585 times.
✓ Branch 1 taken 19197 times.
|
32782 | if (pkt->side_data[i].type == type) { |
260 |
2/2✓ Branch 0 taken 1081 times.
✓ Branch 1 taken 12504 times.
|
13585 | if (size) |
261 | 1081 | *size = pkt->side_data[i].size; | |
262 | 13585 | return pkt->side_data[i].data; | |
263 | } | ||
264 | } | ||
265 |
2/2✓ Branch 0 taken 1012650 times.
✓ Branch 1 taken 166320 times.
|
1178970 | if (size) |
266 | 1012650 | *size = 0; | |
267 | 1178970 | return NULL; | |
268 | } | ||
269 | |||
270 | 3832 | const char *av_packet_side_data_name(enum AVPacketSideDataType type) | |
271 | { | ||
272 |
23/42✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 47 times.
✓ Branch 6 taken 485 times.
✓ Branch 7 taken 16 times.
✓ Branch 8 taken 1071 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 341 times.
✓ Branch 11 taken 34 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 162 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 7 times.
✓ Branch 16 taken 12 times.
✓ Branch 17 taken 24 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1464 times.
✓ Branch 20 taken 29 times.
✓ Branch 21 taken 25 times.
✓ Branch 22 taken 22 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 8 times.
✓ Branch 29 taken 15 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✓ Branch 32 taken 8 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 21 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 22 times.
✗ Branch 41 not taken.
|
3832 | switch(type) { |
273 | ✗ | case AV_PKT_DATA_PALETTE: return "Palette"; | |
274 | 11 | case AV_PKT_DATA_NEW_EXTRADATA: return "New Extradata"; | |
275 | ✗ | case AV_PKT_DATA_PARAM_CHANGE: return "Param Change"; | |
276 | ✗ | case AV_PKT_DATA_H263_MB_INFO: return "H263 MB Info"; | |
277 | ✗ | case AV_PKT_DATA_REPLAYGAIN: return "Replay Gain"; | |
278 | 47 | case AV_PKT_DATA_DISPLAYMATRIX: return "Display Matrix"; | |
279 | 485 | case AV_PKT_DATA_STEREO3D: return "Stereo 3D"; | |
280 | 16 | case AV_PKT_DATA_AUDIO_SERVICE_TYPE: return "Audio Service Type"; | |
281 | 1071 | case AV_PKT_DATA_QUALITY_STATS: return "Quality stats"; | |
282 | ✗ | case AV_PKT_DATA_FALLBACK_TRACK: return "Fallback track"; | |
283 | 341 | case AV_PKT_DATA_CPB_PROPERTIES: return "CPB properties"; | |
284 | 34 | case AV_PKT_DATA_SKIP_SAMPLES: return "Skip Samples"; | |
285 | ✗ | case AV_PKT_DATA_JP_DUALMONO: return "JP Dual Mono"; | |
286 | 162 | case AV_PKT_DATA_STRINGS_METADATA: return "Strings Metadata"; | |
287 | ✗ | case AV_PKT_DATA_SUBTITLE_POSITION: return "Subtitle Position"; | |
288 | 7 | case AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL: return "Matroska BlockAdditional"; | |
289 | 12 | case AV_PKT_DATA_WEBVTT_IDENTIFIER: return "WebVTT ID"; | |
290 | 24 | case AV_PKT_DATA_WEBVTT_SETTINGS: return "WebVTT Settings"; | |
291 | ✗ | case AV_PKT_DATA_METADATA_UPDATE: return "Metadata Update"; | |
292 | 1464 | case AV_PKT_DATA_MPEGTS_STREAM_ID: return "MPEGTS Stream ID"; | |
293 | 29 | case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata"; | |
294 | 25 | case AV_PKT_DATA_CONTENT_LIGHT_LEVEL: return "Content light level metadata"; | |
295 | 22 | case AV_PKT_DATA_SPHERICAL: return "Spherical Mapping"; | |
296 | ✗ | case AV_PKT_DATA_A53_CC: return "A53 Closed Captions"; | |
297 | 2 | case AV_PKT_DATA_ENCRYPTION_INIT_INFO: return "Encryption initialization data"; | |
298 | ✗ | case AV_PKT_DATA_ENCRYPTION_INFO: return "Encryption info"; | |
299 | ✗ | case AV_PKT_DATA_AFD: return "Active Format Description data"; | |
300 | ✗ | case AV_PKT_DATA_PRFT: return "Producer Reference Time"; | |
301 | 8 | case AV_PKT_DATA_ICC_PROFILE: return "ICC Profile"; | |
302 | 15 | case AV_PKT_DATA_DOVI_CONF: return "DOVI configuration record"; | |
303 | ✗ | case AV_PKT_DATA_S12M_TIMECODE: return "SMPTE ST 12-1:2014 timecode"; | |
304 | 4 | case AV_PKT_DATA_DYNAMIC_HDR10_PLUS: return "HDR10+ Dynamic Metadata (SMPTE 2094-40)"; | |
305 | 8 | case AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT:return "Ambient viewing environment"; | |
306 | ✗ | case AV_PKT_DATA_IAMF_MIX_GAIN_PARAM: return "IAMF Mix Gain Parameter Data"; | |
307 | ✗ | case AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM: return "IAMF Demixing Info Parameter Data"; | |
308 | ✗ | case AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM: return "IAMF Recon Gain Info Parameter Data"; | |
309 | 21 | case AV_PKT_DATA_FRAME_CROPPING: return "Frame Cropping"; | |
310 | ✗ | case AV_PKT_DATA_LCEVC: return "LCEVC NAL data"; | |
311 | 2 | case AV_PKT_DATA_3D_REFERENCE_DISPLAYS: return "3D Reference Displays Info"; | |
312 | ✗ | case AV_PKT_DATA_RTCP_SR: return "RTCP Sender Report"; | |
313 | 22 | case AV_PKT_DATA_EXIF: return "EXIF metadata"; | |
314 | } | ||
315 | ✗ | return NULL; | |
316 | } | ||
317 | |||
318 | 620 | uint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size) | |
319 | { | ||
320 | 620 | uint8_t *data = NULL; | |
321 | 620 | *size = 0; | |
322 | |||
323 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 620 times.
|
620 | if (!dict) |
324 | ✗ | return NULL; | |
325 | |||
326 |
1/2✓ Branch 0 taken 1240 times.
✗ Branch 1 not taken.
|
1240 | for (int pass = 0; pass < 2; pass++) { |
327 | 1240 | const AVDictionaryEntry *t = NULL; | |
328 | 1240 | size_t total_length = 0; | |
329 | |||
330 |
2/2✓ Branch 1 taken 5000 times.
✓ Branch 2 taken 1240 times.
|
6240 | while ((t = av_dict_iterate(dict, t))) { |
331 |
2/2✓ Branch 0 taken 10000 times.
✓ Branch 1 taken 5000 times.
|
15000 | for (int i = 0; i < 2; i++) { |
332 |
2/2✓ Branch 0 taken 5000 times.
✓ Branch 1 taken 5000 times.
|
10000 | const char *str = i ? t->value : t->key; |
333 | 10000 | const size_t len = strlen(str) + 1; | |
334 | |||
335 |
2/2✓ Branch 0 taken 5000 times.
✓ Branch 1 taken 5000 times.
|
10000 | if (pass) |
336 | 5000 | memcpy(data + total_length, str, len); | |
337 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5000 times.
|
5000 | else if (len > SIZE_MAX - total_length) |
338 | ✗ | return NULL; | |
339 | 10000 | total_length += len; | |
340 | } | ||
341 | } | ||
342 |
2/2✓ Branch 0 taken 620 times.
✓ Branch 1 taken 620 times.
|
1240 | if (pass) |
343 | 620 | break; | |
344 | 620 | data = av_malloc(total_length); | |
345 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 620 times.
|
620 | if (!data) |
346 | ✗ | return NULL; | |
347 | 620 | *size = total_length; | |
348 | } | ||
349 | |||
350 | 620 | return data; | |
351 | } | ||
352 | |||
353 | 415650 | int av_packet_unpack_dictionary(const uint8_t *data, size_t size, | |
354 | AVDictionary **dict) | ||
355 | { | ||
356 | const uint8_t *end; | ||
357 | int ret; | ||
358 | |||
359 |
4/6✓ Branch 0 taken 415650 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 560 times.
✓ Branch 3 taken 415090 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 560 times.
|
415650 | if (!dict || !data || !size) |
360 | 415090 | return 0; | |
361 | 560 | end = data + size; | |
362 |
2/4✓ Branch 0 taken 560 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 560 times.
|
560 | if (size && end[-1]) |
363 | ✗ | return AVERROR_INVALIDDATA; | |
364 |
2/2✓ Branch 0 taken 2399 times.
✓ Branch 1 taken 560 times.
|
2959 | while (data < end) { |
365 | 2399 | const uint8_t *key = data; | |
366 | 2399 | const uint8_t *val = data + strlen(key) + 1; | |
367 | |||
368 |
2/4✓ Branch 0 taken 2399 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2399 times.
|
2399 | if (val >= end || !*key) |
369 | ✗ | return AVERROR_INVALIDDATA; | |
370 | |||
371 | 2399 | ret = av_dict_set(dict, key, val, 0); | |
372 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2399 times.
|
2399 | if (ret < 0) |
373 | ✗ | return ret; | |
374 | 2399 | data = val + strlen(val) + 1; | |
375 | } | ||
376 | |||
377 | 560 | return 0; | |
378 | } | ||
379 | |||
380 | ✗ | int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, | |
381 | size_t size) | ||
382 | { | ||
383 | int i; | ||
384 | |||
385 | ✗ | for (i = 0; i < pkt->side_data_elems; i++) { | |
386 | ✗ | if (pkt->side_data[i].type == type) { | |
387 | ✗ | if (size > pkt->side_data[i].size) | |
388 | ✗ | return AVERROR(ENOMEM); | |
389 | ✗ | pkt->side_data[i].size = size; | |
390 | ✗ | return 0; | |
391 | } | ||
392 | } | ||
393 | ✗ | return AVERROR(ENOENT); | |
394 | } | ||
395 | |||
396 | 814036 | int av_packet_copy_props(AVPacket *dst, const AVPacket *src) | |
397 | { | ||
398 | int i, ret; | ||
399 | |||
400 | 814036 | dst->pts = src->pts; | |
401 | 814036 | dst->dts = src->dts; | |
402 | 814036 | dst->pos = src->pos; | |
403 | 814036 | dst->duration = src->duration; | |
404 | 814036 | dst->flags = src->flags; | |
405 | 814036 | dst->stream_index = src->stream_index; | |
406 | 814036 | dst->opaque = src->opaque; | |
407 | 814036 | dst->time_base = src->time_base; | |
408 | 814036 | dst->opaque_ref = NULL; | |
409 | 814036 | dst->side_data = NULL; | |
410 | 814036 | dst->side_data_elems = 0; | |
411 | |||
412 | 814036 | ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); | |
413 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 814036 times.
|
814036 | if (ret < 0) |
414 | ✗ | return ret; | |
415 | |||
416 |
2/2✓ Branch 0 taken 12909 times.
✓ Branch 1 taken 814036 times.
|
826945 | for (i = 0; i < src->side_data_elems; i++) { |
417 | 12909 | enum AVPacketSideDataType type = src->side_data[i].type; | |
418 | 12909 | size_t size = src->side_data[i].size; | |
419 | 12909 | uint8_t *src_data = src->side_data[i].data; | |
420 | 12909 | uint8_t *dst_data = av_packet_new_side_data(dst, type, size); | |
421 | |||
422 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12909 times.
|
12909 | if (!dst_data) { |
423 | ✗ | av_buffer_unref(&dst->opaque_ref); | |
424 | ✗ | av_packet_free_side_data(dst); | |
425 | ✗ | return AVERROR(ENOMEM); | |
426 | } | ||
427 | 12909 | memcpy(dst_data, src_data, size); | |
428 | } | ||
429 | |||
430 | 814036 | return 0; | |
431 | } | ||
432 | |||
433 | 7825521 | void av_packet_unref(AVPacket *pkt) | |
434 | { | ||
435 | 7825521 | av_packet_free_side_data(pkt); | |
436 | 7825521 | av_buffer_unref(&pkt->opaque_ref); | |
437 | 7825521 | av_buffer_unref(&pkt->buf); | |
438 | 7825521 | get_packet_defaults(pkt); | |
439 | 7825521 | } | |
440 | |||
441 | 404140 | int av_packet_ref(AVPacket *dst, const AVPacket *src) | |
442 | { | ||
443 | int ret; | ||
444 | |||
445 | 404140 | dst->buf = NULL; | |
446 | |||
447 | 404140 | ret = av_packet_copy_props(dst, src); | |
448 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 404140 times.
|
404140 | if (ret < 0) |
449 | ✗ | goto fail; | |
450 | |||
451 |
2/2✓ Branch 0 taken 1030 times.
✓ Branch 1 taken 403110 times.
|
404140 | if (!src->buf) { |
452 | 1030 | ret = packet_alloc(&dst->buf, src->size); | |
453 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1030 times.
|
1030 | if (ret < 0) |
454 | ✗ | goto fail; | |
455 | av_assert1(!src->size || src->data); | ||
456 |
1/2✓ Branch 0 taken 1030 times.
✗ Branch 1 not taken.
|
1030 | if (src->size) |
457 | 1030 | memcpy(dst->buf->data, src->data, src->size); | |
458 | |||
459 | 1030 | dst->data = dst->buf->data; | |
460 | } else { | ||
461 | 403110 | dst->buf = av_buffer_ref(src->buf); | |
462 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 403110 times.
|
403110 | if (!dst->buf) { |
463 | ✗ | ret = AVERROR(ENOMEM); | |
464 | ✗ | goto fail; | |
465 | } | ||
466 | 403110 | dst->data = src->data; | |
467 | } | ||
468 | |||
469 | 404140 | dst->size = src->size; | |
470 | |||
471 | 404140 | return 0; | |
472 | ✗ | fail: | |
473 | ✗ | av_packet_unref(dst); | |
474 | ✗ | return ret; | |
475 | } | ||
476 | |||
477 | 6 | AVPacket *av_packet_clone(const AVPacket *src) | |
478 | { | ||
479 | 6 | AVPacket *ret = av_packet_alloc(); | |
480 | |||
481 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | if (!ret) |
482 | ✗ | return ret; | |
483 | |||
484 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
|
6 | if (av_packet_ref(ret, src)) |
485 | ✗ | av_packet_free(&ret); | |
486 | |||
487 | 6 | return ret; | |
488 | } | ||
489 | |||
490 | 3601776 | void av_packet_move_ref(AVPacket *dst, AVPacket *src) | |
491 | { | ||
492 | 3601776 | *dst = *src; | |
493 | 3601776 | get_packet_defaults(src); | |
494 | 3601776 | } | |
495 | |||
496 | 2080076 | int av_packet_make_refcounted(AVPacket *pkt) | |
497 | { | ||
498 | int ret; | ||
499 | |||
500 |
2/2✓ Branch 0 taken 1959058 times.
✓ Branch 1 taken 121018 times.
|
2080076 | if (pkt->buf) |
501 | 1959058 | return 0; | |
502 | |||
503 | 121018 | ret = packet_alloc(&pkt->buf, pkt->size); | |
504 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 121018 times.
|
121018 | if (ret < 0) |
505 | ✗ | return ret; | |
506 | av_assert1(!pkt->size || pkt->data); | ||
507 |
2/2✓ Branch 0 taken 119462 times.
✓ Branch 1 taken 1556 times.
|
121018 | if (pkt->size) |
508 | 119462 | memcpy(pkt->buf->data, pkt->data, pkt->size); | |
509 | |||
510 | 121018 | pkt->data = pkt->buf->data; | |
511 | |||
512 | 121018 | return 0; | |
513 | } | ||
514 | |||
515 | 142 | int av_packet_make_writable(AVPacket *pkt) | |
516 | { | ||
517 | 142 | AVBufferRef *buf = NULL; | |
518 | int ret; | ||
519 | |||
520 |
2/4✓ Branch 0 taken 142 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 142 times.
✗ Branch 4 not taken.
|
142 | if (pkt->buf && av_buffer_is_writable(pkt->buf)) |
521 | 142 | return 0; | |
522 | |||
523 | ✗ | ret = packet_alloc(&buf, pkt->size); | |
524 | ✗ | if (ret < 0) | |
525 | ✗ | return ret; | |
526 | av_assert1(!pkt->size || pkt->data); | ||
527 | ✗ | if (pkt->size) | |
528 | ✗ | memcpy(buf->data, pkt->data, pkt->size); | |
529 | |||
530 | ✗ | av_buffer_unref(&pkt->buf); | |
531 | ✗ | pkt->buf = buf; | |
532 | ✗ | pkt->data = buf->data; | |
533 | |||
534 | ✗ | return 0; | |
535 | } | ||
536 | |||
537 | 478646 | void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb) | |
538 | { | ||
539 |
2/2✓ Branch 0 taken 463319 times.
✓ Branch 1 taken 15327 times.
|
478646 | if (pkt->pts != AV_NOPTS_VALUE) |
540 | 463319 | pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb); | |
541 |
2/2✓ Branch 0 taken 478630 times.
✓ Branch 1 taken 16 times.
|
478646 | if (pkt->dts != AV_NOPTS_VALUE) |
542 | 478630 | pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb); | |
543 |
2/2✓ Branch 0 taken 459527 times.
✓ Branch 1 taken 19119 times.
|
478646 | if (pkt->duration > 0) |
544 | 459527 | pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb); | |
545 | 478646 | } | |
546 | |||
547 | 435471 | int avpriv_packet_list_put(PacketList *packet_buffer, | |
548 | AVPacket *pkt, | ||
549 | int (*copy)(AVPacket *dst, const AVPacket *src), | ||
550 | int flags) | ||
551 | { | ||
552 | 435471 | PacketListEntry *pktl = av_malloc(sizeof(*pktl)); | |
553 | 435471 | unsigned int update_end_point = 1; | |
554 | int ret; | ||
555 | |||
556 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 435471 times.
|
435471 | if (!pktl) |
557 | ✗ | return AVERROR(ENOMEM); | |
558 | |||
559 |
2/2✓ Branch 0 taken 126 times.
✓ Branch 1 taken 435345 times.
|
435471 | if (copy) { |
560 | 126 | get_packet_defaults(&pktl->pkt); | |
561 | 126 | ret = copy(&pktl->pkt, pkt); | |
562 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
|
126 | if (ret < 0) { |
563 | ✗ | av_free(pktl); | |
564 | ✗ | return ret; | |
565 | } | ||
566 | } else { | ||
567 | 435345 | ret = av_packet_make_refcounted(pkt); | |
568 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 435345 times.
|
435345 | if (ret < 0) { |
569 | ✗ | av_free(pktl); | |
570 | ✗ | return ret; | |
571 | } | ||
572 | 435345 | av_packet_move_ref(&pktl->pkt, pkt); | |
573 | } | ||
574 | |||
575 | 435471 | pktl->next = NULL; | |
576 | |||
577 |
2/2✓ Branch 0 taken 258581 times.
✓ Branch 1 taken 176890 times.
|
435471 | if (packet_buffer->head) { |
578 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 258561 times.
|
258581 | if (flags & FF_PACKETLIST_FLAG_PREPEND) { |
579 | 20 | pktl->next = packet_buffer->head; | |
580 | 20 | packet_buffer->head = pktl; | |
581 | 20 | update_end_point = 0; | |
582 | } else { | ||
583 | 258561 | packet_buffer->tail->next = pktl; | |
584 | } | ||
585 | } else | ||
586 | 176890 | packet_buffer->head = pktl; | |
587 | |||
588 |
2/2✓ Branch 0 taken 435451 times.
✓ Branch 1 taken 20 times.
|
435471 | if (update_end_point) { |
589 | /* Add the packet in the buffered packet list. */ | ||
590 | 435451 | packet_buffer->tail = pktl; | |
591 | } | ||
592 | |||
593 | 435471 | return 0; | |
594 | } | ||
595 | |||
596 | 402782 | int avpriv_packet_list_get(PacketList *pkt_buffer, | |
597 | AVPacket *pkt) | ||
598 | { | ||
599 | 402782 | PacketListEntry *pktl = pkt_buffer->head; | |
600 |
2/2✓ Branch 0 taken 54 times.
✓ Branch 1 taken 402728 times.
|
402782 | if (!pktl) |
601 | 54 | return AVERROR(EAGAIN); | |
602 | 402728 | *pkt = pktl->pkt; | |
603 | 402728 | pkt_buffer->head = pktl->next; | |
604 |
2/2✓ Branch 0 taken 172797 times.
✓ Branch 1 taken 229931 times.
|
402728 | if (!pkt_buffer->head) |
605 | 172797 | pkt_buffer->tail = NULL; | |
606 | 402728 | av_freep(&pktl); | |
607 | 402728 | return 0; | |
608 | } | ||
609 | |||
610 | 55600 | void avpriv_packet_list_free(PacketList *pkt_buf) | |
611 | { | ||
612 | 55600 | PacketListEntry *tmp = pkt_buf->head; | |
613 | |||
614 |
2/2✓ Branch 0 taken 61359 times.
✓ Branch 1 taken 55600 times.
|
116959 | while (tmp) { |
615 | 61359 | PacketListEntry *pktl = tmp; | |
616 | 61359 | tmp = pktl->next; | |
617 | 61359 | av_packet_unref(&pktl->pkt); | |
618 | 61359 | av_freep(&pktl); | |
619 | } | ||
620 | 55600 | pkt_buf->head = pkt_buf->tail = NULL; | |
621 | 55600 | } | |
622 | |||
623 | 12508 | int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type) | |
624 | { | ||
625 | uint8_t *side_data; | ||
626 | size_t side_data_size; | ||
627 | int i; | ||
628 | |||
629 | 12508 | side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, &side_data_size); | |
630 |
1/2✓ Branch 0 taken 12508 times.
✗ Branch 1 not taken.
|
12508 | if (!side_data) { |
631 | 12508 | side_data_size = 4+4+8*error_count; | |
632 | 12508 | side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, | |
633 | side_data_size); | ||
634 | } | ||
635 | |||
636 |
2/4✓ Branch 0 taken 12508 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12508 times.
|
12508 | if (!side_data || side_data_size < 4+4+8*error_count) |
637 | ✗ | return AVERROR(ENOMEM); | |
638 | |||
639 | 12508 | AV_WL32(side_data , quality ); | |
640 | 12508 | side_data[4] = pict_type; | |
641 | 12508 | side_data[5] = error_count; | |
642 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12508 times.
|
12508 | for (i = 0; i<error_count; i++) |
643 | ✗ | AV_WL64(side_data+8 + 8*i , error[i]); | |
644 | |||
645 | 12508 | return 0; | |
646 | } | ||
647 | |||
648 | ✗ | int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp) | |
649 | { | ||
650 | AVProducerReferenceTime *prft; | ||
651 | uint8_t *side_data; | ||
652 | size_t side_data_size; | ||
653 | |||
654 | ✗ | side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size); | |
655 | ✗ | if (!side_data) { | |
656 | ✗ | side_data_size = sizeof(AVProducerReferenceTime); | |
657 | ✗ | side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, side_data_size); | |
658 | } | ||
659 | |||
660 | ✗ | if (!side_data || side_data_size < sizeof(AVProducerReferenceTime)) | |
661 | ✗ | return AVERROR(ENOMEM); | |
662 | |||
663 | ✗ | prft = (AVProducerReferenceTime *)side_data; | |
664 | ✗ | prft->wallclock = timestamp; | |
665 | ✗ | prft->flags = 0; | |
666 | |||
667 | ✗ | return 0; | |
668 | } | ||
669 | |||
670 | 28439 | const AVPacketSideData *av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, | |
671 | enum AVPacketSideDataType type) | ||
672 | { | ||
673 |
2/2✓ Branch 0 taken 3170 times.
✓ Branch 1 taken 28358 times.
|
31528 | for (int i = 0; i < nb_sd; i++) |
674 |
2/2✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3089 times.
|
3170 | if (sd[i].type == type) |
675 | 81 | return &sd[i]; | |
676 | |||
677 | 28358 | return NULL; | |
678 | } | ||
679 | |||
680 | 863 | static AVPacketSideData *packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, | |
681 | enum AVPacketSideDataType type, | ||
682 | void *data, size_t size) | ||
683 | { | ||
684 | 863 | AVPacketSideData *sd = *psd, *tmp; | |
685 | 863 | int nb_sd = *pnb_sd; | |
686 | |||
687 |
2/2✓ Branch 0 taken 72 times.
✓ Branch 1 taken 862 times.
|
934 | for (int i = 0; i < nb_sd; i++) { |
688 |
2/2✓ Branch 0 taken 71 times.
✓ Branch 1 taken 1 times.
|
72 | if (sd[i].type != type) |
689 | 71 | continue; | |
690 | |||
691 | 1 | av_free(sd[i].data); | |
692 | 1 | sd[i].data = data; | |
693 | 1 | sd[i].size = size; | |
694 | 1 | return &sd[i]; | |
695 | } | ||
696 | |||
697 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 862 times.
|
862 | if (nb_sd == INT_MAX) |
698 | ✗ | return NULL; | |
699 | |||
700 | 862 | tmp = av_realloc_array(sd, nb_sd + 1, sizeof(*tmp)); | |
701 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 862 times.
|
862 | if (!tmp) |
702 | ✗ | return NULL; | |
703 | |||
704 | 862 | *psd = sd = tmp; | |
705 | 862 | sd[nb_sd].type = type; | |
706 | 862 | sd[nb_sd].data = data; | |
707 | 862 | sd[nb_sd].size = size; | |
708 | 862 | *pnb_sd = nb_sd + 1; | |
709 | |||
710 | 862 | return &sd[nb_sd]; | |
711 | } | ||
712 | |||
713 | 485 | AVPacketSideData *av_packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, | |
714 | enum AVPacketSideDataType type, | ||
715 | void *data, size_t size, int flags) | ||
716 | { | ||
717 | 485 | return packet_side_data_add(psd, pnb_sd, type, data, size); | |
718 | } | ||
719 | |||
720 | 378 | AVPacketSideData *av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, | |
721 | enum AVPacketSideDataType type, | ||
722 | size_t size, int flags) | ||
723 | { | ||
724 | 378 | AVPacketSideData *sd = NULL; | |
725 | uint8_t *data; | ||
726 | |||
727 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
|
378 | if (size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) |
728 | ✗ | return NULL; | |
729 | |||
730 | 378 | data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE); | |
731 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
|
378 | if (!data) |
732 | ✗ | return NULL; | |
733 | 378 | memset(data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); | |
734 | |||
735 | 378 | sd = packet_side_data_add(psd, pnb_sd, type, data, size); | |
736 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
|
378 | if (!sd) |
737 | ✗ | av_freep(&data); | |
738 | |||
739 | 378 | return sd; | |
740 | } | ||
741 | |||
742 | 1 | void av_packet_side_data_remove(AVPacketSideData *sd, int *pnb_sd, | |
743 | enum AVPacketSideDataType type) | ||
744 | { | ||
745 | 1 | int nb_sd = *pnb_sd; | |
746 | |||
747 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | for (int i = nb_sd - 1; i >= 0; i--) { |
748 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (sd[i].type != type) |
749 | ✗ | continue; | |
750 | 1 | av_free(sd[i].data); | |
751 | 1 | sd[i] = sd[--nb_sd]; | |
752 | 1 | break; | |
753 | } | ||
754 | |||
755 | 1 | *pnb_sd = nb_sd; | |
756 | 1 | } | |
757 | |||
758 | 304524 | void av_packet_side_data_free(AVPacketSideData **psd, int *pnb_sd) | |
759 | { | ||
760 | 304524 | AVPacketSideData *sd = *psd; | |
761 | 304524 | int nb_sd = *pnb_sd; | |
762 | |||
763 |
2/2✓ Branch 0 taken 4791 times.
✓ Branch 1 taken 304524 times.
|
309315 | for (int i = 0; i < nb_sd; i++) |
764 | 4791 | av_free(sd[i].data); | |
765 | |||
766 | 304524 | av_freep(psd); | |
767 | 304524 | *pnb_sd = 0; | |
768 | 304524 | } | |
769 | |||
770 | 70507 | static void *container_packet_alloc(void *opaque) | |
771 | { | ||
772 | 70507 | return av_packet_alloc(); | |
773 | } | ||
774 | |||
775 | 917128 | static void container_packet_reset(void *opaque, void *obj) | |
776 | { | ||
777 | 917128 | av_packet_unref(obj); | |
778 | 917128 | } | |
779 | |||
780 | 70507 | static void container_packet_free(void *opaque, void *obj) | |
781 | { | ||
782 | 70507 | AVPacket *pkt = obj; | |
783 | 70507 | av_packet_free(&pkt); | |
784 | 70507 | } | |
785 | |||
786 | 1806253 | static int container_packet_transfer(void *opaque, void *dst, void *src, unsigned flags) | |
787 | { | ||
788 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1806253 times.
|
1806253 | if (flags & AV_CONTAINER_FIFO_FLAG_REF) |
789 | ✗ | return av_packet_ref(dst, src); | |
790 | |||
791 | 1806253 | av_packet_move_ref(dst, src); | |
792 | 1806253 | return 0; | |
793 | } | ||
794 | |||
795 | 15370 | AVContainerFifo *av_container_fifo_alloc_avpacket(unsigned flags) | |
796 | { | ||
797 | 15370 | return av_container_fifo_alloc(NULL, container_packet_alloc, | |
798 | container_packet_reset, container_packet_free, | ||
799 | container_packet_transfer, 0); | ||
800 | } | ||
801 |