Revision c0eee893 libavcodec/avpacket.c

View differences:

libavcodec/avpacket.c
100 100
    return 0;
101 101
}
102 102

  
103
#define DUP_DATA(dst, size, padding) \
103
#define DUP_DATA(dst, src, size, padding) \
104 104
    do { \
105 105
        void *data; \
106 106
        if (padding) { \
107 107
            if ((unsigned)(size) > (unsigned)(size) + FF_INPUT_BUFFER_PADDING_SIZE) \
108
                return AVERROR(ENOMEM); \
108
                goto failed_alloc; \
109 109
            data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); \
110 110
        } else { \
111 111
            data = av_malloc(size); \
112 112
        } \
113 113
        if (!data) \
114
            return AVERROR(ENOMEM); \
115
        memcpy(data, dst, size); \
114
            goto failed_alloc; \
115
        memcpy(data, src, size); \
116 116
        if (padding) \
117 117
            memset((uint8_t*)data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); \
118 118
        dst = data; \
......
120 120

  
121 121
int av_dup_packet(AVPacket *pkt)
122 122
{
123
    AVPacket tmp_pkt;
124

  
123 125
    if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
124
        DUP_DATA(pkt->data, pkt->size, 1);
126
        tmp_pkt = *pkt;
127

  
128
        pkt->data      = NULL;
129
        pkt->side_data = NULL;
130
        DUP_DATA(pkt->data, tmp_pkt.data, pkt->size, 1);
125 131
        pkt->destruct = av_destruct_packet;
126 132

  
127 133
        if (pkt->side_data_elems) {
128 134
            int i;
129 135

  
130
            DUP_DATA(pkt->side_data, pkt->side_data_elems * sizeof(*pkt->side_data), 0);
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));
131 139
            for (i = 0; i < pkt->side_data_elems; i++) {
132
                DUP_DATA(pkt->side_data[i].data, pkt->side_data[i].size, 1);
140
                DUP_DATA(pkt->side_data[i].data, tmp_pkt.side_data[i].data,
141
                         pkt->side_data[i].size, 1);
133 142
            }
134 143
        }
135 144
    }
136 145
    return 0;
146
failed_alloc:
147
    av_destruct_packet(pkt);
148
    return AVERROR(ENOMEM);
137 149
}
138 150

  
139 151
void av_free_packet(AVPacket *pkt)

Also available in: Unified diff