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