Commit d33908a5 authored by Andrey Utkin's avatar Andrey Utkin Committed by Michael Niedermayer

Move av_dup_packet() copy logic to separate procedure

Done to simplify next commit introducing av_copy_packet()
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent a6ec1e49
...@@ -125,40 +125,46 @@ int av_grow_packet(AVPacket *pkt, int grow_by) ...@@ -125,40 +125,46 @@ int av_grow_packet(AVPacket *pkt, int grow_by)
dst = data; \ dst = data; \
} while (0) } while (0)
int av_dup_packet(AVPacket *pkt) /* Makes duplicates of data, side_data, but does not copy any other fields */
static int copy_packet_data(AVPacket *dst, AVPacket *src)
{ {
AVPacket tmp_pkt; dst->data = NULL;
dst->side_data = NULL;
if (pkt->destruct == NULL && pkt->data) { DUP_DATA(dst->data, src->data, dst->size, 1);
tmp_pkt = *pkt; dst->destruct = av_destruct_packet;
pkt->data = NULL; if (dst->side_data_elems) {
pkt->side_data = NULL; int i;
DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1);
pkt->destruct = av_destruct_packet;
if (pkt->side_data_elems) { DUP_DATA(dst->side_data, src->side_data,
int i; dst->side_data_elems * sizeof(*dst->side_data), 0);
memset(dst->side_data, 0,
DUP_DATA(pkt->side_data, tmp_pkt.side_data, dst->side_data_elems * sizeof(*dst->side_data));
pkt->side_data_elems * sizeof(*pkt->side_data), 0); for (i = 0; i < dst->side_data_elems; i++) {
memset(pkt->side_data, 0, DUP_DATA(dst->side_data[i].data, src->side_data[i].data,
pkt->side_data_elems * sizeof(*pkt->side_data)); src->side_data[i].size, 1);
for (i = 0; i < pkt->side_data_elems; i++) { dst->side_data[i].size = src->side_data[i].size;
DUP_DATA(pkt->side_data[i].data, tmp_pkt.side_data[i].data, dst->side_data[i].type = src->side_data[i].type;
tmp_pkt.side_data[i].size, 1);
pkt->side_data[i].size = tmp_pkt.side_data[i].size;
pkt->side_data[i].type = tmp_pkt.side_data[i].type;
}
} }
} }
return 0; return 0;
failed_alloc: failed_alloc:
av_destruct_packet(pkt); av_destruct_packet(dst);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
int av_dup_packet(AVPacket *pkt)
{
AVPacket tmp_pkt;
if (pkt->destruct == NULL && pkt->data) {
tmp_pkt = *pkt;
return copy_packet_data(pkt, &tmp_pkt);
}
return 0;
}
void av_free_packet(AVPacket *pkt) void av_free_packet(AVPacket *pkt)
{ {
if (pkt) { if (pkt) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment