avpacket: add a function for wrapping existing data as side data
This commit is contained in:
		
							parent
							
								
									b09ad37c83
								
							
						
					
					
						commit
						31c51f7441
					
				@ -13,6 +13,9 @@ libavutil:     2015-08-28
 | 
			
		||||
 | 
			
		||||
API changes, most recent first:
 | 
			
		||||
 | 
			
		||||
2015-xx-xx - xxxxxxx - lavc 57.11.0 - avcodec.h
 | 
			
		||||
  Add av_packet_add_side_data().
 | 
			
		||||
 | 
			
		||||
2015-xx-xx - xxxxxxx - lavc 57.9.1 - avcodec.h
 | 
			
		||||
  Deprecate rtp_callback without replacement, i.e. it won't be possible to
 | 
			
		||||
  get image slices before the full frame is encoded any more. The libavformat
 | 
			
		||||
 | 
			
		||||
@ -3556,6 +3556,22 @@ void av_free_packet(AVPacket *pkt);
 | 
			
		||||
uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
                                 int size);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Wrap an existing array as a packet side data.
 | 
			
		||||
 *
 | 
			
		||||
 * @param pkt packet
 | 
			
		||||
 * @param type side information type
 | 
			
		||||
 * @param data the side data array. It must be allocated with the av_malloc()
 | 
			
		||||
 *             family of functions. The ownership of the data is transferred to
 | 
			
		||||
 *             pkt.
 | 
			
		||||
 * @param size side information size
 | 
			
		||||
 * @return a non-negative number on success, a negative AVERROR code on
 | 
			
		||||
 *         failure. On failure, the packet is unchanged and the data remains
 | 
			
		||||
 *         owned by the caller.
 | 
			
		||||
 */
 | 
			
		||||
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
                            uint8_t *data, size_t size);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shrink the already allocated side data buffer
 | 
			
		||||
 *
 | 
			
		||||
 | 
			
		||||
@ -237,29 +237,47 @@ void av_free_packet(AVPacket *pkt)
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
uint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
                                 int size)
 | 
			
		||||
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
                            uint8_t *data, size_t size)
 | 
			
		||||
{
 | 
			
		||||
    int elems = pkt->side_data_elems;
 | 
			
		||||
 | 
			
		||||
    if ((unsigned)elems + 1 > INT_MAX / sizeof(*pkt->side_data))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if ((unsigned)size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
 | 
			
		||||
        return NULL;
 | 
			
		||||
        return AVERROR(EOVERFLOW);
 | 
			
		||||
 | 
			
		||||
    pkt->side_data = av_realloc(pkt->side_data,
 | 
			
		||||
                                (elems + 1) * sizeof(*pkt->side_data));
 | 
			
		||||
    if (!pkt->side_data)
 | 
			
		||||
        return NULL;
 | 
			
		||||
        return AVERROR(ENOMEM);
 | 
			
		||||
 | 
			
		||||
    pkt->side_data[elems].data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
 | 
			
		||||
    if (!pkt->side_data[elems].data)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    pkt->side_data[elems].data = data;
 | 
			
		||||
    pkt->side_data[elems].size = size;
 | 
			
		||||
    pkt->side_data[elems].type = type;
 | 
			
		||||
    pkt->side_data_elems++;
 | 
			
		||||
 | 
			
		||||
    return pkt->side_data[elems].data;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t *av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
                                 int size)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    uint8_t *data;
 | 
			
		||||
 | 
			
		||||
    if ((unsigned)size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
 | 
			
		||||
    if (!data)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    ret = av_packet_add_side_data(pkt, type, data, size);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        av_freep(&data);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
#include "libavutil/version.h"
 | 
			
		||||
 | 
			
		||||
#define LIBAVCODEC_VERSION_MAJOR 57
 | 
			
		||||
#define LIBAVCODEC_VERSION_MINOR 10
 | 
			
		||||
#define LIBAVCODEC_VERSION_MINOR 11
 | 
			
		||||
#define LIBAVCODEC_VERSION_MICRO  0
 | 
			
		||||
 | 
			
		||||
#define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user