diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-12-17 15:31:21 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-12-17 15:31:21 +0300 |
commit | f49264a1c5912ee2bc23e7a09ded1024a178cf04 (patch) | |
tree | 8175c3e1c1f8a41ef936b5c8512d0817be72985b /libavcodec | |
parent | dd6ee019ea828a2700e38366983ef343612021c6 (diff) | |
parent | 11c9bd633f635f07a762be1ecd672de55daf4edc (diff) |
Merge commit '11c9bd633f635f07a762be1ecd672de55daf4edc'
* commit '11c9bd633f635f07a762be1ecd672de55daf4edc':
libopenh264enc: export CPB props side data
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/internal.h | 5 | ||||
-rw-r--r-- | libavcodec/libopenh264enc.c | 9 | ||||
-rw-r--r-- | libavcodec/utils.c | 26 |
3 files changed, 40 insertions, 0 deletions
diff --git a/libavcodec/internal.h b/libavcodec/internal.h index afcf00d013..482d8debcd 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -323,6 +323,11 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt); */ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame); +/** + * Add a CPB properties side data to an encoding context. + */ +AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx); + int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type); #endif /* AVCODEC_INTERNAL_H */ diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index d77ecc9a58..8f87645a67 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -108,6 +108,7 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) int err = AVERROR_UNKNOWN; int log_level; WelsTraceCallback callback_function; + AVCPBProperties *props; // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion // function (for functions returning larger structs), thus skip the check in those @@ -223,6 +224,14 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size); } + props = ff_add_cpb_side_data(avctx); + if (!props) { + err = AVERROR(ENOMEM); + goto fail; + } + props->max_bitrate = param.iMaxBitrate; + props->avg_bitrate = param.iTargetBitrate; + return 0; fail: diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 488b67c064..19f3f0ac12 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -3502,3 +3502,29 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size) return props; } + +AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx) +{ + AVPacketSideData *tmp; + AVCPBProperties *props; + size_t size; + + props = av_cpb_properties_alloc(&size); + if (!props) + return NULL; + + tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp)); + if (!tmp) { + av_freep(&props); + return NULL; + } + + avctx->coded_side_data = tmp; + avctx->nb_coded_side_data++; + + avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES; + avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props; + avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size; + + return props; +} |