[FFmpeg-cvslog] introduce side information for AVPacket
Kostya Shishkov
git at videolan.org
Sun Apr 17 23:56:35 CEST 2011
ffmpeg | branch: master | Kostya Shishkov <kostya.shishkov at gmail.com> | Sat Apr 9 15:31:39 2011 +0200| [4de339e219908ff44cbb1d823edeeead3b8facda] | committer: Luca Barbato
introduce side information for AVPacket
Signed-off-by: Luca Barbato <lu_zero at gentoo.org>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=4de339e219908ff44cbb1d823edeeead3b8facda
---
libavcodec/avcodec.h | 37 ++++++++++++++++++++
libavcodec/avpacket.c | 91 +++++++++++++++++++++++++++++++++++++++++++------
libavcodec/version.h | 4 +-
3 files changed, 119 insertions(+), 13 deletions(-)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 109d2a4..df4e617 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1035,6 +1035,10 @@ typedef struct AVPanScan{
#define FF_BUFFER_HINTS_PRESERVE 0x04 // User must not alter buffer content.
#define FF_BUFFER_HINTS_REUSABLE 0x08 // Codec will reuse the buffer (update).
+enum AVPacketSideDataType {
+ AV_PKT_DATA_PALETTE,
+};
+
typedef struct AVPacket {
/**
* Presentation timestamp in AVStream->time_base units; the time at which
@@ -1057,6 +1061,17 @@ typedef struct AVPacket {
int stream_index;
int flags;
/**
+ * Additional packet data that can be provided by the container.
+ * Packet can contain several types of side information.
+ */
+ struct {
+ uint8_t *data;
+ int size;
+ enum AVPacketSideDataType type;
+ } *side_data;
+ int side_data_elems;
+
+ /**
* Duration of this packet in AVStream->time_base units, 0 if unknown.
* Equals next_pts - this_pts in presentation order.
*/
@@ -3202,6 +3217,28 @@ int av_dup_packet(AVPacket *pkt);
*/
void av_free_packet(AVPacket *pkt);
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size);
+
/* resample.c */
struct ReSampleContext;
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index f6aef20..4b1002f 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -26,12 +26,21 @@
void av_destruct_packet_nofree(AVPacket *pkt)
{
pkt->data = NULL; pkt->size = 0;
+ pkt->side_data = NULL;
+ pkt->side_data_elems = 0;
}
void av_destruct_packet(AVPacket *pkt)
{
+ int i;
+
av_free(pkt->data);
pkt->data = NULL; pkt->size = 0;
+
+ for (i = 0; i < pkt->side_data_elems; i++)
+ av_free(pkt->side_data[i].data);
+ av_freep(&pkt->side_data);
+ pkt->side_data_elems = 0;
}
void av_init_packet(AVPacket *pkt)
@@ -44,6 +53,8 @@ void av_init_packet(AVPacket *pkt)
pkt->flags = 0;
pkt->stream_index = 0;
pkt->destruct= NULL;
+ pkt->side_data = NULL;
+ pkt->side_data_elems = 0;
}
int av_new_packet(AVPacket *pkt, int size)
@@ -89,21 +100,38 @@ int av_grow_packet(AVPacket *pkt, int grow_by)
return 0;
}
+#define DUP_DATA(dst, size, padding) \
+ do { \
+ void *data; \
+ if (padding) { \
+ if ((unsigned)(size) > (unsigned)(size) + FF_INPUT_BUFFER_PADDING_SIZE) \
+ return AVERROR(ENOMEM); \
+ data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); \
+ } else { \
+ data = av_malloc(size); \
+ } \
+ if (!data) \
+ return AVERROR(ENOMEM); \
+ memcpy(data, dst, size); \
+ if (padding) \
+ memset((uint8_t*)data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); \
+ dst = data; \
+ } while(0)
+
int av_dup_packet(AVPacket *pkt)
{
if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
- uint8_t *data;
- /* We duplicate the packet and don't forget to add the padding again. */
- if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
- return AVERROR(ENOMEM);
- data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
- if (!data) {
- return AVERROR(ENOMEM);
- }
- memcpy(data, pkt->data, pkt->size);
- memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
- pkt->data = data;
+ DUP_DATA(pkt->data, pkt->size, 1);
pkt->destruct = av_destruct_packet;
+
+ if (pkt->side_data_elems) {
+ int i;
+
+ DUP_DATA(pkt->side_data, pkt->side_data_elems * sizeof(*pkt->side_data), 0);
+ for (i = 0; i < pkt->side_data_elems; i++) {
+ DUP_DATA(pkt->side_data[i].data, pkt->side_data[i].size, 1);
+ }
+ }
}
return 0;
}
@@ -113,5 +141,46 @@ void av_free_packet(AVPacket *pkt)
if (pkt) {
if (pkt->destruct) pkt->destruct(pkt);
pkt->data = NULL; pkt->size = 0;
+ pkt->side_data = NULL;
+ pkt->side_data_elems = 0;
+ }
+}
+
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size)
+{
+ int elems = pkt->side_data_elems;
+
+ if ((unsigned)elems + 1 > INT_MAX / sizeof(*pkt->side_data))
+ return NULL;
+ if ((unsigned)size > INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE)
+ return NULL;
+
+ pkt->side_data = av_realloc(pkt->side_data, (elems + 1) * sizeof(*pkt->side_data));
+ if (!pkt->side_data)
+ return NULL;
+
+ pkt->side_data[elems].data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!pkt->side_data[elems].data)
+ return NULL;
+ pkt->side_data[elems].size = size;
+ pkt->side_data[elems].type = type;
+ pkt->side_data_elems++;
+
+ return pkt->side_data[elems].data;
+}
+
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size)
+{
+ int i;
+
+ for (i = 0; i < pkt->side_data_elems; i++) {
+ if (pkt->side_data[i].type == type) {
+ if (size)
+ *size = pkt->side_data[i].size;
+ return pkt->side_data[i].data;
+ }
}
+ return NULL;
}
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 0e2d766..4abdd5a 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -21,8 +21,8 @@
#define AVCODEC_VERSION_H
#define LIBAVCODEC_VERSION_MAJOR 52
-#define LIBAVCODEC_VERSION_MINOR 119
-#define LIBAVCODEC_VERSION_MICRO 1
+#define LIBAVCODEC_VERSION_MINOR 120
+#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
More information about the ffmpeg-cvslog
mailing list