FF_DISABLE_DEPRECATION_WARNINGS #define ALLOC_MALLOC(data, size) data = av_malloc(size) #define ALLOC_BUF(data, size) \ do { \ av_buffer_realloc(&pkt->buf, size); \ data = pkt->buf ? pkt->buf->data : NULL; \ } while (0) #define DUP_DATA(dst, src, size, padding, ALLOC) \ do { \ void *data; \ if (padding) { \ if ((unsigned)(size) > \ (unsigned)(size) + AV_INPUT_BUFFER_PADDING_SIZE) \ goto failed_alloc; \ ALLOC(data, size + AV_INPUT_BUFFER_PADDING_SIZE); \ } else { \ ALLOC(data, size); \ } \ if (!data) \ goto failed_alloc; \ memcpy(data, src, size); \ if (padding) \ memset((uint8_t *)data + size, 0, \ AV_INPUT_BUFFER_PADDING_SIZE); \ dst = data; \ } while (0) int av_dup_packet(AVPacket *pkt) { AVPacket tmp_pkt; if (!pkt->buf && pkt->data) { tmp_pkt = *pkt; pkt->data = NULL; pkt->side_data = NULL; DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1, ALLOC_BUF); 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, ALLOC_MALLOC); 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, ALLOC_MALLOC); pkt->side_data[i].size = tmp_pkt.side_data[i].size; pkt->side_data[i].type = tmp_pkt.side_data[i].type; } } } return 0; failed_alloc: av_packet_unref(pkt); return AVERROR(ENOMEM); }
int av_dup_packet(AVPacket *pkt) { AVPacket tmp_pkt; if (pkt->destruct == NULL && pkt->data) { tmp_pkt = *pkt; pkt->data = NULL; pkt->side_data = NULL; DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1); pkt->destruct = av_destruct_packet; 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; } } } return 0; failed_alloc: av_destruct_packet(pkt); return AVERROR(ENOMEM); }
/* Makes duplicates of data, side_data, but does not copy any other fields */ static int copy_packet_data(AVPacket *dst, AVPacket *src) { dst->data = NULL; dst->side_data = NULL; DUP_DATA(dst->data, src->data, dst->size, 1); dst->destruct = av_destruct_packet; if (dst->side_data_elems) { int i; 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(dst); return AVERROR(ENOMEM); }
int av_dup_packet(AVPacket *pkt) { AVPacket tmp_pkt; if (!pkt->buf && pkt->data) { tmp_pkt = *pkt; pkt->data = NULL; pkt->side_data = NULL; DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1, ALLOC_BUF); 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, ALLOC_MALLOC); 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, ALLOC_MALLOC); pkt->side_data[i].size = tmp_pkt.side_data[i].size; pkt->side_data[i].type = tmp_pkt.side_data[i].type; } } } return 0; failed_alloc: av_free_packet(pkt); return AVERROR(ENOMEM); }
/* Makes duplicates of data, side_data, but does not copy any other fields */ static int copy_packet_data(AVPacket *pkt, AVPacket *src, int dup) { pkt->data = NULL; pkt->side_data = NULL; if (pkt->buf) { AVBufferRef *ref = av_buffer_ref(src->buf); if (!ref) return AVERROR(ENOMEM); pkt->buf = ref; pkt->data = ref->data; } else { DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF); } #if FF_API_DESTRUCT_PACKET pkt->destruct = dummy_destruct_packet; #endif if (pkt->side_data_elems && dup) pkt->side_data = src->side_data; if (pkt->side_data_elems && !dup) { return av_copy_packet_side_data(pkt, src); } return 0; failed_alloc: av_destruct_packet(pkt); return AVERROR(ENOMEM); }
FF_DISABLE_DEPRECATION_WARNINGS #define ALLOC_MALLOC(data, size) data = av_malloc(size) #define ALLOC_BUF(data, size) \ do { \ av_buffer_realloc(&pkt->buf, size); \ data = pkt->buf ? pkt->buf->data : NULL; \ } while (0) #define DUP_DATA(dst, src, size, padding, ALLOC) \ do { \ void *data; \ if (padding) { \ if ((unsigned)(size) > \ (unsigned)(size) + AV_INPUT_BUFFER_PADDING_SIZE) \ goto failed_alloc; \ ALLOC(data, size + AV_INPUT_BUFFER_PADDING_SIZE); \ } else { \ ALLOC(data, size); \ } \ if (!data) \ goto failed_alloc; \ memcpy(data, src, size); \ if (padding) \ memset((uint8_t *)data + size, 0, \ AV_INPUT_BUFFER_PADDING_SIZE); \ dst = data; \ } while (0) /* Makes duplicates of data, side_data, but does not copy any other fields */ static int copy_packet_data(AVPacket *pkt, const AVPacket *src, int dup) { pkt->data = NULL; pkt->side_data = NULL; pkt->side_data_elems = 0; if (pkt->buf) { AVBufferRef *ref = av_buffer_ref(src->buf); if (!ref) return AVERROR(ENOMEM); pkt->buf = ref; pkt->data = ref->data; } else { DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF); } if (src->side_data_elems && dup) { pkt->side_data = src->side_data; pkt->side_data_elems = src->side_data_elems; } if (src->side_data_elems && !dup) { return av_copy_packet_side_data(pkt, src); } return 0; failed_alloc: av_packet_unref(pkt); return AVERROR(ENOMEM); }
int av_dup_packet(AVPacket *pkt) { AVPacket tmp_pkt; //FF_DISABLE_DEPRECATION_WARNINGS if (!pkt->buf && pkt->data #if FF_API_DESTRUCT_PACKET && !pkt->destruct #endif ) { //FF_ENABLE_DEPRECATION_WARNINGS tmp_pkt = *pkt; pkt->data = NULL; pkt->side_data = NULL; DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1, ALLOC_BUF); #if FF_API_DESTRUCT_PACKET //FF_DISABLE_DEPRECATION_WARNINGS pkt->destruct = dummy_destruct_packet; //FF_ENABLE_DEPRECATION_WARNINGS #endif 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, ALLOC_MALLOC); 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, ALLOC_MALLOC); pkt->side_data[i].size = tmp_pkt.side_data[i].size; pkt->side_data[i].type = tmp_pkt.side_data[i].type; } } } return 0; failed_alloc: av_free_packet(pkt); return AVERROR(ENOMEM); }
int av_copy_packet_side_data(AVPacket *pkt, AVPacket *src) { if (src->side_data_elems) { int i; DUP_DATA(pkt->side_data, src->side_data, src->side_data_elems * sizeof(*src->side_data), 0, ALLOC_MALLOC); memset(pkt->side_data, 0, src->side_data_elems * sizeof(*src->side_data)); for (i = 0; i < src->side_data_elems; i++) { DUP_DATA(pkt->side_data[i].data, src->side_data[i].data, src->side_data[i].size, 1, ALLOC_MALLOC); pkt->side_data[i].size = src->side_data[i].size; pkt->side_data[i].type = src->side_data[i].type; } } return 0; failed_alloc: av_destruct_packet(pkt); return AVERROR(ENOMEM); }
/* Makes duplicates of data, side_data, but does not copy any other fields */ static int copy_packet_data(AVPacket *pkt, AVPacket *src, int dup) { pkt->data = NULL; pkt->side_data = NULL; if (pkt->buf) { AVBufferRef *ref = av_buffer_ref(src->buf); if (!ref) return AVERROR(ENOMEM); pkt->buf = ref; pkt->data = ref->data; } else { DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF); } #if FF_API_DESTRUCT_PACKET pkt->destruct = dummy_destruct_packet; #endif if (pkt->side_data_elems && dup) pkt->side_data = src->side_data; if (pkt->side_data_elems && !dup) { int i; DUP_DATA(pkt->side_data, src->side_data, pkt->side_data_elems * sizeof(*pkt->side_data), 0, ALLOC_MALLOC); 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, src->side_data[i].data, src->side_data[i].size, 1, ALLOC_MALLOC); pkt->side_data[i].size = src->side_data[i].size; pkt->side_data[i].type = src->side_data[i].type; } } return 0; failed_alloc: av_destruct_packet(pkt); return AVERROR(ENOMEM); }