v4l2dec: refine dw logic [1/1]

PD#SWPL-195576

Problem:
It is not reasonable to use the output to determine whether dw is 0,
which will lead to error buffer size.
The capture should be used instead.

Solution:
Use the capture's dw to determine

Verify:
bp201

Change-Id: If71cd884fe10014cee546b74c121f56562b315a6
Signed-off-by: hanghang.luo <hanghang.luo@amlogic.com>
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 1191018..7ae55bb 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -4498,9 +4498,9 @@
                    is_mplane ? format.fmt.pix_mp.num_planes : 1,
                    colorspace, range, matrix, transfer);
 
-  if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY)
+  if (v4l2object->dw_mode == VDEC_DW_AFBC_ONLY)
   {
-    self->v4l2output->stride = format.fmt.pix_mp.plane_fmt[0].bytesperline;
+    v4l2object->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;
@@ -5021,7 +5021,22 @@
   if (fmt.fmt.pix.width == 0 || fmt.fmt.pix.height == 0)
     goto invalid_dimensions;
 
-  if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY)
+  switch (fmt.fmt.pix.field)
+  {
+    case V4L2_FIELD_ANY:
+    case V4L2_FIELD_NONE:
+      info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+      break;
+    case V4L2_FIELD_INTERLACED:
+    case V4L2_FIELD_INTERLACED_TB:
+    case V4L2_FIELD_INTERLACED_BT:
+      info->interlace_mode = GST_VIDEO_INTERLACE_MODE_INTERLEAVED;
+      break;
+    default:
+      goto unsupported_field;
+  }
+
+  if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY && info->interlace_mode != GST_VIDEO_INTERLACE_MODE_INTERLEAVED)
   {
     self->v4l2output->stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
     //because driver return src w,h when AFBC_ONLY
@@ -5064,7 +5079,7 @@
       height = (height/2) *2; // align for dw
     }
 
-    if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY)
+    if (self->v4l2output->dw_mode == VDEC_DW_AFBC_ONLY && info->interlace_mode != GST_VIDEO_INTERLACE_MODE_INTERLEAVED)
       height = width = 64; //because driver return src w,h when AFBC_ONLY
   }
   GST_DEBUG_OBJECT(v4l2object->dbg_obj, "final w:%d, h:%d", width, height);
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index 0bcfbb0..5a4421e 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -885,8 +885,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_structure_set(s,"dw_mode",G_TYPE_INT,self->v4l2capture->dw_mode,NULL);
+      gst_structure_set(s,"stride",G_TYPE_INT,self->v4l2capture->stride,NULL);
       GST_DEBUG_OBJECT(self, "output_state->caps: %" GST_PTR_FORMAT, output_state->caps);
       gst_aml_video_codec_state_unref(output_state);
     }