2
2
* AVPacket functions for libavcodec
3
3
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5
* This file is part of FFmpeg.
5
* This file is part of Libav.
7
* FFmpeg is free software; you can redistribute it and/or
7
* Libav is free software; you can redistribute it and/or
8
8
* modify it under the terms of the GNU Lesser General Public
9
9
* License as published by the Free Software Foundation; either
10
10
* version 2.1 of the License, or (at your option) any later version.
12
* FFmpeg is distributed in the hope that it will be useful,
12
* Libav is distributed in the hope that it will be useful,
13
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
15
* Lesser General Public License for more details.
17
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
18
* License along with Libav; if not, write to the Free Software
19
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
22
#include "avcodec.h"
23
#include "libavutil/avassert.h"
25
26
void av_destruct_packet_nofree(AVPacket *pkt)
27
28
pkt->data = NULL; pkt->size = 0;
29
pkt->side_data = NULL;
30
pkt->side_data_elems = 0;
30
33
void av_destruct_packet(AVPacket *pkt)
32
37
av_free(pkt->data);
33
38
pkt->data = NULL; pkt->size = 0;
40
for (i = 0; i < pkt->side_data_elems; i++)
41
av_free(pkt->side_data[i].data);
42
av_freep(&pkt->side_data);
43
pkt->side_data_elems = 0;
36
46
void av_init_packet(AVPacket *pkt)
71
83
memset(pkt->data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
86
int av_grow_packet(AVPacket *pkt, int grow_by)
89
av_assert0((unsigned)pkt->size <= INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE);
91
return av_new_packet(pkt, grow_by);
92
if ((unsigned)grow_by > INT_MAX - (pkt->size + FF_INPUT_BUFFER_PADDING_SIZE))
94
new_ptr = av_realloc(pkt->data, pkt->size + grow_by + FF_INPUT_BUFFER_PADDING_SIZE);
96
return AVERROR(ENOMEM);
99
memset(pkt->data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
103
#define DUP_DATA(dst, src, size, padding) \
107
if ((unsigned)(size) > (unsigned)(size) + FF_INPUT_BUFFER_PADDING_SIZE) \
109
data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); \
111
data = av_malloc(size); \
115
memcpy(data, src, size); \
117
memset((uint8_t*)data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); \
74
121
int av_dup_packet(AVPacket *pkt)
76
125
if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
78
/* We duplicate the packet and don't forget to add the padding again. */
79
if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
80
return AVERROR(ENOMEM);
81
data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
83
return AVERROR(ENOMEM);
85
memcpy(data, pkt->data, pkt->size);
86
memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
129
pkt->side_data = NULL;
130
DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1);
88
131
pkt->destruct = av_destruct_packet;
133
if (pkt->side_data_elems) {
136
DUP_DATA(pkt->side_data, tmp_pkt.side_data,
137
pkt->side_data_elems * sizeof(*pkt->side_data), 0);
138
memset(pkt->side_data, 0, pkt->side_data_elems * sizeof(*pkt->side_data));
139
for (i = 0; i < pkt->side_data_elems; i++) {
140
DUP_DATA(pkt->side_data[i].data, tmp_pkt.side_data[i].data,
141
pkt->side_data[i].size, 1);
147
av_destruct_packet(pkt);
148
return AVERROR(ENOMEM);
93
151
void av_free_packet(AVPacket *pkt)
96
154
if (pkt->destruct) pkt->destruct(pkt);
97
155
pkt->data = NULL; pkt->size = 0;
156
pkt->side_data = NULL;
157
pkt->side_data_elems = 0;
161
uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
164
int elems = pkt->side_data_elems;
166
if ((unsigned)elems + 1 > INT_MAX / sizeof(*pkt->side_data))
168
if ((unsigned)size > INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE)
171
pkt->side_data = av_realloc(pkt->side_data, (elems + 1) * sizeof(*pkt->side_data));
175
pkt->side_data[elems].data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
176
if (!pkt->side_data[elems].data)
178
pkt->side_data[elems].size = size;
179
pkt->side_data[elems].type = type;
180
pkt->side_data_elems++;
182
return pkt->side_data[elems].data;
185
uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
190
for (i = 0; i < pkt->side_data_elems; i++) {
191
if (pkt->side_data[i].type == type) {
193
*size = pkt->side_data[i].size;
194
return pkt->side_data[i].data;