diff options
author | Andrey Utkin <andrey.krieger.utkin@gmail.com> | 2012-09-20 17:30:02 +0300 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-09-21 00:49:12 +0200 |
commit | d33908a5fc8249b51fd5fbe0dfba46850e6536d0 (patch) | |
tree | 6920a97a3c47d08ea75dcdaef1f1a30c64619855 | |
parent | a6ec1e49f6171bc37a4fb001225f5885e20a1f4e (diff) | |
download | ffmpeg-d33908a5fc8249b51fd5fbe0dfba46850e6536d0.tar.gz |
Move av_dup_packet() copy logic to separate procedure
Done to simplify next commit introducing av_copy_packet()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/avpacket.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index 17c100e577..8989190579 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -125,40 +125,46 @@ int av_grow_packet(AVPacket *pkt, int grow_by) dst = data; \ } 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; - - if (pkt->destruct == NULL && pkt->data) { - tmp_pkt = *pkt; + dst->data = NULL; + dst->side_data = NULL; + DUP_DATA(dst->data, src->data, dst->size, 1); + dst->destruct = av_destruct_packet; - pkt->data = NULL; - pkt->side_data = NULL; - DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1); - pkt->destruct = av_destruct_packet; + if (dst->side_data_elems) { + int i; - if (pkt->side_data_elems) { - int i; - - DUP_DATA(pkt->side_data, tmp_pkt.side_data, - pkt->side_data_elems * sizeof(*pkt->side_data), 0); - memset(pkt->side_data, 0, - pkt->side_data_elems * sizeof(*pkt->side_data)); - for (i = 0; i < pkt->side_data_elems; i++) { - DUP_DATA(pkt->side_data[i].data, tmp_pkt.side_data[i].data, - 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; - } + DUP_DATA(dst->side_data, src->side_data, + dst->side_data_elems * sizeof(*dst->side_data), 0); + memset(dst->side_data, 0, + dst->side_data_elems * sizeof(*dst->side_data)); + for (i = 0; i < dst->side_data_elems; i++) { + DUP_DATA(dst->side_data[i].data, src->side_data[i].data, + src->side_data[i].size, 1); + dst->side_data[i].size = src->side_data[i].size; + dst->side_data[i].type = src->side_data[i].type; } } return 0; failed_alloc: - av_destruct_packet(pkt); + av_destruct_packet(dst); 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) { if (pkt) { |