summaryrefslogtreecommitdiffstats
path: root/libavcodec/videotoolboxenc.c
diff options
context:
space:
mode:
authorRick Kern <kernrj@gmail.com>2016-04-27 10:53:08 -0400
committerwm4 <nfxjfg@googlemail.com>2016-05-04 18:40:40 +0200
commitabe05892bee9de9c657f91beef6ce1fa31bdf577 (patch)
treebcb3f41a14b0b86b9717ac20ab970d519960d987 /libavcodec/videotoolboxenc.c
parent645df431449dcdb9ccdc46952159a6570826a59b (diff)
downloadffmpeg-streaming-abe05892bee9de9c657f91beef6ce1fa31bdf577.zip
ffmpeg-streaming-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/videotoolboxenc.c')
-rw-r--r--libavcodec/videotoolboxenc.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index bd153e7..25c9648 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;
}
OpenPOWER on IntegriCloud