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);
}