| @@ -240,4 +240,9 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt); | |||||
| */ | */ | ||||
| int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame); | 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); | |||||
| #endif /* AVCODEC_INTERNAL_H */ | #endif /* AVCODEC_INTERNAL_H */ | ||||
| @@ -108,6 +108,7 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) | |||||
| int err = AVERROR_UNKNOWN; | int err = AVERROR_UNKNOWN; | ||||
| int log_level; | int log_level; | ||||
| WelsTraceCallback callback_function; | WelsTraceCallback callback_function; | ||||
| AVCPBProperties *props; | |||||
| // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion | // 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 | // 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); | 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; | return 0; | ||||
| fail: | fail: | ||||
| @@ -2383,3 +2383,29 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size) | |||||
| return props; | 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; | |||||
| } | |||||