v4l2dec: CB2 modify dw on low mem mode [1/3]

PD#SWPL-187525

Problem:
modify dw on low mem mode

Solution:
modify dw on low mem mode

Verify:
AH212

Signed-off-by: le.han <le.han@amlogic.com>
Change-Id: I82666ed2a268e88c174b84f26eeb7ca1df782f20
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index f1fdbdc..c07b741 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -569,6 +569,7 @@
   v4l2object->outstanding_buf_num = 0;
   v4l2object->num_error_frames = 0;
   v4l2object->error_frame_pts = 0;
+  v4l2object->stride = 0;
   return v4l2object;
 }
 
@@ -3646,6 +3647,8 @@
       case V4L2_PIX_FMT_MPEG2:
       case V4L2_PIX_FMT_MPEG4:
           double_write = VDEC_DW_NO_AFBC;
+          if (v4l2object->low_memory_mode && !interlace)
+              double_write = VDEC_DW_AFBC_ONLY;
           break;
       case V4L2_PIX_FMT_H264:
       {
@@ -3653,18 +3656,22 @@
               double_write = VDEC_DW_AFBC_1_4_DW;
           else
               double_write = VDEC_DW_NO_AFBC;
+          if (v4l2object->low_memory_mode && !interlace)
+              double_write = VDEC_DW_AFBC_ONLY;
           break;
       }
       case V4L2_PIX_FMT_HEVC:
           double_write = VDEC_DW_AFBC_AUTO_1_4;
           if (interlace)
               double_write = VDEC_DW_AFBC_1_1_DW;
-          if (v4l2object->low_memory_mode)
+          if (v4l2object->low_memory_mode && !interlace)
               double_write = VDEC_DW_AFBC_ONLY;
           break;
       case V4L2_PIX_FMT_VP9:
       case V4L2_PIX_FMT_AV1:
-          double_write = v4l2object->low_memory_mode ? VDEC_DW_AFBC_ONLY:VDEC_DW_AFBC_AUTO_1_4;
+          double_write = VDEC_DW_AFBC_AUTO_1_4;
+          if (v4l2object->low_memory_mode && !interlace)
+              double_write = VDEC_DW_AFBC_ONLY;
           break;
       default:
           GST_WARNING("unknown video format %d", pixFormat);
@@ -4074,6 +4081,7 @@
 gst_aml_v4l2_object_set_format_full (GstAmlV4l2Object * v4l2object, GstCaps * caps,
     gboolean try_only, GstAmlV4l2Error * error)
 {
+  GstAmlV4l2VideoDec *self = (GstAmlV4l2VideoDec*) v4l2object->element;
   gint fd = v4l2object->video_fd;
   struct v4l2_format format;
   struct v4l2_streamparm streamparm;
@@ -4442,6 +4450,14 @@
                    is_mplane ? format.fmt.pix_mp.num_planes : 1,
                    colorspace, range, matrix, transfer);
 
+  if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY)
+  {
+    self->v4l2output->stride = format.fmt.pix_mp.plane_fmt[0].bytesperline;
+    //because driver return src w,h when AFBC_ONLY
+    format.fmt.pix.width = format.fmt.pix.height = 64;
+    format.fmt.pix_mp.plane_fmt[0].bytesperline = format.fmt.pix_mp.plane_fmt[1].bytesperline = 64;
+  }
+
 #ifndef GST_DISABLE_GST_DEBUG
   if (is_mplane)
   {
@@ -4921,6 +4937,7 @@
 gboolean
 gst_aml_v4l2_object_acquire_format (GstAmlV4l2Object * v4l2object, GstVideoInfo * info)
 {
+  GstAmlV4l2VideoDec *self = (GstAmlV4l2VideoDec*) v4l2object->element;
   struct v4l2_fmtdesc *fmtdesc;
   struct v4l2_format fmt;
   struct v4l2_crop crop;
@@ -4956,6 +4973,14 @@
   if (fmt.fmt.pix.width == 0 || fmt.fmt.pix.height == 0)
     goto invalid_dimensions;
 
+  if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY)
+  {
+    self->v4l2output->stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
+    //because driver return src w,h when AFBC_ONLY
+    fmt.fmt.pix.width = fmt.fmt.pix.height = 64;
+    fmt.fmt.pix_mp.plane_fmt[0].bytesperline = fmt.fmt.pix_mp.plane_fmt[1].bytesperline = 64;
+  }
+
   width = fmt.fmt.pix.width;
   height = fmt.fmt.pix.height;
 
@@ -4978,8 +5003,6 @@
 
   if (r)
   {
-    GstAmlV4l2VideoDec *self = (GstAmlV4l2VideoDec*) v4l2object->element;
-
     align.padding_left = r->left;
     align.padding_top = r->top;
     align.padding_right = width - r->width - r->left;
diff --git a/src/gstamlv4l2object.h b/src/gstamlv4l2object.h
index 7d99876..1a7d447 100644
--- a/src/gstamlv4l2object.h
+++ b/src/gstamlv4l2object.h
@@ -209,6 +209,7 @@
   gboolean enable_cc_data;
   gboolean enable_nr;
   uint32_t dw_mode;
+  uint32_t stride;
 
   /* funcs */
   GstAmlV4l2GetInOutFunction get_in_out_func;
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index 232fd60..74a66e0 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -889,7 +889,7 @@
                  info.finfo->format, info.width, info.height, self->input_state);
   memset(&sel, 0, sizeof(struct v4l2_selection));
   sel.type = self->v4l2capture->type;
-  sel.target = V4L2_SEL_TGT_COMPOSE_DEFAULT;
+  sel.target = V4L2_SEL_TGT_CROP_DEFAULT;
   if (self->v4l2capture->ioctl(self->v4l2capture->video_fd, VIDIOC_G_SELECTION, &sel) >= 0)
   {
     r = &sel.r;
@@ -911,6 +911,8 @@
       gst_structure_set(s,"src_height",G_TYPE_INT,height,NULL);
       gst_structure_set(s,"width",G_TYPE_INT,info.width,NULL);
       gst_structure_set(s,"height",G_TYPE_INT,info.height,NULL);
+      gst_structure_set(s,"dw_mode",G_TYPE_INT,self->v4l2output->dw_mode,NULL);
+      gst_structure_set(s,"stride",G_TYPE_INT,self->v4l2output->stride,NULL);
       GST_DEBUG_OBJECT(self, "output_state->caps: %" GST_PTR_FORMAT, output_state->caps);
       gst_aml_video_codec_state_unref(output_state);
     }