From f0b769c16daafa64720dcba7fa81a9f5255e1d29 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 22 Jul 2015 14:04:20 +0200 Subject: lavc: add a packet side data type for VBV-like parameters --- doc/APIchanges | 1 + libavcodec/avcodec.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ libavcodec/utils.c | 14 ++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/doc/APIchanges b/doc/APIchanges index bd7323c37b..8ae8be4d83 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -16,6 +16,7 @@ API changes, most recent first: 2015-xx-xx - xxxxxxx - lavc 57.11.0 - avcodec.h xxxxxxx - Add av_packet_add_side_data(). xxxxxxx - Add AVCodecContext.coded_side_data. + xxxxxxx - Add AVCPBProperties API. 2015-xx-xx - xxxxxxx - lavc 57.9.1 - avcodec.h Deprecate rtp_callback without replacement, i.e. it won't be possible to diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 80cf644aef..dacbcd3733 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1036,6 +1036,44 @@ typedef struct AVPanScan{ int16_t position[3][2]; }AVPanScan; +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int max_bitrate; + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int min_bitrate; + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int avg_bitrate; + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + #if FF_API_QSCALE_TYPE #define FF_QSCALE_TYPE_MPEG1 0 #define FF_QSCALE_TYPE_MPEG2 1 @@ -1137,6 +1175,11 @@ enum AVPacketSideDataType { * e.g. no decoder available for codec. */ AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, }; typedef struct AVPacketSideData { @@ -4630,6 +4673,17 @@ const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); */ const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + /** * @} */ diff --git a/libavcodec/utils.c b/libavcodec/utils.c index f3361a016f..d2f4de770b 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -2369,3 +2369,17 @@ const uint8_t *avpriv_find_start_code(const uint8_t *restrict p, return p + 4; } + +AVCPBProperties *av_cpb_properties_alloc(size_t *size) +{ + AVCPBProperties *props = av_mallocz(sizeof(AVCPBProperties)); + if (!props) + return NULL; + + if (size) + *size = sizeof(*props); + + props->vbv_delay = UINT64_MAX; + + return props; +} -- cgit v1.2.3