|
|
|
@ -100,8 +100,6 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
if ((err = ff_libopenh264_check_version(avctx)) < 0) |
|
|
|
|
return err; |
|
|
|
|
// Use a default error for multiple error paths below
|
|
|
|
|
err = AVERROR_UNKNOWN; |
|
|
|
|
|
|
|
|
|
if (WelsCreateSVCEncoder(&s->encoder)) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Unable to create encoder\n"); |
|
|
|
@ -167,8 +165,7 @@ FF_ENABLE_DEPRECATION_WARNINGS |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
|
"Invalid combination -slices %d and -max_nal_size %d.\n", |
|
|
|
|
avctx->slices, s->max_nal_size); |
|
|
|
|
err = AVERROR(EINVAL); |
|
|
|
|
goto fail; |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (avctx->slices > 1) |
|
|
|
@ -196,14 +193,13 @@ FF_ENABLE_DEPRECATION_WARNINGS |
|
|
|
|
} else { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Invalid -max_nal_size, " |
|
|
|
|
"specify a valid max_nal_size to use -slice_mode dyn\n"); |
|
|
|
|
err = AVERROR(EINVAL); |
|
|
|
|
goto fail; |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((*s->encoder)->InitializeExt(s->encoder, ¶m) != cmResultSuccess) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Initialize failed\n"); |
|
|
|
|
goto fail; |
|
|
|
|
return AVERROR_UNKNOWN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { |
|
|
|
@ -213,27 +209,19 @@ FF_ENABLE_DEPRECATION_WARNINGS |
|
|
|
|
for (i = 0; i < fbi.sLayerInfo[0].iNalCount; i++) |
|
|
|
|
size += fbi.sLayerInfo[0].pNalLengthInByte[i]; |
|
|
|
|
avctx->extradata = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|
if (!avctx->extradata) { |
|
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
if (!avctx->extradata) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
avctx->extradata_size = size; |
|
|
|
|
memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
props = ff_add_cpb_side_data(avctx); |
|
|
|
|
if (!props) { |
|
|
|
|
err = AVERROR(ENOMEM); |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
if (!props) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
props->max_bitrate = param.iMaxBitrate; |
|
|
|
|
props->avg_bitrate = param.iTargetBitrate; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
svc_encode_close(avctx); |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, |
|
|
|
@ -306,6 +294,7 @@ AVCodec ff_libopenh264_encoder = { |
|
|
|
|
.encode2 = svc_encode_frame, |
|
|
|
|
.close = svc_encode_close, |
|
|
|
|
.capabilities = AV_CODEC_CAP_AUTO_THREADS, |
|
|
|
|
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, |
|
|
|
|
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, |
|
|
|
|
AV_PIX_FMT_NONE }, |
|
|
|
|
.priv_class = &class, |
|
|
|
|