#include "hantro_hw.h"
 #include "hantro_v4l2.h"
 
+#define  HANTRO_DEFAULT_BIT_DEPTH 8
+
 static int hantro_set_fmt_out(struct hantro_ctx *ctx,
                              struct v4l2_pix_format_mplane *pix_mp);
 static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
 }
 
 static bool
-hantro_check_depth_match(const struct hantro_ctx *ctx,
-                        const struct hantro_fmt *fmt)
+hantro_check_depth_match(const struct hantro_fmt *fmt, int bit_depth)
 {
-       int fmt_depth, ctx_depth = 8;
+       int fmt_depth;
 
        if (!fmt->match_depth && !fmt->postprocessed)
                return true;
 
-       /* 0 means default depth, which is 8 */
-       if (ctx->bit_depth)
-               ctx_depth = ctx->bit_depth;
-
        fmt_depth = hantro_get_format_depth(fmt->fourcc);
 
        /*
         * It may be possible to relax that on some HW.
         */
        if (!fmt->match_depth)
-               return fmt_depth <= ctx_depth;
+               return fmt_depth <= bit_depth;
 
-       return fmt_depth == ctx_depth;
+       return fmt_depth == bit_depth;
 }
 
 static const struct hantro_fmt *
 }
 
 const struct hantro_fmt *
-hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream)
+hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream, int bit_depth)
 {
        const struct hantro_fmt *formats;
        unsigned int i, num_fmts;
        for (i = 0; i < num_fmts; i++) {
                if (bitstream == (formats[i].codec_mode !=
                                  HANTRO_MODE_NONE) &&
-                   hantro_check_depth_match(ctx, &formats[i]))
+                   hantro_check_depth_match(&formats[i], bit_depth))
                        return &formats[i];
        }
        return NULL;
 
                if (skip_mode_none == mode_none)
                        continue;
-               if (!hantro_check_depth_match(ctx, fmt))
+               if (!hantro_check_depth_match(fmt, ctx->bit_depth))
                        continue;
                if (j == f->index) {
                        f->pixelformat = fmt->fourcc;
        for (i = 0; i < num_fmts; i++) {
                fmt = &formats[i];
 
-               if (!hantro_check_depth_match(ctx, fmt))
+               if (!hantro_check_depth_match(fmt, ctx->bit_depth))
                        continue;
                if (j == f->index) {
                        f->pixelformat = fmt->fourcc;
 
        fmt = hantro_find_format(ctx, pix_mp->pixelformat);
        if (!fmt) {
-               fmt = hantro_get_default_fmt(ctx, coded);
+               fmt = hantro_get_default_fmt(ctx, coded, HANTRO_DEFAULT_BIT_DEPTH);
                pix_mp->pixelformat = fmt->fourcc;
        }
 
        const struct hantro_fmt *vpu_fmt;
        struct v4l2_pix_format_mplane fmt;
 
-       vpu_fmt = hantro_get_default_fmt(ctx, true);
+       vpu_fmt = hantro_get_default_fmt(ctx, true, HANTRO_DEFAULT_BIT_DEPTH);
        if (!vpu_fmt)
                return;
 
                hantro_set_fmt_out(ctx, &fmt);
 }
 
-static void
-hantro_reset_raw_fmt(struct hantro_ctx *ctx)
+int
+hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth)
 {
        const struct hantro_fmt *raw_vpu_fmt;
        struct v4l2_pix_format_mplane raw_fmt, *encoded_fmt;
+       int ret;
 
-       raw_vpu_fmt = hantro_get_default_fmt(ctx, false);
+       raw_vpu_fmt = hantro_get_default_fmt(ctx, false, bit_depth);
        if (!raw_vpu_fmt)
-               return;
+               return -EINVAL;
 
        if (ctx->is_encoder)
                encoded_fmt = &ctx->dst_fmt;
        raw_fmt.width = encoded_fmt->width;
        raw_fmt.height = encoded_fmt->height;
        if (ctx->is_encoder)
-               hantro_set_fmt_out(ctx, &raw_fmt);
+               ret = hantro_set_fmt_out(ctx, &raw_fmt);
        else
-               hantro_set_fmt_cap(ctx, &raw_fmt);
+               ret = hantro_set_fmt_cap(ctx, &raw_fmt);
+
+       if (!ret)
+               ctx->bit_depth = bit_depth;
+
+       return ret;
 }
 
 void hantro_reset_fmts(struct hantro_ctx *ctx)
 {
        hantro_reset_encoded_fmt(ctx);
-       hantro_reset_raw_fmt(ctx);
+       hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
 }
 
 static void
         * changes to the raw format.
         */
        if (!ctx->is_encoder)
-               hantro_reset_raw_fmt(ctx);
+               hantro_reset_raw_fmt(ctx, hantro_get_format_depth(pix_mp->pixelformat));
 
        /* Colorimetry information are always propagated. */
        ctx->dst_fmt.colorspace = pix_mp->colorspace;
         * changes to the raw format.
         */
        if (ctx->is_encoder)
-               hantro_reset_raw_fmt(ctx);
+               hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
 
        /* Colorimetry information are always propagated. */
        ctx->src_fmt.colorspace = pix_mp->colorspace;