19
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
#include "libavutil/avassert.h"
25
#include "libavutil/mem.h"
22
26
#include "avcodec.h"
23
#include "libavutil/avassert.h"
26
void av_destruct_packet_nofree(AVPacket *pkt)
28
pkt->data = NULL; pkt->size = 0;
29
pkt->side_data = NULL;
30
pkt->side_data_elems = 0;
33
28
void av_destruct_packet(AVPacket *pkt)
37
32
av_free(pkt->data);
38
pkt->data = NULL; pkt->size = 0;
40
36
for (i = 0; i < pkt->side_data_elems; i++)
41
37
av_free(pkt->side_data[i].data);
46
42
void av_init_packet(AVPacket *pkt)
48
pkt->pts = AV_NOPTS_VALUE;
49
pkt->dts = AV_NOPTS_VALUE;
44
pkt->pts = AV_NOPTS_VALUE;
45
pkt->dts = AV_NOPTS_VALUE;
52
48
pkt->convergence_duration = 0;
54
pkt->stream_index = 0;
56
pkt->side_data = NULL;
57
pkt->side_data_elems = 0;
50
pkt->stream_index = 0;
52
pkt->side_data = NULL;
53
pkt->side_data_elems = 0;
60
56
int av_new_packet(AVPacket *pkt, int size)
63
if((unsigned)size < (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
59
if ((unsigned)size < (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
64
60
data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
66
62
memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
70
66
av_init_packet(pkt);
73
69
pkt->destruct = av_destruct_packet;
75
71
return AVERROR(ENOMEM);
79
75
void av_shrink_packet(AVPacket *pkt, int size)
81
if (pkt->size <= size) return;
77
if (pkt->size <= size)
83
80
memset(pkt->data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
89
86
av_assert0((unsigned)pkt->size <= INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE);
91
88
return av_new_packet(pkt, grow_by);
92
if ((unsigned)grow_by > INT_MAX - (pkt->size + FF_INPUT_BUFFER_PADDING_SIZE))
89
if ((unsigned)grow_by >
90
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);
92
new_ptr = av_realloc(pkt->data,
93
pkt->size + grow_by + FF_INPUT_BUFFER_PADDING_SIZE);
96
95
return AVERROR(ENOMEM);
98
97
pkt->size += grow_by;
99
98
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); \
102
#define DUP_DATA(dst, src, size, padding) \
106
if ((unsigned)(size) > \
107
(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, \
118
FF_INPUT_BUFFER_PADDING_SIZE); \
121
122
int av_dup_packet(AVPacket *pkt)
123
124
AVPacket tmp_pkt;
125
if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
126
if (pkt->destruct == NULL && pkt->data) {
128
129
pkt->data = NULL;
136
137
DUP_DATA(pkt->side_data, tmp_pkt.side_data,
137
138
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++) {
139
memset(pkt->side_data, 0,
140
pkt->side_data_elems * sizeof(*pkt->side_data));
141
for (i = 0; i < pkt->side_data_elems; i++)
140
142
DUP_DATA(pkt->side_data[i].data, tmp_pkt.side_data[i].data,
141
pkt->side_data[i].size, 1);
143
tmp_pkt.side_data[i].size, 1);
147
149
av_destruct_packet(pkt);
148
150
return AVERROR(ENOMEM);
151
153
void av_free_packet(AVPacket *pkt)
154
if (pkt->destruct) pkt->destruct(pkt);
155
pkt->data = NULL; pkt->size = 0;
156
160
pkt->side_data = NULL;
157
161
pkt->side_data_elems = 0;
161
uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
165
uint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
164
168
int elems = pkt->side_data_elems;
168
172
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 = av_realloc(pkt->side_data,
176
(elems + 1) * sizeof(*pkt->side_data));
172
177
if (!pkt->side_data)
182
187
return pkt->side_data[elems].data;
185
uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
190
uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
205
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
210
for (i = 0; i < pkt->side_data_elems; i++) {
211
if (pkt->side_data[i].type == type) {
212
if (size > pkt->side_data[i].size)
213
return AVERROR(ENOMEM);
214
pkt->side_data[i].size = size;
218
return AVERROR(ENOENT);