diff options
author | Rick Kern <kernrj@gmail.com> | 2016-04-27 10:53:08 -0400 |
---|---|---|
committer | wm4 <nfxjfg@googlemail.com> | 2016-05-04 18:40:40 +0200 |
commit | abe05892bee9de9c657f91beef6ce1fa31bdf577 (patch) | |
tree | bcb3f41a14b0b86b9717ac20ab970d519960d987 /libavcodec | |
parent | 645df431449dcdb9ccdc46952159a6570826a59b (diff) | |
download | ffmpeg-abe05892bee9de9c657f91beef6ce1fa31bdf577.tar.gz |
lavc/videotoolboxenc: Fix AVCodecContext.has_b_frames usage.
Now set by the encoder, not used as an input parameter.
Signed-off-by: Rick Kern <kernrj@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/videotoolboxenc.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index bd153e7f63..25c9648bcb 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -598,6 +598,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx) CFStringRef profile_level; SInt32 bit_rate = avctx->bit_rate; CFNumberRef bit_rate_num; + CFBooleanRef has_b_frames_cfbool; int status; codec_type = get_cm_codec_type(avctx->codec_id); @@ -606,7 +607,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx) return AVERROR(EINVAL); } - vtctx->has_b_frames = avctx->has_b_frames || avctx->max_b_frames > 0; + vtctx->has_b_frames = avctx->max_b_frames > 0; if(vtctx->has_b_frames && vtctx->profile == H264_PROF_BASELINE){ av_log(avctx, AV_LOG_WARNING, "Cannot use B-frames with baseline profile. Output will not contain B-frames.\n"); vtctx->has_b_frames = false; @@ -751,6 +752,18 @@ static av_cold int vtenc_init(AVCodecContext *avctx) pthread_cond_init(&vtctx->cv_sample_sent, NULL); vtctx->dts_delta = vtctx->has_b_frames ? -1 : 0; + status = VTSessionCopyProperty(vtctx->session, + kVTCompressionPropertyKey_AllowFrameReordering, + kCFAllocatorDefault, + &has_b_frames_cfbool); + + if (!status) { + //Some devices don't output B-frames for main profile, even if requested. + vtctx->has_b_frames = CFBooleanGetValue(has_b_frames_cfbool); + CFRelease(has_b_frames_cfbool); + } + avctx->has_b_frames = vtctx->has_b_frames; + return 0; } |