[FFmpeg-devel] [PATCH 05/13] lavc/videotoolboxenc: Fix AVCodecContext.has_b_frames usage.

Hendrik Leppkes h.leppkes at gmail.com
Sun Apr 10 09:51:48 CEST 2016


On Sun, Apr 10, 2016 at 5:50 AM, Rick Kern <kernrj at gmail.com> wrote:
> Now set by the encoder, not used as an input parameter.
>
> Signed-off-by: Rick Kern <kernrj at gmail.com>
> ---
>  libavcodec/videotoolboxenc.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
> index 6586ca7..8352ba9 100644
> --- a/libavcodec/videotoolboxenc.c
> +++ b/libavcodec/videotoolboxenc.c
> @@ -617,6 +617,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);
> @@ -625,7 +626,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;
> @@ -759,6 +760,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;
>  }
>

LGTM, max_b_frames is the appropriate property to check if b frames
are requested.

- Hendrik


More information about the ffmpeg-devel mailing list