[FFmpeg-devel] [PATCH] movenc: Fix VPCC bitdepth for hardware pixel formats

Niki Bowe nbowe at google.com
Tue Feb 5 04:15:07 EET 2019


My apologies.
I realized I applied my patch incorrectly before sending this.
I will send a corrected version tomorrow



On Thu, Jan 31, 2019 at 4:28 PM Nikolas Bowe <nbowe at google.com> wrote:

> If a hardware encoder is used, the pixel format may be a hardware pixel
> format.
> This leads to invalid VPCC atom being written, due to depth of hardware
> pixel formats being 0.
> To work around this, fallback on bits_per_raw_sample.
>
> Signed-off-by: Nikolas Bowe <nbowe at google.com>
> ---
>  libavcodec/vaapi_encode.c |  2 +-
>  libavformat/vpcc.c        | 13 +++++++++----
>  2 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> index b4e9fadaee..cfd9413f0f 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -1116,7 +1116,7 @@ static av_cold int
> vaapi_encode_profile_entrypoint(AVCodecContext *avctx)
>                 ctx->input_frames->sw_format);
>          return AVERROR(EINVAL);
>      }
> -    depth = desc->comp[0].depth;
> +    avctx->bits_per_raw_sample = depth = desc->comp[0].depth;
>      for (i = 1; i < desc->nb_components; i++) {
>          if (desc->comp[i].depth != depth) {
>              av_log(avctx, AV_LOG_ERROR, "Invalid input pixfmt (%s).\n",
> diff --git a/libavformat/vpcc.c b/libavformat/vpcc.c
> index e0b7f288a6..f667ca9c00 100644
> --- a/libavformat/vpcc.c
> +++ b/libavformat/vpcc.c
> @@ -51,15 +51,20 @@ static int get_vpx_chroma_subsampling(AVFormatContext
> *s,
>      return -1;
>  }
>
> -static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat
> pixel_format)
> +static int get_bit_depth(AVFormatContext *s, AVCodecParameters *par)
>  {
> +    enum AVPixelFormat pixel_format = par->format;
>      const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pixel_format);
>      if (desc == NULL) {
>          av_log(s, AV_LOG_ERROR, "Unsupported pixel format (%d)\n",
>                 pixel_format);
>          return -1;
>      }
> -    return desc->comp[0].depth;
> +    if (desc->comp[0].depth) {
> +        return desc->comp[0].depth;
> +    }
> +    // Fallback on bits_per_raw_sample if pix_fmt is a hw format.
> +    return par->bits_per_raw_sample;
>  }
>
>  static int get_vpx_video_full_range_flag(enum AVColorRange color_range)
> @@ -119,13 +124,13 @@ int ff_isom_get_vpcc_features(AVFormatContext *s,
> AVCodecParameters *par,
>      int profile = par->profile;
>      int level = par->level == FF_LEVEL_UNKNOWN ?
>          get_vp9_level(par, frame_rate) : par->level;
> -    int bit_depth = get_bit_depth(s, par->format);
> +    int bit_depth = get_bit_depth(s, par);
>      int vpx_chroma_subsampling =
>          get_vpx_chroma_subsampling(s, par->format, par->chroma_location);
>      int vpx_video_full_range_flag =
>          get_vpx_video_full_range_flag(par->color_range);
>
> -    if (bit_depth < 0 || vpx_chroma_subsampling < 0)
> +    if (bit_depth <= 0 || vpx_chroma_subsampling < 0)
>          return AVERROR_INVALIDDATA;
>
>      if (profile == FF_PROFILE_UNKNOWN) {
> --
> 2.20.1.611.gfbb209baf1-goog
>
>

-- 

Nikolas Bowe |  SWE |  nbowe at google.com |  408-565-5137


More information about the ffmpeg-devel mailing list