[FFmpeg-cvslog] lavc/videotoolboxenc: Fix AVCodecContext.has_b_frames usage.

Rick Kern git at videolan.org
Wed May 4 18:41:27 CEST 2016


ffmpeg | branch: master | Rick Kern <kernrj at gmail.com> | Wed Apr 27 10:53:08 2016 -0400| [abe05892bee9de9c657f91beef6ce1fa31bdf577] | committer: wm4

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 at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=abe05892bee9de9c657f91beef6ce1fa31bdf577
---

 libavcodec/videotoolboxenc.c |   15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

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;
 }
 



More information about the ffmpeg-cvslog mailing list